From c81ee3b5be8b7cf3d78ca528c2f2890b070e3334 Mon Sep 17 00:00:00 2001 From: Felix Faire Date: Thu, 30 Oct 2014 12:59:58 +0000 Subject: [PATCH] Added AudioAppExample file in examples --- .../AudioAppExample/AudioAppExample.jucer | 104 + .../AudioAppExample.xcodeproj/project.pbxproj | 2152 +++ .../AudioAppExample/Builds/MacOSX/Info.plist | 27 + .../Builds/MacOSX/RecentFilesMenuTemplate.nib | Bin 0 -> 2842 bytes .../AudioAppExample.app/Contents/Info.plist | 40 + .../Contents/MacOS/AudioAppExample | Bin 0 -> 17813508 bytes .../AudioAppExample.app/Contents/PkgInfo | 1 + .../Resources/RecentFilesMenuTemplate.nib | Bin 0 -> 2842 bytes .../VisualStudio2010/AudioAppExample.sln | 19 + .../VisualStudio2010/AudioAppExample.vcxproj | 1725 ++ .../AudioAppExample.vcxproj.filters | 2951 +++ .../Builds/VisualStudio2010/resources.rc | 29 + .../AudioAppExample.xcodeproj/project.pbxproj | 2142 +++ .../AppIcon.appiconset/Contents.json | 58 + .../LaunchImage.launchimage/Contents.json | 50 + .../AudioAppExample/Builds/iOS/Info.plist | 29 + .../JuceLibraryCode/AppConfig.h | 197 + .../JuceLibraryCode/JuceHeader.h | 47 + .../JuceLibraryCode/ReadMe.txt | 12 + .../buffers/juce_AudioDataConverters.cpp | 600 + .../buffers/juce_AudioDataConverters.h | 710 + .../buffers/juce_AudioSampleBuffer.cpp | 670 + .../buffers/juce_AudioSampleBuffer.h | 526 + .../buffers/juce_FloatVectorOperations.cpp | 893 + .../buffers/juce_FloatVectorOperations.h | 162 + .../juce_audio_basics/effects/juce_Decibels.h | 104 + .../effects/juce_IIRFilter.cpp | 244 + .../effects/juce_IIRFilter.h | 174 + .../effects/juce_LagrangeInterpolator.cpp | 200 + .../effects/juce_LagrangeInterpolator.h | 94 + .../juce_audio_basics/effects/juce_Reverb.h | 323 + .../juce_audio_basics/juce_audio_basics.cpp | 94 + .../juce_audio_basics/juce_audio_basics.h | 59 + .../juce_audio_basics/juce_audio_basics.mm | 25 + .../juce_audio_basics/juce_module_info | 24 + .../midi/juce_MidiBuffer.cpp | 229 + .../juce_audio_basics/midi/juce_MidiBuffer.h | 235 + .../juce_audio_basics/midi/juce_MidiFile.cpp | 428 + .../juce_audio_basics/midi/juce_MidiFile.h | 180 + .../midi/juce_MidiKeyboardState.cpp | 183 + .../midi/juce_MidiKeyboardState.h | 205 + .../midi/juce_MidiMessage.cpp | 1094 ++ .../juce_audio_basics/midi/juce_MidiMessage.h | 903 + .../midi/juce_MidiMessageSequence.cpp | 331 + .../midi/juce_MidiMessageSequence.h | 265 + .../sources/juce_AudioSource.h | 181 + .../sources/juce_BufferingAudioSource.cpp | 259 + .../sources/juce_BufferingAudioSource.h | 111 + .../juce_ChannelRemappingAudioSource.cpp | 184 + .../juce_ChannelRemappingAudioSource.h | 143 + .../sources/juce_IIRFilterAudioSource.cpp | 77 + .../sources/juce_IIRFilterAudioSource.h | 70 + .../sources/juce_MixerAudioSource.cpp | 155 + .../sources/juce_MixerAudioSource.h | 101 + .../sources/juce_PositionableAudioSource.h | 78 + .../sources/juce_ResamplingAudioSource.cpp | 261 + .../sources/juce_ResamplingAudioSource.h | 107 + .../sources/juce_ReverbAudioSource.cpp | 80 + .../sources/juce_ReverbAudioSource.h | 76 + .../sources/juce_ToneGeneratorAudioSource.cpp | 75 + .../sources/juce_ToneGeneratorAudioSource.h | 73 + .../synthesisers/juce_Synthesiser.cpp | 503 + .../synthesisers/juce_Synthesiser.h | 557 + .../audio_cd/juce_AudioCDBurner.h | 169 + .../audio_cd/juce_AudioCDReader.cpp | 57 + .../audio_cd/juce_AudioCDReader.h | 174 + .../audio_io/juce_AudioDeviceManager.cpp | 987 + .../audio_io/juce_AudioDeviceManager.h | 512 + .../audio_io/juce_AudioIODevice.cpp | 41 + .../audio_io/juce_AudioIODevice.h | 309 + .../audio_io/juce_AudioIODeviceType.cpp | 78 + .../audio_io/juce_AudioIODeviceType.h | 182 + .../audio_io/juce_SystemAudioVolume.h | 61 + .../juce_audio_devices/juce_audio_devices.cpp | 227 + .../juce_audio_devices/juce_audio_devices.h | 117 + .../juce_audio_devices/juce_audio_devices.mm | 25 + .../juce_audio_devices/juce_module_info | 28 + .../midi_io/juce_MidiInput.h | 182 + .../midi_io/juce_MidiMessageCollector.cpp | 153 + .../midi_io/juce_MidiMessageCollector.h | 104 + .../midi_io/juce_MidiOutput.cpp | 162 + .../midi_io/juce_MidiOutput.h | 147 + .../native/juce_MidiDataConcatenator.h | 187 + .../native/juce_android_Audio.cpp | 450 + .../native/juce_android_Midi.cpp | 85 + .../native/juce_android_OpenSL.cpp | 632 + .../native/juce_ios_Audio.cpp | 576 + .../native/juce_linux_ALSA.cpp | 1243 ++ .../native/juce_linux_AudioCDReader.cpp | 77 + .../native/juce_linux_JackAudio.cpp | 604 + .../native/juce_linux_Midi.cpp | 612 + .../native/juce_mac_AudioCDBurner.mm | 455 + .../native/juce_mac_AudioCDReader.mm | 261 + .../native/juce_mac_CoreAudio.cpp | 1945 ++ .../native/juce_mac_CoreMidi.cpp | 530 + .../native/juce_win32_ASIO.cpp | 1630 ++ .../native/juce_win32_AudioCDBurner.cpp | 411 + .../native/juce_win32_AudioCDReader.cpp | 1309 ++ .../native/juce_win32_DirectSound.cpp | 1277 ++ .../native/juce_win32_Midi.cpp | 489 + .../native/juce_win32_WASAPI.cpp | 1509 ++ .../sources/juce_AudioSourcePlayer.cpp | 182 + .../sources/juce_AudioSourcePlayer.h | 115 + .../sources/juce_AudioTransportSource.cpp | 298 + .../sources/juce_AudioTransportSource.h | 180 + .../codecs/flac/Flac Licence.txt | 49 + .../juce_audio_formats/codecs/flac/all.h | 371 + .../juce_audio_formats/codecs/flac/alloc.h | 209 + .../juce_audio_formats/codecs/flac/assert.h | 46 + .../juce_audio_formats/codecs/flac/callback.h | 185 + .../juce_audio_formats/codecs/flac/compat.h | 195 + .../juce_audio_formats/codecs/flac/endswap.h | 52 + .../juce_audio_formats/codecs/flac/export.h | 97 + .../juce_audio_formats/codecs/flac/format.h | 1023 + .../codecs/flac/libFLAC/bitmath.c | 110 + .../codecs/flac/libFLAC/bitreader.c | 1062 ++ .../codecs/flac/libFLAC/bitwriter.c | 868 + .../codecs/flac/libFLAC/cpu.c | 419 + .../codecs/flac/libFLAC/crc.c | 143 + .../codecs/flac/libFLAC/fixed.c | 431 + .../codecs/flac/libFLAC/float.c | 302 + .../codecs/flac/libFLAC/format.c | 589 + .../codecs/flac/libFLAC/include/private/all.h | 50 + .../flac/libFLAC/include/private/bitmath.h | 171 + .../flac/libFLAC/include/private/bitreader.h | 100 + .../flac/libFLAC/include/private/bitwriter.h | 104 + .../codecs/flac/libFLAC/include/private/cpu.h | 89 + .../codecs/flac/libFLAC/include/private/crc.h | 62 + .../flac/libFLAC/include/private/fixed.h | 98 + .../flac/libFLAC/include/private/float.h | 98 + .../flac/libFLAC/include/private/format.h | 45 + .../codecs/flac/libFLAC/include/private/lpc.h | 215 + .../codecs/flac/libFLAC/include/private/md5.h | 44 + .../flac/libFLAC/include/private/memory.h | 58 + .../flac/libFLAC/include/private/metadata.h | 46 + .../include/private/stream_encoder_framing.h | 46 + .../flac/libFLAC/include/private/window.h | 72 + .../flac/libFLAC/include/protected/all.h | 39 + .../include/protected/stream_decoder.h | 59 + .../include/protected/stream_encoder.h | 111 + .../codecs/flac/libFLAC/lpc_flac.c | 1352 ++ .../codecs/flac/libFLAC/md5.c | 421 + .../codecs/flac/libFLAC/memory.c | 231 + .../codecs/flac/libFLAC/stream_decoder.c | 3372 ++++ .../codecs/flac/libFLAC/stream_encoder.c | 4336 +++++ .../flac/libFLAC/stream_encoder_framing.c | 549 + .../codecs/flac/libFLAC/window_flac.c | 226 + .../juce_audio_formats/codecs/flac/metadata.h | 2182 +++ .../juce_audio_formats/codecs/flac/ordinals.h | 86 + .../codecs/flac/stream_decoder.h | 1560 ++ .../codecs/flac/stream_encoder.h | 1769 ++ .../codecs/juce_AiffAudioFormat.cpp | 954 + .../codecs/juce_AiffAudioFormat.h | 84 + .../codecs/juce_CoreAudioFormat.cpp | 528 + .../codecs/juce_CoreAudioFormat.h | 77 + .../codecs/juce_FlacAudioFormat.cpp | 556 + .../codecs/juce_FlacAudioFormat.h | 65 + .../codecs/juce_LAMEEncoderAudioFormat.cpp | 222 + .../codecs/juce_LAMEEncoderAudioFormat.h | 71 + .../codecs/juce_MP3AudioFormat.cpp | 3162 ++++ .../codecs/juce_MP3AudioFormat.h | 64 + .../codecs/juce_OggVorbisAudioFormat.cpp | 532 + .../codecs/juce_OggVorbisAudioFormat.h | 93 + .../codecs/juce_QuickTimeAudioFormat.cpp | 391 + .../codecs/juce_QuickTimeAudioFormat.h | 69 + .../codecs/juce_WavAudioFormat.cpp | 1471 ++ .../codecs/juce_WavAudioFormat.h | 171 + .../codecs/juce_WindowsMediaAudioFormat.cpp | 350 + .../codecs/juce_WindowsMediaAudioFormat.h | 53 + .../codecs/oggvorbis/Ogg Vorbis Licence.txt | 47 + .../codecs/oggvorbis/bitwise.c | 784 + .../codecs/oggvorbis/codec.h | 242 + .../codecs/oggvorbis/config_types.h | 10 + .../codecs/oggvorbis/framing.c | 1796 ++ .../codecs/oggvorbis/libvorbis-1.3.2/AUTHORS | 3 + .../codecs/oggvorbis/libvorbis-1.3.2/CHANGES | 126 + .../codecs/oggvorbis/libvorbis-1.3.2/COPYING | 28 + .../codecs/oggvorbis/libvorbis-1.3.2/README | 134 + .../oggvorbis/libvorbis-1.3.2/lib/analysis.c | 109 + .../oggvorbis/libvorbis-1.3.2/lib/backends.h | 144 + .../oggvorbis/libvorbis-1.3.2/lib/bitrate.c | 253 + .../oggvorbis/libvorbis-1.3.2/lib/bitrate.h | 59 + .../oggvorbis/libvorbis-1.3.2/lib/block.c | 1033 + .../lib/books/coupled/res_books_51.h | 12256 ++++++++++++ .../lib/books/coupled/res_books_stereo.h | 15782 ++++++++++++++++ .../lib/books/floor/floor_books.h | 1546 ++ .../lib/books/uncoupled/res_books_uncoupled.h | 7757 ++++++++ .../oggvorbis/libvorbis-1.3.2/lib/codebook.c | 479 + .../oggvorbis/libvorbis-1.3.2/lib/codebook.h | 119 + .../libvorbis-1.3.2/lib/codec_internal.h | 187 + .../oggvorbis/libvorbis-1.3.2/lib/envelope.c | 375 + .../oggvorbis/libvorbis-1.3.2/lib/envelope.h | 80 + .../oggvorbis/libvorbis-1.3.2/lib/floor0.c | 223 + .../oggvorbis/libvorbis-1.3.2/lib/floor1.c | 1080 ++ .../oggvorbis/libvorbis-1.3.2/lib/highlevel.h | 58 + .../oggvorbis/libvorbis-1.3.2/lib/info.c | 660 + .../oggvorbis/libvorbis-1.3.2/lib/lookup.c | 94 + .../oggvorbis/libvorbis-1.3.2/lib/lookup.h | 32 + .../libvorbis-1.3.2/lib/lookup_data.h | 192 + .../oggvorbis/libvorbis-1.3.2/lib/lpc.c | 160 + .../oggvorbis/libvorbis-1.3.2/lib/lpc.h | 29 + .../oggvorbis/libvorbis-1.3.2/lib/lsp.c | 454 + .../oggvorbis/libvorbis-1.3.2/lib/lsp.h | 28 + .../oggvorbis/libvorbis-1.3.2/lib/mapping0.c | 816 + .../oggvorbis/libvorbis-1.3.2/lib/masking.h | 785 + .../oggvorbis/libvorbis-1.3.2/lib/mdct.c | 563 + .../oggvorbis/libvorbis-1.3.2/lib/mdct.h | 71 + .../oggvorbis/libvorbis-1.3.2/lib/misc.h | 53 + .../libvorbis-1.3.2/lib/modes/floor_all.h | 260 + .../libvorbis-1.3.2/lib/modes/psych_11.h | 50 + .../libvorbis-1.3.2/lib/modes/psych_16.h | 133 + .../libvorbis-1.3.2/lib/modes/psych_44.h | 642 + .../libvorbis-1.3.2/lib/modes/psych_8.h | 101 + .../libvorbis-1.3.2/lib/modes/residue_16.h | 163 + .../libvorbis-1.3.2/lib/modes/residue_44.h | 292 + .../libvorbis-1.3.2/lib/modes/residue_44p51.h | 451 + .../libvorbis-1.3.2/lib/modes/residue_44u.h | 318 + .../libvorbis-1.3.2/lib/modes/residue_8.h | 109 + .../libvorbis-1.3.2/lib/modes/setup_11.h | 143 + .../libvorbis-1.3.2/lib/modes/setup_16.h | 153 + .../libvorbis-1.3.2/lib/modes/setup_22.h | 128 + .../libvorbis-1.3.2/lib/modes/setup_32.h | 132 + .../libvorbis-1.3.2/lib/modes/setup_44.h | 117 + .../libvorbis-1.3.2/lib/modes/setup_44p51.h | 74 + .../libvorbis-1.3.2/lib/modes/setup_44u.h | 74 + .../libvorbis-1.3.2/lib/modes/setup_8.h | 149 + .../libvorbis-1.3.2/lib/modes/setup_X.h | 225 + .../codecs/oggvorbis/libvorbis-1.3.2/lib/os.h | 186 + .../oggvorbis/libvorbis-1.3.2/lib/psy.c | 1205 ++ .../oggvorbis/libvorbis-1.3.2/lib/psy.h | 154 + .../oggvorbis/libvorbis-1.3.2/lib/registry.c | 45 + .../oggvorbis/libvorbis-1.3.2/lib/registry.h | 32 + .../oggvorbis/libvorbis-1.3.2/lib/res0.c | 891 + .../oggvorbis/libvorbis-1.3.2/lib/scales.h | 90 + .../libvorbis-1.3.2/lib/sharedbook.c | 581 + .../oggvorbis/libvorbis-1.3.2/lib/smallft.c | 1255 ++ .../oggvorbis/libvorbis-1.3.2/lib/smallft.h | 34 + .../oggvorbis/libvorbis-1.3.2/lib/synthesis.c | 184 + .../oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c | 1215 ++ .../libvorbis-1.3.2/lib/vorbisfile.c | 2338 +++ .../oggvorbis/libvorbis-1.3.2/lib/window.c | 2135 +++ .../oggvorbis/libvorbis-1.3.2/lib/window.h | 26 + .../juce_audio_formats/codecs/oggvorbis/ogg.h | 206 + .../codecs/oggvorbis/os_types.h | 127 + .../codecs/oggvorbis/vorbisenc.h | 436 + .../codecs/oggvorbis/vorbisfile.h | 205 + .../format/juce_AudioFormat.cpp | 56 + .../format/juce_AudioFormat.h | 178 + .../format/juce_AudioFormatManager.cpp | 177 + .../format/juce_AudioFormatManager.h | 143 + .../format/juce_AudioFormatReader.cpp | 412 + .../format/juce_AudioFormatReader.h | 300 + .../format/juce_AudioFormatReaderSource.cpp | 85 + .../format/juce_AudioFormatReaderSource.h | 100 + .../format/juce_AudioFormatWriter.cpp | 342 + .../format/juce_AudioFormatWriter.h | 274 + .../format/juce_AudioSubsectionReader.cpp | 73 + .../format/juce_AudioSubsectionReader.h | 84 + .../juce_BufferingAudioFormatReader.cpp | 172 + .../format/juce_BufferingAudioFormatReader.h | 93 + .../juce_MemoryMappedAudioFormatReader.h | 106 + .../juce_audio_formats/juce_audio_formats.cpp | 121 + .../juce_audio_formats/juce_audio_formats.h | 110 + .../juce_audio_formats/juce_audio_formats.mm | 25 + .../juce_audio_formats/juce_module_info | 22 + .../sampler/juce_Sampler.cpp | 224 + .../juce_audio_formats/sampler/juce_Sampler.h | 146 + .../format/juce_AudioPluginFormat.cpp | 26 + .../format/juce_AudioPluginFormat.h | 112 + .../format/juce_AudioPluginFormatManager.cpp | 104 + .../format/juce_AudioPluginFormatManager.h | 99 + .../format_types/juce_AudioUnitPluginFormat.h | 55 + .../juce_AudioUnitPluginFormat.mm | 1738 ++ .../format_types/juce_LADSPAPluginFormat.cpp | 703 + .../format_types/juce_LADSPAPluginFormat.h | 57 + .../format_types/juce_VST3Common.h | 420 + .../format_types/juce_VST3Headers.h | 172 + .../format_types/juce_VST3PluginFormat.cpp | 2517 +++ .../format_types/juce_VST3PluginFormat.h | 72 + .../format_types/juce_VSTMidiEventList.h | 187 + .../format_types/juce_VSTPluginFormat.cpp | 2889 +++ .../format_types/juce_VSTPluginFormat.h | 113 + .../juce_audio_processors.cpp | 158 + .../juce_audio_processors.h | 98 + .../juce_audio_processors.mm | 25 + .../juce_audio_processors/juce_module_info | 25 + .../processors/juce_AudioPlayHead.h | 140 + .../processors/juce_AudioPluginInstance.h | 86 + .../processors/juce_AudioProcessor.cpp | 474 + .../processors/juce_AudioProcessor.h | 689 + .../processors/juce_AudioProcessorEditor.cpp | 43 + .../processors/juce_AudioProcessorEditor.h | 92 + .../processors/juce_AudioProcessorGraph.cpp | 1531 ++ .../processors/juce_AudioProcessorGraph.h | 413 + .../processors/juce_AudioProcessorListener.h | 106 + .../processors/juce_AudioProcessorParameter.h | 158 + .../juce_GenericAudioProcessorEditor.cpp | 172 + .../juce_GenericAudioProcessorEditor.h | 58 + .../processors/juce_PluginDescription.cpp | 140 + .../processors/juce_PluginDescription.h | 151 + .../scanning/juce_KnownPluginList.cpp | 549 + .../scanning/juce_KnownPluginList.h | 223 + .../scanning/juce_PluginDirectoryScanner.cpp | 136 + .../scanning/juce_PluginDirectoryScanner.h | 127 + .../scanning/juce_PluginListComponent.cpp | 554 + .../scanning/juce_PluginListComponent.h | 114 + .../gui/juce_AudioAppComponent.cpp | 50 + .../gui/juce_AudioAppComponent.h | 117 + .../gui/juce_AudioDeviceSelectorComponent.cpp | 1161 ++ .../gui/juce_AudioDeviceSelectorComponent.h | 113 + .../gui/juce_AudioThumbnail.cpp | 820 + .../gui/juce_AudioThumbnail.h | 227 + .../gui/juce_AudioThumbnailBase.h | 155 + .../gui/juce_AudioThumbnailCache.cpp | 191 + .../gui/juce_AudioThumbnailCache.h | 118 + .../gui/juce_MidiKeyboardComponent.cpp | 893 + .../gui/juce_MidiKeyboardComponent.h | 409 + .../juce_audio_utils/juce_audio_utils.cpp | 51 + .../juce_audio_utils/juce_audio_utils.h | 47 + .../juce_audio_utils/juce_audio_utils.mm | 25 + .../modules/juce_audio_utils/juce_module_info | 21 + .../players/juce_AudioProcessorPlayer.cpp | 183 + .../players/juce_AudioProcessorPlayer.h | 97 + .../containers/juce_AbstractFifo.cpp | 235 + .../juce_core/containers/juce_AbstractFifo.h | 220 + .../modules/juce_core/containers/juce_Array.h | 1112 ++ .../containers/juce_ArrayAllocationBase.h | 138 + .../containers/juce_DynamicObject.cpp | 133 + .../juce_core/containers/juce_DynamicObject.h | 139 + .../containers/juce_ElementComparator.h | 195 + .../juce_core/containers/juce_HashMap.h | 455 + .../containers/juce_LinkedListPointer.h | 371 + .../containers/juce_NamedValueSet.cpp | 270 + .../juce_core/containers/juce_NamedValueSet.h | 145 + .../juce_core/containers/juce_OwnedArray.h | 897 + .../juce_core/containers/juce_PropertySet.cpp | 219 + .../juce_core/containers/juce_PropertySet.h | 211 + .../containers/juce_ReferenceCountedArray.h | 897 + .../containers/juce_ScopedValueSetter.h | 100 + .../juce_core/containers/juce_SortedSet.h | 494 + .../juce_core/containers/juce_SparseSet.h | 298 + .../juce_core/containers/juce_Variant.cpp | 780 + .../juce_core/containers/juce_Variant.h | 327 + .../files/juce_DirectoryIterator.cpp | 159 + .../juce_core/files/juce_DirectoryIterator.h | 159 + .../modules/juce_core/files/juce_File.cpp | 1086 ++ .../modules/juce_core/files/juce_File.h | 973 + .../juce_core/files/juce_FileFilter.cpp | 41 + .../modules/juce_core/files/juce_FileFilter.h | 77 + .../juce_core/files/juce_FileInputStream.cpp | 84 + .../juce_core/files/juce_FileInputStream.h | 96 + .../juce_core/files/juce_FileOutputStream.cpp | 134 + .../juce_core/files/juce_FileOutputStream.h | 116 + .../juce_core/files/juce_FileSearchPath.cpp | 172 + .../juce_core/files/juce_FileSearchPath.h | 165 + .../juce_core/files/juce_MemoryMappedFile.h | 115 + .../juce_core/files/juce_TemporaryFile.cpp | 117 + .../juce_core/files/juce_TemporaryFile.h | 169 + .../files/juce_WildcardFileFilter.cpp | 76 + .../juce_core/files/juce_WildcardFileFilter.h | 82 + .../juce_core/javascript/juce_JSON.cpp | 643 + .../modules/juce_core/javascript/juce_JSON.h | 136 + .../juce_core/javascript/juce_Javascript.cpp | 1725 ++ .../juce_core/javascript/juce_Javascript.h | 108 + .../modules/juce_core/juce_core.cpp | 226 + .../modules/juce_core/juce_core.h | 285 + .../modules/juce_core/juce_core.mm | 29 + .../modules/juce_core/juce_module_info | 38 + .../juce_core/logging/juce_FileLogger.cpp | 134 + .../juce_core/logging/juce_FileLogger.h | 135 + .../modules/juce_core/logging/juce_Logger.cpp | 63 + .../modules/juce_core/logging/juce_Logger.h | 97 + .../juce_core/maths/juce_BigInteger.cpp | 1014 + .../modules/juce_core/maths/juce_BigInteger.h | 334 + .../juce_core/maths/juce_Expression.cpp | 1183 ++ .../modules/juce_core/maths/juce_Expression.h | 270 + .../juce_core/maths/juce_MathsFunctions.h | 549 + .../juce_core/maths/juce_NormalisableRange.h | 169 + .../modules/juce_core/maths/juce_Random.cpp | 189 + .../modules/juce_core/maths/juce_Random.h | 143 + .../modules/juce_core/maths/juce_Range.h | 304 + .../modules/juce_core/memory/juce_Atomic.h | 399 + .../modules/juce_core/memory/juce_ByteOrder.h | 196 + .../memory/juce_ContainerDeletePolicy.h | 53 + .../modules/juce_core/memory/juce_HeapBlock.h | 308 + .../memory/juce_LeakedObjectDetector.h | 146 + .../modules/juce_core/memory/juce_Memory.h | 126 + .../juce_core/memory/juce_MemoryBlock.cpp | 416 + .../juce_core/memory/juce_MemoryBlock.h | 253 + .../memory/juce_OptionalScopedPointer.h | 186 + .../memory/juce_ReferenceCountedObject.h | 415 + .../juce_core/memory/juce_ScopedPointer.h | 253 + .../memory/juce_SharedResourcePointer.h | 152 + .../modules/juce_core/memory/juce_Singleton.h | 292 + .../juce_core/memory/juce_WeakReference.h | 212 + .../modules/juce_core/misc/juce_Result.cpp | 83 + .../modules/juce_core/misc/juce_Result.h | 125 + .../modules/juce_core/misc/juce_Uuid.cpp | 117 + .../modules/juce_core/misc/juce_Uuid.h | 121 + .../juce_core/misc/juce_WindowsRegistry.h | 141 + .../native/java/JuceAppActivity.java | 746 + .../native/juce_BasicNativeHeaders.h | 223 + .../juce_core/native/juce_android_Files.cpp | 104 + .../native/juce_android_JNIHelpers.h | 428 + .../juce_core/native/juce_android_Misc.cpp | 32 + .../juce_core/native/juce_android_Network.cpp | 181 + .../native/juce_android_SystemStats.cpp | 315 + .../juce_core/native/juce_android_Threads.cpp | 76 + .../native/juce_linux_CommonFile.cpp | 153 + .../juce_core/native/juce_linux_Files.cpp | 241 + .../juce_core/native/juce_linux_Network.cpp | 445 + .../native/juce_linux_SystemStats.cpp | 191 + .../juce_core/native/juce_linux_Threads.cpp | 90 + .../juce_core/native/juce_mac_Files.mm | 498 + .../juce_core/native/juce_mac_Network.mm | 445 + .../juce_core/native/juce_mac_Strings.mm | 96 + .../juce_core/native/juce_mac_SystemStats.mm | 306 + .../juce_core/native/juce_mac_Threads.mm | 97 + .../juce_core/native/juce_osx_ObjCHelpers.h | 169 + .../juce_core/native/juce_posix_NamedPipe.cpp | 224 + .../juce_core/native/juce_posix_SharedCode.h | 1308 ++ .../juce_core/native/juce_win32_ComSmartPtr.h | 170 + .../juce_core/native/juce_win32_Files.cpp | 999 + .../juce_core/native/juce_win32_Network.cpp | 506 + .../juce_core/native/juce_win32_Registry.cpp | 227 + .../native/juce_win32_SystemStats.cpp | 459 + .../juce_core/native/juce_win32_Threads.cpp | 625 + .../juce_core/network/juce_IPAddress.cpp | 149 + .../juce_core/network/juce_IPAddress.h | 82 + .../juce_core/network/juce_MACAddress.cpp | 78 + .../juce_core/network/juce_MACAddress.h | 82 + .../juce_core/network/juce_NamedPipe.cpp | 66 + .../juce_core/network/juce_NamedPipe.h | 104 + .../modules/juce_core/network/juce_Socket.cpp | 601 + .../modules/juce_core/network/juce_Socket.h | 305 + .../modules/juce_core/network/juce_URL.cpp | 502 + .../modules/juce_core/network/juce_URL.h | 378 + .../streams/juce_BufferedInputStream.cpp | 198 + .../streams/juce_BufferedInputStream.h | 92 + .../streams/juce_FileInputSource.cpp | 56 + .../juce_core/streams/juce_FileInputSource.h | 66 + .../juce_core/streams/juce_InputSource.h | 78 + .../juce_core/streams/juce_InputStream.cpp | 236 + .../juce_core/streams/juce_InputStream.h | 266 + .../streams/juce_MemoryInputStream.cpp | 159 + .../streams/juce_MemoryInputStream.h | 97 + .../streams/juce_MemoryOutputStream.cpp | 214 + .../streams/juce_MemoryOutputStream.h | 139 + .../juce_core/streams/juce_OutputStream.cpp | 351 + .../juce_core/streams/juce_OutputStream.h | 278 + .../streams/juce_SubregionStream.cpp | 82 + .../juce_core/streams/juce_SubregionStream.h | 88 + .../juce_core/system/juce_CompilerSupport.h | 147 + .../juce_core/system/juce_PlatformDefs.h | 339 + .../juce_core/system/juce_StandardHeader.h | 159 + .../juce_core/system/juce_SystemStats.cpp | 183 + .../juce_core/system/juce_SystemStats.h | 196 + .../juce_core/system/juce_TargetPlatform.h | 201 + .../juce_core/text/juce_CharPointer_ASCII.h | 387 + .../juce_core/text/juce_CharPointer_UTF16.h | 525 + .../juce_core/text/juce_CharPointer_UTF32.h | 378 + .../juce_core/text/juce_CharPointer_UTF8.h | 572 + .../text/juce_CharacterFunctions.cpp | 154 + .../juce_core/text/juce_CharacterFunctions.h | 629 + .../juce_core/text/juce_Identifier.cpp | 70 + .../modules/juce_core/text/juce_Identifier.h | 120 + .../juce_core/text/juce_LocalisedStrings.cpp | 209 + .../juce_core/text/juce_LocalisedStrings.h | 247 + .../modules/juce_core/text/juce_NewLine.h | 86 + .../modules/juce_core/text/juce_String.cpp | 2543 +++ .../modules/juce_core/text/juce_String.h | 1370 ++ .../juce_core/text/juce_StringArray.cpp | 485 + .../modules/juce_core/text/juce_StringArray.h | 421 + .../juce_core/text/juce_StringPairArray.cpp | 147 + .../juce_core/text/juce_StringPairArray.h | 157 + .../juce_core/text/juce_StringPool.cpp | 166 + .../modules/juce_core/text/juce_StringPool.h | 94 + .../modules/juce_core/text/juce_StringRef.h | 138 + .../modules/juce_core/text/juce_TextDiff.cpp | 247 + .../modules/juce_core/text/juce_TextDiff.h | 80 + .../juce_core/threads/juce_ChildProcess.cpp | 113 + .../juce_core/threads/juce_ChildProcess.h | 119 + .../juce_core/threads/juce_CriticalSection.h | 266 + .../juce_core/threads/juce_DynamicLibrary.h | 85 + .../threads/juce_HighResolutionTimer.cpp | 36 + .../threads/juce_HighResolutionTimer.h | 109 + .../juce_core/threads/juce_InterProcessLock.h | 128 + .../modules/juce_core/threads/juce_Process.h | 153 + .../juce_core/threads/juce_ReadWriteLock.cpp | 150 + .../juce_core/threads/juce_ReadWriteLock.h | 152 + .../juce_core/threads/juce_ScopedLock.h | 237 + .../juce_core/threads/juce_ScopedReadLock.h | 90 + .../juce_core/threads/juce_ScopedWriteLock.h | 90 + .../modules/juce_core/threads/juce_SpinLock.h | 91 + .../modules/juce_core/threads/juce_Thread.cpp | 371 + .../modules/juce_core/threads/juce_Thread.h | 289 + .../juce_core/threads/juce_ThreadLocalValue.h | 198 + .../juce_core/threads/juce_ThreadPool.cpp | 384 + .../juce_core/threads/juce_ThreadPool.h | 321 + .../threads/juce_TimeSliceThread.cpp | 171 + .../juce_core/threads/juce_TimeSliceThread.h | 149 + .../juce_core/threads/juce_WaitableEvent.h | 118 + .../time/juce_PerformanceCounter.cpp | 132 + .../juce_core/time/juce_PerformanceCounter.h | 127 + .../juce_core/time/juce_RelativeTime.cpp | 139 + .../juce_core/time/juce_RelativeTime.h | 184 + .../modules/juce_core/time/juce_Time.cpp | 469 + .../modules/juce_core/time/juce_Time.h | 404 + .../juce_core/unit_tests/juce_UnitTest.cpp | 260 + .../juce_core/unit_tests/juce_UnitTest.h | 311 + .../juce_core/xml/juce_XmlDocument.cpp | 891 + .../modules/juce_core/xml/juce_XmlDocument.h | 181 + .../modules/juce_core/xml/juce_XmlElement.cpp | 888 + .../modules/juce_core/xml/juce_XmlElement.h | 770 + .../zip/juce_GZIPCompressorOutputStream.cpp | 213 + .../zip/juce_GZIPCompressorOutputStream.h | 101 + .../zip/juce_GZIPDecompressorInputStream.cpp | 288 + .../zip/juce_GZIPDecompressorInputStream.h | 97 + .../modules/juce_core/zip/juce_ZipFile.cpp | 608 + .../modules/juce_core/zip/juce_ZipFile.h | 259 + .../modules/juce_core/zip/zlib/README | 125 + .../modules/juce_core/zip/zlib/adler32.c | 143 + .../modules/juce_core/zip/zlib/compress.c | 70 + .../modules/juce_core/zip/zlib/crc32.c | 407 + .../modules/juce_core/zip/zlib/crc32.h | 441 + .../modules/juce_core/zip/zlib/deflate.c | 1679 ++ .../modules/juce_core/zip/zlib/deflate.h | 333 + .../modules/juce_core/zip/zlib/infback.c | 611 + .../modules/juce_core/zip/zlib/inffast.c | 316 + .../modules/juce_core/zip/zlib/inffast.h | 11 + .../modules/juce_core/zip/zlib/inffixed.h | 94 + .../modules/juce_core/zip/zlib/inflate.c | 1339 ++ .../modules/juce_core/zip/zlib/inflate.h | 121 + .../modules/juce_core/zip/zlib/inftrees.c | 328 + .../modules/juce_core/zip/zlib/inftrees.h | 61 + .../modules/juce_core/zip/zlib/trees.c | 1191 ++ .../modules/juce_core/zip/zlib/trees.h | 127 + .../modules/juce_core/zip/zlib/uncompr.c | 60 + .../modules/juce_core/zip/zlib/zconf.h | 345 + .../modules/juce_core/zip/zlib/zconf.in.h | 332 + .../modules/juce_core/zip/zlib/zlib.h | 1358 ++ .../modules/juce_core/zip/zlib/zutil.c | 311 + .../modules/juce_core/zip/zlib/zutil.h | 271 + .../encryption/juce_BlowFish.cpp | 271 + .../encryption/juce_BlowFish.h | 72 + .../encryption/juce_Primes.cpp | 238 + .../encryption/juce_Primes.h | 73 + .../encryption/juce_RSAKey.cpp | 135 + .../encryption/juce_RSAKey.h | 174 + .../juce_cryptography/hashing/juce_MD5.cpp | 336 + .../juce_cryptography/hashing/juce_MD5.h | 119 + .../juce_cryptography/hashing/juce_SHA256.cpp | 275 + .../juce_cryptography/hashing/juce_SHA256.h | 107 + .../juce_cryptography/juce_cryptography.cpp | 49 + .../juce_cryptography/juce_cryptography.h | 42 + .../juce_cryptography/juce_cryptography.mm | 25 + .../juce_cryptography/juce_module_info | 18 + .../juce_ApplicationProperties.cpp | 102 + .../juce_ApplicationProperties.h | 132 + .../app_properties/juce_PropertiesFile.cpp | 355 + .../app_properties/juce_PropertiesFile.h | 247 + .../juce_data_structures.cpp | 49 + .../juce_data_structures.h | 43 + .../juce_data_structures.mm | 25 + .../juce_data_structures/juce_module_info | 20 + .../undomanager/juce_UndoManager.cpp | 303 + .../undomanager/juce_UndoManager.h | 239 + .../undomanager/juce_UndoableAction.h | 99 + .../values/juce_Value.cpp | 243 + .../juce_data_structures/values/juce_Value.h | 233 + .../values/juce_ValueTree.cpp | 1123 ++ .../values/juce_ValueTree.h | 531 + .../broadcasters/juce_ActionBroadcaster.cpp | 91 + .../broadcasters/juce_ActionBroadcaster.h | 83 + .../broadcasters/juce_ActionListener.h | 50 + .../broadcasters/juce_AsyncUpdater.cpp | 86 + .../broadcasters/juce_AsyncUpdater.h | 109 + .../broadcasters/juce_ChangeBroadcaster.cpp | 96 + .../broadcasters/juce_ChangeBroadcaster.h | 105 + .../broadcasters/juce_ChangeListener.h | 64 + .../broadcasters/juce_ListenerList.h | 359 + .../juce_ConnectedChildProcess.cpp | 264 + .../interprocess/juce_ConnectedChildProcess.h | 191 + .../juce_InterprocessConnection.cpp | 365 + .../juce_InterprocessConnection.h | 209 + .../juce_InterprocessConnectionServer.cpp | 73 + .../juce_InterprocessConnectionServer.h | 93 + .../modules/juce_events/juce_events.cpp | 103 + .../modules/juce_events/juce_events.h | 58 + .../modules/juce_events/juce_events.mm | 25 + .../modules/juce_events/juce_module_info | 23 + .../messages/juce_ApplicationBase.cpp | 294 + .../messages/juce_ApplicationBase.h | 283 + .../messages/juce_CallbackMessage.h | 73 + .../messages/juce_DeletedAtShutdown.cpp | 79 + .../messages/juce_DeletedAtShutdown.h | 68 + .../messages/juce_Initialisation.h | 112 + .../juce_events/messages/juce_Message.h | 65 + .../messages/juce_MessageListener.cpp | 49 + .../messages/juce_MessageListener.h | 72 + .../messages/juce_MessageManager.cpp | 375 + .../messages/juce_MessageManager.h | 335 + .../juce_MountedVolumeListChangeDetector.h | 59 + .../messages/juce_NotificationType.h | 42 + .../juce_events/native/juce_ScopedXLock.h | 50 + .../native/juce_android_Messaging.cpp | 79 + .../native/juce_ios_MessageManager.mm | 88 + .../native/juce_linux_Messaging.cpp | 398 + .../native/juce_mac_MessageManager.mm | 418 + .../native/juce_osx_MessageQueue.h | 103 + .../native/juce_win32_HiddenMessageWindow.h | 137 + .../native/juce_win32_Messaging.cpp | 217 + .../juce_events/timers/juce_MultiTimer.cpp | 105 + .../juce_events/timers/juce_MultiTimer.h | 126 + .../modules/juce_events/timers/juce_Timer.cpp | 350 + .../modules/juce_events/timers/juce_Timer.h | 134 + .../juce_graphics/colour/juce_Colour.cpp | 444 + .../juce_graphics/colour/juce_Colour.h | 360 + .../colour/juce_ColourGradient.cpp | 220 + .../colour/juce_ColourGradient.h | 181 + .../juce_graphics/colour/juce_Colours.cpp | 320 + .../juce_graphics/colour/juce_Colours.h | 107 + .../juce_graphics/colour/juce_FillType.cpp | 148 + .../juce_graphics/colour/juce_FillType.h | 149 + .../juce_graphics/colour/juce_PixelFormats.h | 604 + .../contexts/juce_GraphicsContext.cpp | 678 + .../contexts/juce_GraphicsContext.h | 730 + .../contexts/juce_LowLevelGraphicsContext.h | 101 + ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 533 + .../juce_LowLevelGraphicsPostScriptRenderer.h | 121 + .../juce_LowLevelGraphicsSoftwareRenderer.cpp | 38 + .../juce_LowLevelGraphicsSoftwareRenderer.h | 56 + .../effects/juce_DropShadowEffect.cpp | 182 + .../effects/juce_DropShadowEffect.h | 110 + .../juce_graphics/effects/juce_GlowEffect.cpp | 58 + .../juce_graphics/effects/juce_GlowEffect.h | 74 + .../effects/juce_ImageEffectFilter.h | 69 + .../fonts/juce_AttributedString.cpp | 232 + .../fonts/juce_AttributedString.h | 218 + .../fonts/juce_CustomTypeface.cpp | 406 + .../juce_graphics/fonts/juce_CustomTypeface.h | 164 + .../modules/juce_graphics/fonts/juce_Font.cpp | 720 + .../modules/juce_graphics/fonts/juce_Font.h | 460 + .../fonts/juce_GlyphArrangement.cpp | 798 + .../fonts/juce_GlyphArrangement.h | 319 + .../juce_graphics/fonts/juce_TextLayout.cpp | 620 + .../juce_graphics/fonts/juce_TextLayout.h | 177 + .../juce_graphics/fonts/juce_Typeface.cpp | 260 + .../juce_graphics/fonts/juce_Typeface.h | 161 + .../geometry/juce_AffineTransform.cpp | 262 + .../geometry/juce_AffineTransform.h | 285 + .../juce_graphics/geometry/juce_BorderSize.h | 153 + .../juce_graphics/geometry/juce_EdgeTable.cpp | 831 + .../juce_graphics/geometry/juce_EdgeTable.h | 220 + .../juce_graphics/geometry/juce_Line.h | 416 + .../juce_graphics/geometry/juce_Path.cpp | 1608 ++ .../juce_graphics/geometry/juce_Path.h | 792 + .../geometry/juce_PathIterator.cpp | 286 + .../geometry/juce_PathIterator.h | 113 + .../geometry/juce_PathStrokeType.cpp | 740 + .../geometry/juce_PathStrokeType.h | 204 + .../juce_graphics/geometry/juce_Point.h | 228 + .../juce_graphics/geometry/juce_Rectangle.h | 917 + .../geometry/juce_RectangleList.h | 648 + .../juce_graphics/image_formats/jpglib/README | 385 + .../image_formats/jpglib/cderror.h | 132 + .../jpglib/changes to libjpeg for JUCE.txt | 16 + .../image_formats/jpglib/jcapimin.c | 280 + .../image_formats/jpglib/jcapistd.c | 161 + .../image_formats/jpglib/jccoefct.c | 449 + .../image_formats/jpglib/jccolor.c | 459 + .../image_formats/jpglib/jcdctmgr.c | 387 + .../image_formats/jpglib/jchuff.c | 909 + .../image_formats/jpglib/jchuff.h | 52 + .../image_formats/jpglib/jcinit.c | 72 + .../image_formats/jpglib/jcmainct.c | 293 + .../image_formats/jpglib/jcmarker.c | 597 + .../image_formats/jpglib/jcmaster.c | 590 + .../image_formats/jpglib/jcomapi.c | 106 + .../image_formats/jpglib/jconfig.h | 57 + .../image_formats/jpglib/jcparam.c | 610 + .../image_formats/jpglib/jcphuff.c | 833 + .../image_formats/jpglib/jcprepct.c | 354 + .../image_formats/jpglib/jcsample.c | 519 + .../image_formats/jpglib/jctrans.c | 388 + .../image_formats/jpglib/jdapimin.c | 395 + .../image_formats/jpglib/jdapistd.c | 275 + .../image_formats/jpglib/jdatasrc.c | 212 + .../image_formats/jpglib/jdcoefct.c | 736 + .../image_formats/jpglib/jdcolor.c | 396 + .../juce_graphics/image_formats/jpglib/jdct.h | 182 + .../image_formats/jpglib/jddctmgr.c | 269 + .../image_formats/jpglib/jdhuff.c | 625 + .../image_formats/jpglib/jdhuff.h | 206 + .../image_formats/jpglib/jdinput.c | 381 + .../image_formats/jpglib/jdmainct.c | 512 + .../image_formats/jpglib/jdmarker.c | 1292 ++ .../image_formats/jpglib/jdmaster.c | 557 + .../image_formats/jpglib/jdmerge.c | 400 + .../image_formats/jpglib/jdphuff.c | 642 + .../image_formats/jpglib/jdpostct.c | 290 + .../image_formats/jpglib/jdsample.c | 478 + .../image_formats/jpglib/jdtrans.c | 143 + .../image_formats/jpglib/jerror.c | 252 + .../image_formats/jpglib/jerror.h | 291 + .../image_formats/jpglib/jfdctflt.c | 168 + .../image_formats/jpglib/jfdctfst.c | 224 + .../image_formats/jpglib/jfdctint.c | 283 + .../image_formats/jpglib/jidctflt.c | 242 + .../image_formats/jpglib/jidctfst.c | 368 + .../image_formats/jpglib/jidctint.c | 389 + .../image_formats/jpglib/jidctred.c | 398 + .../image_formats/jpglib/jinclude.h | 192 + .../image_formats/jpglib/jmemmgr.c | 1118 ++ .../image_formats/jpglib/jmemnobs.c | 109 + .../image_formats/jpglib/jmemsys.h | 203 + .../image_formats/jpglib/jmorecfg.h | 363 + .../image_formats/jpglib/jpegint.h | 392 + .../image_formats/jpglib/jpeglib.h | 1096 ++ .../image_formats/jpglib/jquant1.c | 856 + .../image_formats/jpglib/jquant2.c | 1310 ++ .../image_formats/jpglib/jutils.c | 179 + .../image_formats/jpglib/jversion.h | 14 + .../image_formats/jpglib/transupp.c | 928 + .../image_formats/jpglib/transupp.h | 135 + .../image_formats/juce_GIFLoader.cpp | 444 + .../image_formats/juce_JPEGLoader.cpp | 430 + .../image_formats/juce_PNGLoader.cpp | 546 + .../image_formats/pnglib/LICENSE | 109 + .../image_formats/pnglib/libpng_readme.txt | 2 + .../juce_graphics/image_formats/pnglib/png.c | 4295 +++++ .../juce_graphics/image_formats/pnglib/png.h | 3292 ++++ .../image_formats/pnglib/pngconf.h | 616 + .../image_formats/pnglib/pngerror.c | 932 + .../image_formats/pnglib/pngget.c | 1177 ++ .../image_formats/pnglib/pnginfo.h | 260 + .../image_formats/pnglib/pngmem.c | 277 + .../image_formats/pnglib/pngpread.c | 1291 ++ .../image_formats/pnglib/pngpriv.h | 1904 ++ .../image_formats/pnglib/pngread.c | 4000 ++++ .../image_formats/pnglib/pngrio.c | 118 + .../image_formats/pnglib/pngrtran.c | 5102 +++++ .../image_formats/pnglib/pngrutil.c | 4459 +++++ .../image_formats/pnglib/pngset.c | 1606 ++ .../image_formats/pnglib/pngstruct.h | 489 + .../image_formats/pnglib/pngtrans.c | 830 + .../image_formats/pnglib/pngwio.c | 164 + .../image_formats/pnglib/pngwrite.c | 2331 +++ .../image_formats/pnglib/pngwtran.c | 637 + .../image_formats/pnglib/pngwutil.c | 3020 +++ .../juce_graphics/images/juce_Image.cpp | 659 + .../modules/juce_graphics/images/juce_Image.h | 533 + .../juce_graphics/images/juce_ImageCache.cpp | 176 + .../juce_graphics/images/juce_ImageCache.h | 125 + .../images/juce_ImageConvolutionKernel.cpp | 290 + .../images/juce_ImageConvolutionKernel.h | 111 + .../images/juce_ImageFileFormat.cpp | 107 + .../images/juce_ImageFileFormat.h | 216 + .../modules/juce_graphics/juce_graphics.cpp | 171 + .../modules/juce_graphics/juce_graphics.h | 113 + .../modules/juce_graphics/juce_graphics.mm | 25 + .../modules/juce_graphics/juce_module_info | 30 + .../native/juce_RenderingHelpers.h | 2684 +++ .../native/juce_android_Fonts.cpp | 334 + .../native/juce_android_GraphicsContext.cpp | 60 + .../native/juce_freetype_Fonts.cpp | 455 + .../juce_graphics/native/juce_linux_Fonts.cpp | 180 + .../native/juce_mac_CoreGraphicsContext.h | 121 + .../native/juce_mac_CoreGraphicsContext.mm | 927 + .../native/juce_mac_CoreGraphicsHelpers.h | 60 + .../juce_graphics/native/juce_mac_Fonts.mm | 1321 ++ .../juce_win32_Direct2DGraphicsContext.cpp | 838 + .../juce_win32_DirectWriteTypeLayout.cpp | 436 + .../native/juce_win32_DirectWriteTypeface.cpp | 307 + .../juce_graphics/native/juce_win32_Fonts.cpp | 644 + .../placement/juce_Justification.h | 189 + .../placement/juce_RectanglePlacement.cpp | 127 + .../placement/juce_RectanglePlacement.h | 172 + .../application/juce_Application.cpp | 98 + .../application/juce_Application.h | 190 + .../buttons/juce_ArrowButton.cpp | 45 + .../buttons/juce_ArrowButton.h | 64 + .../juce_gui_basics/buttons/juce_Button.cpp | 674 + .../juce_gui_basics/buttons/juce_Button.h | 514 + .../buttons/juce_DrawableButton.cpp | 221 + .../buttons/juce_DrawableButton.h | 188 + .../buttons/juce_HyperlinkButton.cpp | 109 + .../buttons/juce_HyperlinkButton.h | 114 + .../buttons/juce_ImageButton.cpp | 189 + .../buttons/juce_ImageButton.h | 160 + .../buttons/juce_ShapeButton.cpp | 114 + .../buttons/juce_ShapeButton.h | 106 + .../buttons/juce_TextButton.cpp | 70 + .../juce_gui_basics/buttons/juce_TextButton.h | 113 + .../buttons/juce_ToggleButton.cpp | 54 + .../buttons/juce_ToggleButton.h | 87 + .../buttons/juce_ToolbarButton.cpp | 107 + .../buttons/juce_ToolbarButton.h | 97 + .../commands/juce_ApplicationCommandID.h | 91 + .../commands/juce_ApplicationCommandInfo.cpp | 60 + .../commands/juce_ApplicationCommandInfo.h | 189 + .../juce_ApplicationCommandManager.cpp | 312 + .../commands/juce_ApplicationCommandManager.h | 353 + .../juce_ApplicationCommandTarget.cpp | 186 + .../commands/juce_ApplicationCommandTarget.h | 245 + .../commands/juce_KeyPressMappingSet.cpp | 412 + .../commands/juce_KeyPressMappingSet.h | 245 + .../components/juce_CachedComponentImage.h | 70 + .../components/juce_Component.cpp | 3029 +++ .../components/juce_Component.h | 2378 +++ .../components/juce_ComponentListener.cpp | 31 + .../components/juce_ComponentListener.h | 111 + .../components/juce_Desktop.cpp | 415 + .../juce_gui_basics/components/juce_Desktop.h | 460 + .../components/juce_ModalComponentManager.cpp | 294 + .../components/juce_ModalComponentManager.h | 369 + .../drawables/juce_Drawable.cpp | 251 + .../juce_gui_basics/drawables/juce_Drawable.h | 259 + .../drawables/juce_DrawableComposite.cpp | 327 + .../drawables/juce_DrawableComposite.h | 156 + .../drawables/juce_DrawableImage.cpp | 289 + .../drawables/juce_DrawableImage.h | 138 + .../drawables/juce_DrawablePath.cpp | 570 + .../drawables/juce_DrawablePath.h | 145 + .../drawables/juce_DrawableRectangle.cpp | 182 + .../drawables/juce_DrawableRectangle.h | 103 + .../drawables/juce_DrawableShape.cpp | 472 + .../drawables/juce_DrawableShape.h | 182 + .../drawables/juce_DrawableText.cpp | 334 + .../drawables/juce_DrawableText.h | 155 + .../drawables/juce_SVGParser.cpp | 1325 ++ ...juce_DirectoryContentsDisplayComponent.cpp | 71 + .../juce_DirectoryContentsDisplayComponent.h | 111 + .../juce_DirectoryContentsList.cpp | 258 + .../filebrowser/juce_DirectoryContentsList.h | 223 + .../filebrowser/juce_FileBrowserComponent.cpp | 586 + .../filebrowser/juce_FileBrowserComponent.h | 290 + .../filebrowser/juce_FileBrowserListener.h | 57 + .../filebrowser/juce_FileChooser.cpp | 145 + .../filebrowser/juce_FileChooser.h | 197 + .../filebrowser/juce_FileChooserDialogBox.cpp | 269 + .../filebrowser/juce_FileChooserDialogBox.h | 157 + .../filebrowser/juce_FileListComponent.cpp | 257 + .../filebrowser/juce_FileListComponent.h | 96 + .../filebrowser/juce_FilePreviewComponent.h | 65 + .../juce_FileSearchPathListComponent.cpp | 264 + .../juce_FileSearchPathListComponent.h | 116 + .../filebrowser/juce_FileTreeComponent.cpp | 322 + .../filebrowser/juce_FileTreeComponent.h | 104 + .../filebrowser/juce_FilenameComponent.cpp | 267 + .../filebrowser/juce_FilenameComponent.h | 234 + .../juce_ImagePreviewComponent.cpp | 114 + .../filebrowser/juce_ImagePreviewComponent.h | 66 + .../juce_gui_basics/juce_gui_basics.cpp | 297 + .../modules/juce_gui_basics/juce_gui_basics.h | 247 + .../juce_gui_basics/juce_gui_basics.mm | 25 + .../modules/juce_gui_basics/juce_module_info | 40 + .../keyboard/juce_CaretComponent.cpp | 58 + .../keyboard/juce_CaretComponent.h | 80 + .../keyboard/juce_KeyListener.cpp | 28 + .../keyboard/juce_KeyListener.h | 76 + .../keyboard/juce_KeyPress.cpp | 299 + .../juce_gui_basics/keyboard/juce_KeyPress.h | 254 + .../keyboard/juce_KeyboardFocusTraverser.cpp | 135 + .../keyboard/juce_KeyboardFocusTraverser.h | 89 + .../keyboard/juce_ModifierKeys.cpp | 51 + .../keyboard/juce_ModifierKeys.h | 223 + .../keyboard/juce_SystemClipboard.h | 47 + .../keyboard/juce_TextEditorKeyMapper.h | 121 + .../keyboard/juce_TextInputTarget.h | 94 + .../layout/juce_AnimatedPosition.h | 209 + .../layout/juce_AnimatedPositionBehaviours.h | 151 + .../layout/juce_ComponentAnimator.cpp | 328 + .../layout/juce_ComponentAnimator.h | 161 + .../juce_ComponentBoundsConstrainer.cpp | 301 + .../layout/juce_ComponentBoundsConstrainer.h | 197 + .../layout/juce_ComponentBuilder.cpp | 280 + .../layout/juce_ComponentBuilder.h | 245 + .../layout/juce_ComponentMovementWatcher.cpp | 139 + .../layout/juce_ComponentMovementWatcher.h | 95 + .../layout/juce_ConcertinaPanel.cpp | 411 + .../layout/juce_ConcertinaPanel.h | 131 + .../layout/juce_GroupComponent.cpp | 66 + .../layout/juce_GroupComponent.h | 111 + .../layout/juce_MultiDocumentPanel.cpp | 507 + .../layout/juce_MultiDocumentPanel.h | 304 + .../layout/juce_ResizableBorderComponent.cpp | 201 + .../layout/juce_ResizableBorderComponent.h | 195 + .../layout/juce_ResizableCornerComponent.cpp | 99 + .../layout/juce_ResizableCornerComponent.h | 91 + .../layout/juce_ResizableEdgeComponent.cpp | 107 + .../layout/juce_ResizableEdgeComponent.h | 99 + .../juce_gui_basics/layout/juce_ScrollBar.cpp | 421 + .../juce_gui_basics/layout/juce_ScrollBar.h | 404 + .../layout/juce_StretchableLayoutManager.cpp | 342 + .../layout/juce_StretchableLayoutManager.h | 260 + .../juce_StretchableLayoutResizerBar.cpp | 73 + .../layout/juce_StretchableLayoutResizerBar.h | 104 + .../layout/juce_StretchableObjectResizer.cpp | 116 + .../layout/juce_StretchableObjectResizer.h | 101 + .../layout/juce_TabbedButtonBar.cpp | 579 + .../layout/juce_TabbedButtonBar.h | 369 + .../layout/juce_TabbedComponent.cpp | 307 + .../layout/juce_TabbedComponent.h | 220 + .../juce_gui_basics/layout/juce_Viewport.cpp | 433 + .../juce_gui_basics/layout/juce_Viewport.h | 284 + .../lookandfeel/juce_LookAndFeel.cpp | 150 + .../lookandfeel/juce_LookAndFeel.h | 233 + .../lookandfeel/juce_LookAndFeel_V1.cpp | 567 + .../lookandfeel/juce_LookAndFeel_V1.h | 101 + .../lookandfeel/juce_LookAndFeel_V2.cpp | 2892 +++ .../lookandfeel/juce_LookAndFeel_V2.h | 350 + .../lookandfeel/juce_LookAndFeel_V3.cpp | 633 + .../lookandfeel/juce_LookAndFeel_V3.h | 96 + .../menus/juce_MenuBarComponent.cpp | 347 + .../menus/juce_MenuBarComponent.h | 118 + .../menus/juce_MenuBarModel.cpp | 84 + .../juce_gui_basics/menus/juce_MenuBarModel.h | 182 + .../juce_gui_basics/menus/juce_PopupMenu.cpp | 1770 ++ .../juce_gui_basics/menus/juce_PopupMenu.h | 624 + .../misc/juce_BubbleComponent.cpp | 142 + .../misc/juce_BubbleComponent.h | 180 + .../misc/juce_DropShadower.cpp | 215 + .../juce_gui_basics/misc/juce_DropShadower.h | 80 + .../mouse/juce_ComponentDragger.cpp | 61 + .../mouse/juce_ComponentDragger.h | 99 + .../mouse/juce_DragAndDropContainer.cpp | 508 + .../mouse/juce_DragAndDropContainer.h | 187 + .../mouse/juce_DragAndDropTarget.h | 152 + .../mouse/juce_FileDragAndDropTarget.h | 104 + .../mouse/juce_LassoComponent.h | 223 + .../mouse/juce_MouseCursor.cpp | 215 + .../juce_gui_basics/mouse/juce_MouseCursor.h | 182 + .../juce_gui_basics/mouse/juce_MouseEvent.cpp | 119 + .../juce_gui_basics/mouse/juce_MouseEvent.h | 360 + .../mouse/juce_MouseInactivityDetector.cpp | 73 + .../mouse/juce_MouseInactivityDetector.h | 106 + .../mouse/juce_MouseInputSource.cpp | 685 + .../mouse/juce_MouseInputSource.h | 188 + .../mouse/juce_MouseListener.cpp | 32 + .../mouse/juce_MouseListener.h | 165 + .../mouse/juce_SelectedItemSet.h | 313 + .../mouse/juce_TextDragAndDropTarget.h | 105 + .../mouse/juce_TooltipClient.h | 85 + .../native/juce_MultiTouchMapper.h | 77 + .../native/juce_android_FileChooser.cpp | 44 + .../native/juce_android_Windowing.cpp | 837 + .../native/juce_ios_UIViewComponentPeer.mm | 1034 + .../native/juce_ios_Windowing.mm | 353 + .../native/juce_linux_Clipboard.cpp | 254 + .../native/juce_linux_FileChooser.cpp | 198 + .../native/juce_linux_Windowing.cpp | 3528 ++++ .../native/juce_mac_FileChooser.mm | 230 + .../native/juce_mac_MainMenu.mm | 750 + .../native/juce_mac_MouseCursor.mm | 173 + .../native/juce_mac_NSViewComponentPeer.mm | 2016 ++ .../native/juce_mac_Windowing.mm | 456 + .../native/juce_win32_DragAndDrop.cpp | 293 + .../native/juce_win32_FileChooser.cpp | 288 + .../native/juce_win32_Windowing.cpp | 3492 ++++ .../positioning/juce_MarkerList.cpp | 278 + .../positioning/juce_MarkerList.h | 184 + .../positioning/juce_RelativeCoordinate.cpp | 170 + .../positioning/juce_RelativeCoordinate.h | 147 + .../juce_RelativeCoordinatePositioner.cpp | 320 + .../juce_RelativeCoordinatePositioner.h | 92 + .../juce_RelativeParallelogram.cpp | 134 + .../positioning/juce_RelativeParallelogram.h | 65 + .../positioning/juce_RelativePoint.cpp | 94 + .../positioning/juce_RelativePoint.h | 90 + .../positioning/juce_RelativePointPath.cpp | 292 + .../positioning/juce_RelativePointPath.h | 191 + .../positioning/juce_RelativeRectangle.cpp | 261 + .../positioning/juce_RelativeRectangle.h | 107 + .../juce_BooleanPropertyComponent.cpp | 85 + .../juce_BooleanPropertyComponent.h | 111 + .../juce_ButtonPropertyComponent.cpp | 46 + .../properties/juce_ButtonPropertyComponent.h | 78 + .../juce_ChoicePropertyComponent.cpp | 152 + .../properties/juce_ChoicePropertyComponent.h | 125 + .../properties/juce_PropertyComponent.cpp | 50 + .../properties/juce_PropertyComponent.h | 145 + .../properties/juce_PropertyPanel.cpp | 414 + .../properties/juce_PropertyPanel.h | 167 + .../juce_SliderPropertyComponent.cpp | 80 + .../properties/juce_SliderPropertyComponent.h | 107 + .../properties/juce_TextPropertyComponent.cpp | 134 + .../properties/juce_TextPropertyComponent.h | 109 + .../juce_gui_basics/widgets/juce_ComboBox.cpp | 632 + .../juce_gui_basics/widgets/juce_ComboBox.h | 443 + .../widgets/juce_ImageComponent.cpp | 77 + .../widgets/juce_ImageComponent.h | 78 + .../juce_gui_basics/widgets/juce_Label.cpp | 462 + .../juce_gui_basics/widgets/juce_Label.h | 347 + .../juce_gui_basics/widgets/juce_ListBox.cpp | 966 + .../juce_gui_basics/widgets/juce_ListBox.h | 587 + .../widgets/juce_ProgressBar.cpp | 111 + .../widgets/juce_ProgressBar.h | 135 + .../juce_gui_basics/widgets/juce_Slider.cpp | 1615 ++ .../juce_gui_basics/widgets/juce_Slider.h | 896 + .../widgets/juce_TableHeaderComponent.cpp | 926 + .../widgets/juce_TableHeaderComponent.h | 442 + .../widgets/juce_TableListBox.cpp | 471 + .../widgets/juce_TableListBox.h | 346 + .../widgets/juce_TextEditor.cpp | 2519 +++ .../juce_gui_basics/widgets/juce_TextEditor.h | 741 + .../juce_gui_basics/widgets/juce_Toolbar.cpp | 810 + .../juce_gui_basics/widgets/juce_Toolbar.h | 330 + .../widgets/juce_ToolbarItemComponent.cpp | 235 + .../widgets/juce_ToolbarItemComponent.h | 205 + .../widgets/juce_ToolbarItemFactory.h | 108 + .../widgets/juce_ToolbarItemPalette.cpp | 106 + .../widgets/juce_ToolbarItemPalette.h | 76 + .../juce_gui_basics/widgets/juce_TreeView.cpp | 1902 ++ .../juce_gui_basics/widgets/juce_TreeView.h | 891 + .../windows/juce_AlertWindow.cpp | 713 + .../windows/juce_AlertWindow.h | 489 + .../windows/juce_CallOutBox.cpp | 242 + .../juce_gui_basics/windows/juce_CallOutBox.h | 182 + .../windows/juce_ComponentPeer.cpp | 591 + .../windows/juce_ComponentPeer.h | 372 + .../windows/juce_DialogWindow.cpp | 166 + .../windows/juce_DialogWindow.h | 261 + .../windows/juce_DocumentWindow.cpp | 369 + .../windows/juce_DocumentWindow.h | 295 + .../windows/juce_NativeMessageBox.h | 164 + .../windows/juce_ResizableWindow.cpp | 617 + .../windows/juce_ResizableWindow.h | 401 + .../windows/juce_ThreadWithProgressWindow.cpp | 114 + .../windows/juce_ThreadWithProgressWindow.h | 173 + .../windows/juce_TooltipWindow.cpp | 176 + .../windows/juce_TooltipWindow.h | 131 + .../windows/juce_TopLevelWindow.cpp | 353 + .../windows/juce_TopLevelWindow.h | 164 + .../juce_CPlusPlusCodeTokeniser.cpp | 71 + .../code_editor/juce_CPlusPlusCodeTokeniser.h | 71 + .../juce_CPlusPlusCodeTokeniserFunctions.h | 641 + .../code_editor/juce_CodeDocument.cpp | 990 + .../code_editor/juce_CodeDocument.h | 417 + .../code_editor/juce_CodeEditorComponent.cpp | 1658 ++ .../code_editor/juce_CodeEditorComponent.h | 432 + .../code_editor/juce_CodeTokeniser.h | 58 + .../code_editor/juce_LuaCodeTokeniser.cpp | 233 + .../code_editor/juce_LuaCodeTokeniser.h | 63 + .../code_editor/juce_XMLCodeTokeniser.cpp | 166 + .../code_editor/juce_XMLCodeTokeniser.h | 62 + .../documents/juce_FileBasedDocument.cpp | 257 + .../documents/juce_FileBasedDocument.h | 294 + .../embedding/juce_ActiveXControlComponent.h | 122 + .../embedding/juce_NSViewComponent.h | 85 + .../embedding/juce_UIViewComponent.h | 86 + .../modules/juce_gui_extra/juce_gui_extra.cpp | 151 + .../modules/juce_gui_extra/juce_gui_extra.h | 79 + .../modules/juce_gui_extra/juce_gui_extra.mm | 25 + .../modules/juce_gui_extra/juce_module_info | 24 + .../misc/juce_AnimatedAppComponent.cpp | 48 + .../misc/juce_AnimatedAppComponent.h | 77 + .../juce_gui_extra/misc/juce_AppleRemote.h | 114 + .../misc/juce_BubbleMessageComponent.cpp | 118 + .../misc/juce_BubbleMessageComponent.h | 132 + .../misc/juce_ColourSelector.cpp | 566 + .../juce_gui_extra/misc/juce_ColourSelector.h | 171 + .../misc/juce_KeyMappingEditorComponent.cpp | 472 + .../misc/juce_KeyMappingEditorComponent.h | 136 + .../misc/juce_LiveConstantEditor.cpp | 474 + .../misc/juce_LiveConstantEditor.h | 303 + .../misc/juce_PreferencesPanel.cpp | 150 + .../misc/juce_PreferencesPanel.h | 148 + .../misc/juce_RecentlyOpenedFilesList.cpp | 146 + .../misc/juce_RecentlyOpenedFilesList.h | 164 + .../juce_gui_extra/misc/juce_SplashScreen.cpp | 83 + .../juce_gui_extra/misc/juce_SplashScreen.h | 155 + .../misc/juce_SystemTrayIconComponent.cpp | 36 + .../misc/juce_SystemTrayIconComponent.h | 97 + .../misc/juce_WebBrowserComponent.h | 128 + .../juce_android_WebBrowserComponent.cpp | 109 + .../native/juce_ios_UIViewComponent.mm | 127 + .../native/juce_linux_SystemTrayIcon.cpp | 142 + .../native/juce_linux_WebBrowserComponent.cpp | 114 + .../native/juce_mac_AppleRemote.mm | 263 + .../juce_mac_CarbonViewWrapperComponent.h | 332 + .../native/juce_mac_NSViewComponent.mm | 223 + .../native/juce_mac_SystemTrayIcon.cpp | 244 + .../native/juce_mac_WebBrowserComponent.mm | 379 + .../native/juce_win32_ActiveXComponent.cpp | 402 + .../native/juce_win32_SystemTrayIcon.cpp | 235 + .../native/juce_win32_WebBrowserComponent.cpp | 325 + .../geometry/juce_Draggable3DOrientation.h | 157 + .../juce_opengl/geometry/juce_Matrix3D.h | 154 + .../juce_opengl/geometry/juce_Quaternion.h | 99 + .../juce_opengl/geometry/juce_Vector3D.h | 81 + .../modules/juce_opengl/juce_module_info | 25 + .../modules/juce_opengl/juce_opengl.cpp | 212 + .../modules/juce_opengl/juce_opengl.h | 149 + .../modules/juce_opengl/juce_opengl.mm | 25 + .../native/juce_MissingGLDefinitions.h | 148 + .../native/juce_OpenGLExtensions.h | 128 + .../juce_opengl/native/juce_OpenGL_android.h | 182 + .../juce_opengl/native/juce_OpenGL_ios.h | 294 + .../juce_opengl/native/juce_OpenGL_linux.h | 195 + .../juce_opengl/native/juce_OpenGL_osx.h | 225 + .../juce_opengl/native/juce_OpenGL_win32.h | 266 + .../juce_opengl/opengl/juce_OpenGLContext.cpp | 955 + .../juce_opengl/opengl/juce_OpenGLContext.h | 288 + .../opengl/juce_OpenGLFrameBuffer.cpp | 347 + .../opengl/juce_OpenGLFrameBuffer.h | 134 + .../opengl/juce_OpenGLGraphicsContext.cpp | 1891 ++ .../opengl/juce_OpenGLGraphicsContext.h | 96 + .../juce_opengl/opengl/juce_OpenGLHelpers.cpp | 103 + .../juce_opengl/opengl/juce_OpenGLHelpers.h | 73 + .../juce_opengl/opengl/juce_OpenGLImage.cpp | 206 + .../juce_opengl/opengl/juce_OpenGLImage.h | 52 + .../opengl/juce_OpenGLPixelFormat.cpp | 61 + .../opengl/juce_OpenGLPixelFormat.h | 70 + .../juce_opengl/opengl/juce_OpenGLRenderer.h | 72 + .../opengl/juce_OpenGLShaderProgram.cpp | 161 + .../opengl/juce_OpenGLShaderProgram.h | 167 + .../juce_opengl/opengl/juce_OpenGLTexture.cpp | 193 + .../juce_opengl/opengl/juce_OpenGLTexture.h | 102 + .../utils/juce_OpenGLAppComponent.cpp | 52 + .../utils/juce_OpenGLAppComponent.h | 77 + .../juce_video/capture/juce_CameraDevice.cpp | 89 + .../juce_video/capture/juce_CameraDevice.h | 161 + .../modules/juce_video/juce_module_info | 21 + .../modules/juce_video/juce_video.cpp | 146 + .../modules/juce_video/juce_video.h | 82 + .../modules/juce_video/juce_video.mm | 25 + .../native/juce_android_CameraDevice.cpp | 83 + .../native/juce_mac_CameraDevice.mm | 353 + .../juce_mac_QuickTimeMovieComponent.mm | 341 + .../native/juce_win32_CameraDevice.cpp | 792 + .../native/juce_win32_DirectShowComponent.cpp | 926 + .../juce_win32_QuickTimeMovieComponent.cpp | 483 + .../playback/juce_DirectShowComponent.h | 216 + .../playback/juce_QuickTimeMovieComponent.h | 220 + Examples/AudioAppExample/Source/Main.cpp | 101 + .../AudioAppExample/Source/MainComponent.cpp | 159 + .../jucer_AudioComponentTemplate.cpp | 24 +- .../gui/juce_AudioAppComponent.cpp | 13 +- .../gui/juce_AudioAppComponent.h | 3 + 1140 files changed, 442849 insertions(+), 10 deletions(-) create mode 100644 Examples/AudioAppExample/AudioAppExample.jucer create mode 100644 Examples/AudioAppExample/Builds/MacOSX/AudioAppExample.xcodeproj/project.pbxproj create mode 100644 Examples/AudioAppExample/Builds/MacOSX/Info.plist create mode 100644 Examples/AudioAppExample/Builds/MacOSX/RecentFilesMenuTemplate.nib create mode 100644 Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Info.plist create mode 100755 Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/MacOS/AudioAppExample create mode 100644 Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/PkgInfo create mode 100644 Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Resources/RecentFilesMenuTemplate.nib create mode 100644 Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.sln create mode 100644 Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj create mode 100644 Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj.filters create mode 100644 Examples/AudioAppExample/Builds/VisualStudio2010/resources.rc create mode 100644 Examples/AudioAppExample/Builds/iOS/AudioAppExample.xcodeproj/project.pbxproj create mode 100644 Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 Examples/AudioAppExample/Builds/iOS/Info.plist create mode 100644 Examples/AudioAppExample/JuceLibraryCode/AppConfig.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/JuceHeader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/ReadMe.txt create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/codec.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/config_types.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/framing.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/backends.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/highlevel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/info.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mapping0.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/ogg.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_Array.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_File.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_File.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/juce_core.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/juce_core.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/juce_core.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_Random.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/maths/juce_Range.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/misc/juce_Result.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_Socket.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/network/juce_URL.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_String.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_String.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_Process.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/time/juce_Time.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/README create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_cryptography/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/juce_events.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/juce_events.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/juce_events.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_Message.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pnginfo.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpriv.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngstruct.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/juce_graphics.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/geometry/juce_Matrix3D.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/geometry/juce_Quaternion.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/geometry/juce_Vector3D.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/juce_opengl.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/juce_opengl.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/juce_opengl.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_MissingGLDefinitions.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_OpenGLExtensions.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_android.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_ios.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_linux.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_osx.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLRenderer.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/juce_module_info create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/juce_video.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/juce_video.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/juce_video.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/native/juce_android_CameraDevice.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/native/juce_mac_CameraDevice.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/native/juce_win32_CameraDevice.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/native/juce_win32_DirectShowComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/playback/juce_DirectShowComponent.h create mode 100644 Examples/AudioAppExample/JuceLibraryCode/modules/juce_video/playback/juce_QuickTimeMovieComponent.h create mode 100644 Examples/AudioAppExample/Source/Main.cpp create mode 100644 Examples/AudioAppExample/Source/MainComponent.cpp diff --git a/Examples/AudioAppExample/AudioAppExample.jucer b/Examples/AudioAppExample/AudioAppExample.jucer new file mode 100644 index 0000000000..bb19cf1904 --- /dev/null +++ b/Examples/AudioAppExample/AudioAppExample.jucer @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/AudioAppExample/Builds/MacOSX/AudioAppExample.xcodeproj/project.pbxproj b/Examples/AudioAppExample/Builds/MacOSX/AudioAppExample.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..b250919a52 --- /dev/null +++ b/Examples/AudioAppExample/Builds/MacOSX/AudioAppExample.xcodeproj/project.pbxproj @@ -0,0 +1,2152 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + + 3286435E3CC944A630866B89 = {isa = PBXBuildFile; fileRef = 92CABA9C9B5148FCA22A0503; }; + 7AC823C6BFA28E49D004E0E0 = {isa = PBXBuildFile; fileRef = BD70FA4626657FF1DEBB10DA; }; + 32D0B845ED45381A3B0D3286 = {isa = PBXBuildFile; fileRef = C751B4E213343FF77A0681B6; }; + 7D74E1C0A7CA9488CCB8FD5D = {isa = PBXBuildFile; fileRef = EA07D9E1051E8FBBB8C21064; }; + 2414893F5F6D7096A1350F6B = {isa = PBXBuildFile; fileRef = 0C37646FCADAFC29F28333C0; }; + 26E4E22AC7196AC405E218B9 = {isa = PBXBuildFile; fileRef = 7C86E886C3FCB671004E1CA2; }; + F5BE3CB7F8CBD56D6E0C6AE4 = {isa = PBXBuildFile; fileRef = 4D4B44BECA12A8D1B2A458EF; }; + F4869C88FEAADF584E72EF77 = {isa = PBXBuildFile; fileRef = D9E37E3E825916FFC5391BCC; }; + 05C4C6087DA084BB2A20A87D = {isa = PBXBuildFile; fileRef = FA016D0A7169A84A182C404B; }; + E529B9215B8115D19FAFA952 = {isa = PBXBuildFile; fileRef = 72EACF200EDF2E5DF7D66DD6; }; + 291730DFE49E6AE97D4C8CEC = {isa = PBXBuildFile; fileRef = B06A9120276E8875161CFC7D; }; + 22F4A52A8EEA059B7DD0FCC2 = {isa = PBXBuildFile; fileRef = BC1276921CB154EB04E5EBAE; }; + 74DB8EEA9D58B6E97C392192 = {isa = PBXBuildFile; fileRef = 095618F6D669589BD1DBD1ED; }; + 0CB39189A1701173FED41819 = {isa = PBXBuildFile; fileRef = 16799F26A4934E01FE14D70A; }; + 5055109434B36CD6E0B6D360 = {isa = PBXBuildFile; fileRef = 2545022A0EE088A0C46EBD13; }; + 55A794809FECCB07D3C4D07D = {isa = PBXBuildFile; fileRef = D78365C74082A1253E12AF17; }; + 3621F85B854280F9027CE5CB = {isa = PBXBuildFile; fileRef = 5FF5EB14BABBB07DE73B3084; }; + 553D71A8359701FC2637AB1B = {isa = PBXBuildFile; fileRef = A7A5CB392CC227CDF5EA7E1E; }; + 202C2E7636BF065345A863BE = {isa = PBXBuildFile; fileRef = 0C45F05CF7EE8C0E36FACC7D; }; + 4D0CCBCD970506020B7B776D = {isa = PBXBuildFile; fileRef = A4545B5C8FFEC73F3BBB79D4; }; + A5F3236458D1B10A5380B56E = {isa = PBXBuildFile; fileRef = 0246069EEBDF0407AC74689B; }; + 32945D1B73F05E016A260623 = {isa = PBXBuildFile; fileRef = DE7823A252414C8CBA93C5C4; }; + 37A09B6DF2E96F97B97D4449 = {isa = PBXBuildFile; fileRef = 4C36BE67D1173F7989BE5F45; }; + 549F56B2B2C317F8825B1931 = {isa = PBXBuildFile; fileRef = CE21B3DE9134974FC3432234; }; + 497800EE8B1FCCF085363076 = {isa = PBXBuildFile; fileRef = 28BFBC2913988C2507DA643B; }; + EAB8E408DC76E022A6D68766 = {isa = PBXBuildFile; fileRef = F15FDAFFD05E09B75A756D84; }; + 9A41B21E365359ED2B2EA7C9 = {isa = PBXBuildFile; fileRef = 5CAC2512334C51B8BF104DD4; }; + D08237D0B93B3C2CE522A33E = {isa = PBXBuildFile; fileRef = 77DBA89F84EE6B4ABBCC1392; }; + 6DD90D5F07BB81EF033A8A20 = {isa = PBXBuildFile; fileRef = 0715CC6C99BA955AF2097BB6; }; + 7BAD1CE41A8101004D40A2BE = {isa = PBXBuildFile; fileRef = 88F83AF1ABFAE2A428714C4D; }; + 002827E70384CB5051DC2794 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LagrangeInterpolator.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 00F3FC287D7F986198A936F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LuaCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0115C9169A12F36DD8CEBB70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MountedVolumeListChangeDetector.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 01A4F028A63749CCAAE5DF55 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0246069EEBDF0407AC74689B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_utils.mm"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; }; + 025BB62BCFB9BC624B6C65EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Result.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp"; sourceTree = "SOURCE_ROOT"; }; + 027B826D8F1EC95E886648AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; }; + 02D59F4CAD8301ECCB3ED6C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 032DDE8B772727B97389F022 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h"; sourceTree = "SOURCE_ROOT"; }; + 0401AF6817AF1AEAC733714F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0425BD62DB67A184A8DCAF27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 043223EEE8D5CD1401F3BAA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0518D1089617C7B9598F35C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SelectedItemSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"; sourceTree = "SOURCE_ROOT"; }; + 056385085D79574486C0E69E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLTexture.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.h"; sourceTree = "SOURCE_ROOT"; }; + 058ACC9BACC273A0CD4AD526 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSourcePlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h"; sourceTree = "SOURCE_ROOT"; }; + 05F4D303872E30E0E100B178 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; }; + 0680C56908E9B9FC6E45C181 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ValueTree.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp"; sourceTree = "SOURCE_ROOT"; }; + 068CA344569622AC46399E24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DeletedAtShutdown.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp"; sourceTree = "SOURCE_ROOT"; }; + 06CCEC1EB7CB9296868ECC10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectShowComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_DirectShowComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0715CC6C99BA955AF2097BB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_opengl.mm"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; }; + 0744962768C86A35D6715A15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + 07E25F36485450F905114EB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 07F9A74E51473D1AEF083D7E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0859DE9EA0450BAFE24265C5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLPixelFormat.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 09221768D9AE08F3E84407EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComboBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 09435B89075BB6FA4CFD6724 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 095618F6D669589BD1DBD1ED = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 09E6748FEA21346ED9524265 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_utils.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h"; sourceTree = "SOURCE_ROOT"; }; + 0A1661FABC94E6BC1CA583CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A3DFC5C47DC2472E34D9E73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A919F08E0442BC95072112F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; }; + 0AAD0F08AF5170AEB68F9191 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginListComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0B0A6273D0438F94A0C00793 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Memory.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Memory.h"; sourceTree = "SOURCE_ROOT"; }; + 0B10218E1440362CF414330C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageCollector.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0B8875740103D9A0E34317DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 0BE56E18575B1EAB8F889666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0C0C38F452969215F24776E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePoint.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0C16DC35F5044178F8D6FF3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Application.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h"; sourceTree = "SOURCE_ROOT"; }; + 0C37646FCADAFC29F28333C0 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 0C45F05CF7EE8C0E36FACC7D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_formats.mm"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; }; + 0C9B17E257DF0D263890AC69 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; }; + 0CAB2AAF663F5DD90D95F05C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLContext.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.h"; sourceTree = "SOURCE_ROOT"; }; + 0D7137F7245CFB5DAA18A4FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableObjectResizer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h"; sourceTree = "SOURCE_ROOT"; }; + 0D9FFE7342AC6AA69831D982 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileLogger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0DB32EC20D82294C547A0316 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0DDC18CBD62470AE422E4571 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Socket.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.h"; sourceTree = "SOURCE_ROOT"; }; + 0E79750D244E5C95E94DAF88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST3PluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0F09FC5EE1D8696669386810 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPCompressorOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0F29F3A4AE661CEF5467732F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 0F2AA0311372228328A192D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0F40E9138B6D40184283AC89 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0F9C7DD8B8CA6807E02134AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 0FA2744FC75AA85A7B01AC72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferedInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 0FF1CB412E3C9ACEAFE41AB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RecentlyOpenedFilesList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 107DFA95B0EDBA20E6F491EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TreeView.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1095B29C706EA27F3345B1C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemClipboard.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h"; sourceTree = "SOURCE_ROOT"; }; + 10D3E511C1596A55D345E450 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 10FC26BFC760FDF31F7EF24D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; }; + 11684623C5BC9B99836F46E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; }; + 118158D6CA3C681B3C33CC49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1199E7838DDE8C2C910335E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorListener.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"; sourceTree = "SOURCE_ROOT"; }; + 11A4BF5B35CBCE630657C39B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Label.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h"; sourceTree = "SOURCE_ROOT"; }; + 11CFE8D169BB1FA1424C433C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ActionBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1207768208DE16246677EEB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ContainerDeletePolicy.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h"; sourceTree = "SOURCE_ROOT"; }; + 125FF844F4BED2DA55F1CB14 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferedInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 12AD997217C5B146DCE05DA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; }; + 12C4E2CEE622B2D83D4E08B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_osx.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_osx.h"; sourceTree = "SOURCE_ROOT"; }; + 13329E39CC18775B44F472FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1478ABF4E3D10AA709DDFD65 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + 14DC16A9C4FFE20764935170 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 159C514EC2AC5B7C89F19F37 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Thread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 15B818119E54576C2C7BE206 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 15BA4AEE0C0E22D7C8BE92CA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; }; + 165951595FE0F9FBDF8F1F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1664A35158FBA71AADCB379D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConnectedChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 16799F26A4934E01FE14D70A = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; }; + 16C069B1F73826D5E4EB1AA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_linux.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_linux.h"; sourceTree = "SOURCE_ROOT"; }; + 16E0712BBC4355F3D2854D5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 16ECD7B6A2A11154B3D86015 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnectionServer.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"; sourceTree = "SOURCE_ROOT"; }; + 16EFF69FC0A6DCCB8B386AD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 175536F3AD74DA7F99855C30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 178C4671AD0A7572A5C23B8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Line.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h"; sourceTree = "SOURCE_ROOT"; }; + 17C63BCBC9FC8596F5EBED8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 17E6C78A4D618FA739394B9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1804F385A9B946734797C612 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSubsectionReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h"; sourceTree = "SOURCE_ROOT"; }; + 18425E2A1A02A2F013266A5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DialogWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 18710CAA88A2662E51D49808 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; }; + 18D45688D8F8717DC47D1E83 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 190369B72311A50A82311CD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LuaCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 1957F896F4DDB12033F0E84D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 19ABD47BB707333435D2CF3F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 19C6E03C8D0761B9A3734BA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; + 1A5DF7BA39B40428260C31AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableHeaderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1A65D6E553E5548D50FA59F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h"; sourceTree = "SOURCE_ROOT"; }; + 1AC49D8536EA1C79ADF3F0E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TopLevelWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 1B103C1C32376CBF2394789A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MixerAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1B736A8E8EE2F4C270C8F2FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDescription.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1BC517563ED432D3E3033450 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; }; + 1BEE7899664040AC3C5866D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiOutput.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h"; sourceTree = "SOURCE_ROOT"; }; + 1C2F048BBDFE107360BBFA96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1C53C4F34A3547694B6DC964 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailCache.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h"; sourceTree = "SOURCE_ROOT"; }; + 1C98C9CED951E601931822FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 1CC58E8F3AF64BE9788945BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_devices.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h"; sourceTree = "SOURCE_ROOT"; }; + 1D90D583FA45AECD95ABCA46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrayAllocationBase.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h"; sourceTree = "SOURCE_ROOT"; }; + 1DBB7AD294F9BEB842690992 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LagrangeInterpolator.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h"; sourceTree = "SOURCE_ROOT"; }; + 1E1FBFEE80C3686ADE3B4F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1E7CA6A3A1C17F917A7F7E04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyboardFocusTraverser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"; sourceTree = "SOURCE_ROOT"; }; + 1ECCF86BD5C7ABBD8FBF6652 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1ED7F9F098974D1824E98397 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceSelectorComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1EF8CC1985D194D8B5FA91FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1F5AB21B8BB5572345F16D3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageCollector.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"; sourceTree = "SOURCE_ROOT"; }; + 1F87E9DB5370F34BDCA80E61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; }; + 1FDE5979B036F7ABC463E315 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LocalisedStrings.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp"; sourceTree = "SOURCE_ROOT"; }; + 201AAC61BD1439D0404CD52A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; + 204605387364B68F56B522C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_processors.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h"; sourceTree = "SOURCE_ROOT"; }; + 2086277583EAB1A771D6C6B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLTexture.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2091E99CE600D2CE4AB578ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Identifier.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.h"; sourceTree = "SOURCE_ROOT"; }; + 20C9FECB6515DEB13F3D0B12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Typeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 20D894CA430125D6180ACA0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatWriter.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h"; sourceTree = "SOURCE_ROOT"; }; + 21168FEE80959F178F1121D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadWithProgressWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 215188D87085D91B6C5FCD14 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TooltipWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 22602331F3048F760A57DF0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StandardHeader.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h"; sourceTree = "SOURCE_ROOT"; }; + 22F32B780E54AADD057330AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; }; + 2324CB42E9D6509A04EC7C2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_opengl.h"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_opengl.h"; sourceTree = "SOURCE_ROOT"; }; + 23497CEA84E011F94678DC68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 23EDC268BE997399F443A16F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_basics.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h"; sourceTree = "SOURCE_ROOT"; }; + 23FA7D4C4D291A54A41B05B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 244B7290EA0ADF1E7F5F95E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Justification.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h"; sourceTree = "SOURCE_ROOT"; }; + 247DBA4DAA228F551077F55D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 24D1CEB29BC23FB571BE0EC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 250858304ABC5EC4C5B9D876 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2545022A0EE088A0C46EBD13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; }; + 26666AFE34453D68EA1CD34C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ShapeButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h"; sourceTree = "SOURCE_ROOT"; }; + 2678394F8161FBC107B8426C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 2758DE812EF406E2AF60A9DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModifierKeys.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp"; sourceTree = "SOURCE_ROOT"; }; + 277DFD7724AA558ECBF9CD7C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 278905A514838BB05EF5BCC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallOutBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h"; sourceTree = "SOURCE_ROOT"; }; + 27E26A34A2A3DC9FBF6C6B74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FillType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 27E49EEFD8649E9F26DBF49E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDReader.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm"; sourceTree = "SOURCE_ROOT"; }; + 28050C6DE7011A70920E3F32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; + 2864CE464B03FFF3AD5A24F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 28697A80BA58B9660B88AA23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilterAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 28B1C5C6AFE41F19212BCBAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Drawable.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h"; sourceTree = "SOURCE_ROOT"; }; + 28BFBC2913988C2507DA643B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; + 28D9FE3711234F679FB41733 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 28EB7629415CAFD5EA443ADD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WildcardFileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 29936B840C21753D71B54BAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActiveXControlComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 29F0D7BF3731A741411D18A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OggVorbisAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 2ACD26FEA009C3FF00F6E124 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; }; + 2ACEEEDE012463EC66132BA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Strings.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm"; sourceTree = "SOURCE_ROOT"; }; + 2B17BC5C2C35FFFDDCB35B68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Network.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm"; sourceTree = "SOURCE_ROOT"; }; + 2B3407D0626D7910D74E5730 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LADSPAPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B397A82E7CBA92C8FA0131B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBasedDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B654CF3E5F53432E73B0D86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2BA8A348E24FA01FEDAA4FBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 2C09E22A2D6F69F847BE5296 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WavAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2C127393C75D45AC918B05CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScrollBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h"; sourceTree = "SOURCE_ROOT"; }; + 2C204E901887EE1AC09282FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODevice.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2C53D458935EDD6D74D4390A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBoundsConstrainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h"; sourceTree = "SOURCE_ROOT"; }; + 2C6D33A4B1F178774DA92636 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniserFunctions.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 2CB331F5BE20779E5AEBC540 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2D297AFC8E8E9B519D00CF26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; }; + 2D8778974C68084E97C85FEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h"; sourceTree = "SOURCE_ROOT"; }; + 2E2953742C1431A70048C873 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2E74287A8B3F00266B67AA83 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 2E7AE6E8520AA41965C96D58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2E8C5D25AB2D652B5691EB2D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2E90765D015EF5632C2D615B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MissingGLDefinitions.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_MissingGLDefinitions.h"; sourceTree = "SOURCE_ROOT"; }; + 2EDB0A77DEEF290EAA07A3E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_HiddenMessageWindow.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 2F67F63DB8A9E866D2E9A38E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LeakedObjectDetector.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 2F7E8902A1991455A1F5B963 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePointPath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2FB247186481F5110B579138 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 300F36848F2D4A79559B6D6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Toolbar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h"; sourceTree = "SOURCE_ROOT"; }; + 308A0C14FE5712ACF925AA17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; + 30A53BEDFFCEA0BF3C85C0B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CompilerSupport.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h"; sourceTree = "SOURCE_ROOT"; }; + 3105D7A9F6BA318B79DDC438 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; }; + 3187437331BDB6E116DFD5B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsSoftwareRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + 31C333E8B5461842ABD53A72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 31CB45A436EEF3A12214093C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooserDialogBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h"; sourceTree = "SOURCE_ROOT"; }; + 3210AE12F825D9CED282EC8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colour.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3226B9DE4C4E839CB4918EED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Range.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Range.h"; sourceTree = "SOURCE_ROOT"; }; + 32EBBC998E5AD83676410646 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; }; + 32F1879E6FF96C8BDE9C2EBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 331DB96552D8827A3531E620 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PopupMenu.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h"; sourceTree = "SOURCE_ROOT"; }; + 336617A6E385E55360312EF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + 33AAFC22439616A878D7024A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + 33C3EB30E1F7199E0BC8C099 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + 36063F6B7F9D00DAFFACC46B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Message.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Message.h"; sourceTree = "SOURCE_ROOT"; }; + 37E2B8D100CBDDEE568C9D82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReverbAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 37F722083290923E7CC45301 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3890B3CC99A7CF70767E86F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; }; + 38B7C06966C8B0E02ECD9611 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 393CFE634E767D7D67754605 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarModel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3946B6C3F4C5CF77AE29657C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 39ABB40231FE7BB0695CFF2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 39B341C6A96025DA8F67F7F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FilenameComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3A028505018E28D11D56FE59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3A320AE2ABD9443FAA57246B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3AAA6A680D5A6C01BACBB156 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 3AF9A6DA9497798FDF6D2FAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedXLock.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h"; sourceTree = "SOURCE_ROOT"; }; + 3B134E33FAF6A2D476C68EEB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageEffectFilter.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 3B1AB73B105D680E63D600EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; }; + 3B1E4039E71D8E5914733F30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringRef.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringRef.h"; sourceTree = "SOURCE_ROOT"; }; + 3B609DEA3235848EA822C8AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3B96138DDA824185B1B0CDC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3BF362FE18A7BC55816C4465 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; }; + 3C04C48B58867EA02A19DEB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF8.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h"; sourceTree = "SOURCE_ROOT"; }; + 3C539DCE1C0EE05849B234D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V3.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h"; sourceTree = "SOURCE_ROOT"; }; + 3C7C34849B551EF325EEA9BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CriticalSection.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h"; sourceTree = "SOURCE_ROOT"; }; + 3CA397FE5872CE6CB0F72442 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF16.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h"; sourceTree = "SOURCE_ROOT"; }; + 3D5DB95456FD73DF6EF38C62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3DF2F5F789876541B73EA0A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MarkerList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h"; sourceTree = "SOURCE_ROOT"; }; + 3EA94E228D9E4956494DEC53 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3EAFFA56F2F43A1058B3218D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 3EC17246B581310C23EA5F63 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConnectedChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 3EFA5C3DC025E618DAD14A83 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_video/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 3F01FA0D9D23B3A8D322CD03 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Vector3D.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Vector3D.h"; sourceTree = "SOURCE_ROOT"; }; + 3F4BF347280692C4AD70F2D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiFile.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3F56498672689348F97FE1FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyMappingEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FCA25C4DC0E7E70CFC17B37 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FCBFAAF81329700C9160C94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationProperties.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h"; sourceTree = "SOURCE_ROOT"; }; + 3FCCE49E2927562C037B9502 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FFEA694C92E8634104DEF64 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 4026AF7C01AE98E51C186FF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLImage.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.h"; sourceTree = "SOURCE_ROOT"; }; + 40416019EE08694C50FEEB1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MainMenu.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm"; sourceTree = "SOURCE_ROOT"; }; + 4063612DB3C6EFC5F0A2F2C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLPixelFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 40ACDFD1FA477AF57EC46DE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AlertWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 40BD3111FD3F59098D84C7BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.h"; sourceTree = "SOURCE_ROOT"; }; + 40CE01EAB7B475FFDB7B2E27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDBurner.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h"; sourceTree = "SOURCE_ROOT"; }; + 40E81296E8405B6DB08D1A48 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 41249AFDA317DF598918C5CB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 42A9118A046157BA8286F106 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BooleanPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 42E8113E2578AA7A73BC5A1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadower.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp"; sourceTree = "SOURCE_ROOT"; }; + 42FDBC613302FACA9FDA8686 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 43023E9280CA4864EC92D5E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilter.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 430BC76CC982DBD7BA922C07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; }; + 439CD9F942C3BEB5F038C381 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 43BE8B9E5193679AA753D8AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 43FDB7EF4E52DAE9FF6D162B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_ComSmartPtr.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h"; sourceTree = "SOURCE_ROOT"; }; + 4499B2E19EEA40B3C258C462 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4503340D22E0C1A30491A805 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XMLCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 4503ADFFDC985C61C84B5577 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LAMEEncoderAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 4510ED9DACF956CD26701FF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PopupMenu.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp"; sourceTree = "SOURCE_ROOT"; }; + 457A44F589184417BEEC66C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPathListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 45BE7811D6EF62D3ACB56906 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODeviceType.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45DD32716673D626B8F2C36D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToggleButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45DDC719491D8A5DF2742D87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CameraDevice.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_CameraDevice.mm"; sourceTree = "SOURCE_ROOT"; }; + 460020F474D8AD5AFA450072 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ZipFile.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h"; sourceTree = "SOURCE_ROOT"; }; + 464DA97D2978A2CA768B8245 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; }; + 46A0CCA7CD813904C9B38AD6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsMediaAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 475280BA3A8D59845C56B2BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableComposite.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"; sourceTree = "SOURCE_ROOT"; }; + 47CB49E5D140AD7BC5E7EA6C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 47CFAC810A119132A9B210A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDBurner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp"; sourceTree = "SOURCE_ROOT"; }; + 48695857FE992FD343D3EFF4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 486C18005FCEA3E0FC43A3D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49800024EAD8F8D3238A90D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AlertWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49D0EA14738CACC0F306EE52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreMidi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49E5420AF938D076F5E962C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; sourceTree = "SOURCE_ROOT"; }; + 49F2DE82396CA941290096FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 49F330138E609BC0B2FCA34C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReaderSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A0B9707656C06AA2DF98695 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A2E5A69C7177BADB85213F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A461606855E42B876AA960F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A7FA27B8AA27DB409E034B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreAudio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AC22D39210D3189BF3C6305 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4ACC11DF3E3FAD545226B517 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 4AE5D614B7AFCAB583208759 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AF88AC28F3B17223B71ADE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4BE79606E126522A5FFCA28A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawablePath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h"; sourceTree = "SOURCE_ROOT"; }; + 4C0C45AA79B864C0AB7B79F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPCompressorOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 4C1559D44A5474E65356E7DD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_formats.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h"; sourceTree = "SOURCE_ROOT"; }; + 4C2A9FBE4440A4885A8E85B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FillType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h"; sourceTree = "SOURCE_ROOT"; }; + 4C36BE67D1173F7989BE5F45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_cryptography.mm"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; }; + 4C4AD880BD869C2D5B9224A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Sampler.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D0E742ECB7DB1F70BF615FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D4B44BECA12A8D1B2A458EF = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; + 4D9D135A8094707A4386F0D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TimeSliceThread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4DAE9FA9C8EC7493491FDEA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; }; + 4DF7445B3EB54343A00CC25C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Slider.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E0D6764579E37009B0A63D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LADSPAPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 4E49D3DFA722AF35FAC2ADEE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageManager.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E6E46FC7CC57977CDEFF7EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLFrameBuffer.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 4E805C7465B906764FDCC079 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PreferencesPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 4EE687A57FE874A6A2386F90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_SystemStats.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm"; sourceTree = "SOURCE_ROOT"; }; + 4FDD1C063357EE9737EED677 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 503B205A90B3DE3B0698F302 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ASIO.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5051361BA7E00F1DC38E5917 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioFormatReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 50FCEB2875B2FCF29C690911 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WindowsMediaAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 51304425CA1B8E486172E4BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Logger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.h"; sourceTree = "SOURCE_ROOT"; }; + 51585B78DC89C3B8C60FB051 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; }; + 523E4436EB863D6DE0298B96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeMovieComponent.h"; path = "../../JuceLibraryCode/modules/juce_video/playback/juce_QuickTimeMovieComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 5301D83E07FBC894AD2458DA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5341780B2FA0848C000E0E78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 536CDDD56182947C118F00FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h"; sourceTree = "SOURCE_ROOT"; }; + 539A97B08CE5685F52310C66 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MACAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h"; sourceTree = "SOURCE_ROOT"; }; + 540011D30E5C05255D2F9F58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SplashScreen.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp"; sourceTree = "SOURCE_ROOT"; }; + 543AABF5A9378ECC67318D8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; + 5591F52441CBA977CBE18BEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5659F3E5E387D79D667939BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentPeer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 568DBF7F795FF57A1DCA7A0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DocumentWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 56CAC3C965D4937837CE291C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; }; + 56FD90C9B255C9842E1DE6E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; }; + 570B0C815598550D71518FB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KnownPluginList.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5742F3D06FFAE3F44F6B7DDA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; }; + 57800AC773D879C937EFFFB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChannelRemappingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 580051596DD113F78E262642 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UndoManager.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 58C6BBACBF0FB679757A6CC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MouseCursor.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm"; sourceTree = "SOURCE_ROOT"; }; + 58E83747D5DAC8B6A43E07E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileLogger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h"; sourceTree = "SOURCE_ROOT"; }; + 595A4B842DF683AB9EA79DB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ZipFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5981B71FC0A50C72374F7114 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 59C362E42C5EF3F3D40F38F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBuilder.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h"; sourceTree = "SOURCE_ROOT"; }; + 5A3068DBC997E07FD8AB7989 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5A4CAD8AC21BEA6913ADCA4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5AFACEA211E6D5FD20E05486 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AiffAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B5933C960929059FBAE8885 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ArrowButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B937EC199DBC45A407C603C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B98A0AA65983E10EBD10268 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ByteOrder.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h"; sourceTree = "SOURCE_ROOT"; }; + 5BA48D2E6A144E1105C70292 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h"; sourceTree = "SOURCE_ROOT"; }; + 5BFF939FEACE52CFB95AA8ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 5C5D51EC34D374F2405AD2D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_ASCII.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h"; sourceTree = "SOURCE_ROOT"; }; + 5C60278796530C3DA50276C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BorderSize.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h"; sourceTree = "SOURCE_ROOT"; }; + 5CA0F3D05AD800921797035C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 5CAC2512334C51B8BF104DD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_basics.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 5CE19C97928B677F84758FD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TimeSliceThread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h"; sourceTree = "SOURCE_ROOT"; }; + 5E7FF52478337A319B91DE48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioUnitPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 5E89580C8BBEEE0ED5E1D442 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessage.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h"; sourceTree = "SOURCE_ROOT"; }; + 5EDD94865096ED9F708C3C59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiDataConcatenator.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"; sourceTree = "SOURCE_ROOT"; }; + 5F67D2D514B5D47933082E8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessage.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FA71CC7ECD6246187689CFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FDBE725B1D50CE6927CBF90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FE6EF8557574AE95CDEBDCA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FF5EB14BABBB07DE73B3084 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_basics.mm"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 6031083E4E57E154D327DA8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageFileFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 60381DB055903614A261149B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDBurner.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm"; sourceTree = "SOURCE_ROOT"; }; + 60441B6BC9A414FFBDEE3FCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 60525010BB1C88CF6C61E37C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 60643938F8115C4B9C64B3EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Value.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h"; sourceTree = "SOURCE_ROOT"; }; + 6105790D35DB968ACBDED81B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 616B784FCB645D3F2616B3E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + 61E2C2900EB986229D82026C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 62524F170AA5B50F631AC2BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; }; + 625FE12CCC970962EE1EC536 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChannelRemappingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 62B12DB571E5AC1A5A5742DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryBlock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp"; sourceTree = "SOURCE_ROOT"; }; + 62B74684D8983778FB42B8C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; }; + 62E8A57D8A56097060C92FB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 62F4498F48F1C7EF813E51C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; }; + 6353AD6AB18E11D61EB6B6B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemPalette.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h"; sourceTree = "SOURCE_ROOT"; }; + 6382DAC327D5E3173D6181B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RSAKey.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6393A472E16D29D70C0734E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 63B6DFA1DCF2656DF1AED8E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathIterator.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h"; sourceTree = "SOURCE_ROOT"; }; + 640CFFA7187DEE068F7C0753 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V1.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6423E0F4C4005A16375EDEB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; }; + 647F2177AEE7083291491B01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; }; + 64AE756DF9D13327062B5CB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilterAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 64E1EEF02B157E8DC3C242BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 663ABFD081965E7CA27A92BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6688F08F6C632F118C44F6DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LinkedListPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 66C7B3330BFC5043D3DDBB07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 68E8FE815DF6E2C80022845F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageListener.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h"; sourceTree = "SOURCE_ROOT"; }; + 6930876C15958A3ECDD37704 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPosition.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h"; sourceTree = "SOURCE_ROOT"; }; + 6943B698E1ED12866C3801EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 6A1833288C936779BEBCF1E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6A972BA75B3E0AEF10002FC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SharedResourcePointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h"; sourceTree = "SOURCE_ROOT"; }; + 6AD2950DCA3BE8F0254A7BCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 6AD481C2B30E01BFEA7A58C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h"; sourceTree = "SOURCE_ROOT"; }; + 6B49B5DFDC05F282422237A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 6B67A8471D27DEDC4814E03D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseEvent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h"; sourceTree = "SOURCE_ROOT"; }; + 6BD68AEA29A058378C87C8F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; }; + 6C67E93B6C5835F8C56C4D99 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Primes.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6D393956AEDE148D19351B48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorGraph.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6D426654FEF78C4A3F5210AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6DCAB9D9819230FBBDC77775 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 6E7E3CCDA1B9DCDF6ADAA206 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextInputTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 6E9ACB572E3F6EC33F1718BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6EDEFBC59811FE7A3C062C76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 6F29FF53262F391E1BCE9081 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_JackAudio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6F4DEF59A671D169B8F05260 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AudioUnitPluginFormat.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"; sourceTree = "SOURCE_ROOT"; }; + 6FD7AEB33E370BE902A5FAE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResamplingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 722D1A061B25E3FBA9675BE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h"; sourceTree = "SOURCE_ROOT"; }; + 7285A22D6FF07D252D791F10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 72EACF200EDF2E5DF7D66DD6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; + 7348654A7CCCA4801FBB3EFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 739B11A050C45AF258B06387 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageManager.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h"; sourceTree = "SOURCE_ROOT"; }; + 73D7E3361C9F1DE5D8264E52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DeletedAtShutdown.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h"; sourceTree = "SOURCE_ROOT"; }; + 74432C5237AEAEAD4E57A807 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiOutput.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"; sourceTree = "SOURCE_ROOT"; }; + 749977704AA15A0D6FA3B11B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTMidiEventList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"; sourceTree = "SOURCE_ROOT"; }; + 74D66A66106B1B8915E67A6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PerformanceCounter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 74D8E7D66C117C36874EE01D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 74DEE32EAF63AB159CB78CCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7505DBC3BDE5012BB93961BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInactivityDetector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp"; sourceTree = "SOURCE_ROOT"; }; + 753A34F64B6F73A234F98929 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Atomic.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h"; sourceTree = "SOURCE_ROOT"; }; + 757A8B98F9B75716D85DF54B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReadWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 75F1705A66786F7665E5D95B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; }; + 76F6FE05DE3CD997025CC52B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RSAKey.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h"; sourceTree = "SOURCE_ROOT"; }; + 77DBA89F84EE6B4ABBCC1392 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_extra.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; }; + 784B8A83FD421680BC516E53 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; }; + 788905256655086DF636DD96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7915D0307004CB1848CEBF67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CoreGraphicsContext.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm"; sourceTree = "SOURCE_ROOT"; }; + 7917F2616381CBD80F54713B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; }; + 7932BB2CDF0BBDB550253B6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; }; + 7951C7C50178ACD194B54EAB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiFile.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h"; sourceTree = "SOURCE_ROOT"; }; + 79E1F731992D801351BECC77 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LiveConstantEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 79F1D358726869315DBCC398 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7A468C67367399CD22A58BEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7A48CB105C5EE20B2AAA3491 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B1D859AB5CE56CB8E6A7A4A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B274A56879F4B2FF235D6D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_events.h"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.h"; sourceTree = "SOURCE_ROOT"; }; + 7B4708510F9CF37DBFCBCB9B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B6963B7C229C4AD0DE95058 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3PluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 7C677CA8CE54B378D929796D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlElement.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h"; sourceTree = "SOURCE_ROOT"; }; + 7C832E30FE9BFBEFAE887F8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; }; + 7C86E886C3FCB671004E1CA2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; + 7CF9048281002D8D75F98E1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryIterator.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h"; sourceTree = "SOURCE_ROOT"; }; + 7D01F2D239C0CCAE25928D26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D2590A39618C876E14DF353 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7DA009176BAA3DAD1B35F5F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; }; + 7DA7642888744B79CAB96BC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Point.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h"; sourceTree = "SOURCE_ROOT"; }; + 7DD99D2BC48E1E19710A258D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_win32.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h"; sourceTree = "SOURCE_ROOT"; }; + 7E0083C78E047CACACAFB8AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseCursor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7E9286C0B1EF625BE9B1795F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiInput.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h"; sourceTree = "SOURCE_ROOT"; }; + 7E9C5924EB87C1AFD7E48B60 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V2.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EA68D693EC63E5AD1B51FF3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 7EB3ECB111689947FA58FAFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyboardFocusTraverser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EEF7CA291E889AFE6C0384D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colours.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EF48AEB39EA3783BB388FCB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SubregionStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h"; sourceTree = "SOURCE_ROOT"; }; + 7EF6686711E9C204C92847B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 7F515A5C01BF1E9F1425DC3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F5DE79ABF9B521118C290F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Identifier.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F85DDE9A5D21D9ED2AC344C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseEvent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7FF5DA77AE30BCDFA2A8B774 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedReadLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h"; sourceTree = "SOURCE_ROOT"; }; + 7FFFC87F068D320D1F98AB72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 800C7B1CC1FFFCD17C8F29B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 80CC3A04767718A98EF73C6A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; }; + 80F49A74411A436E02B91E27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; }; + 813D0754B88F11BEF7E5F9B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 81A363C999CB90C9740E389D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; }; + 81F4BB6ED7E34DC3C55BDA51 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_core/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 82082D02470579C3970E1319 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_QuickTimeMovieComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 82780256661660A08EA18510 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MixerAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 8373BE8898318D58E01ED237 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_video.h"; path = "../../JuceLibraryCode/modules/juce_video/juce_video.h"; sourceTree = "SOURCE_ROOT"; }; + 83786BF097A3C08DF18DFEF4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 839ED2804072F1F4A49795C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableBorderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 83C9D49A4F81FA401E41784E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationProperties.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8406E1E4147F9AC6DFE0D5AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandID.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h"; sourceTree = "SOURCE_ROOT"; }; + 840FE63195B137B03D9D94BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MP3AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 843939FBC4BC176E9C2C909C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h"; sourceTree = "SOURCE_ROOT"; }; + 844707F81B86A6ECFF9D8971 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 844E060288C67CAB524751E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85615ED90EAA77242E8CDED1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 8571CD08413C205569405EFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + 85C0B0A9A2E9011A381F4B6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; }; + 85C576E54AFB35C156C9C831 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPressMappingSet.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85CACE02CBBD24F62F26B2A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedButtonBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85E37A3DAB080D6B242D79BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CharacterFunctions.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp"; sourceTree = "SOURCE_ROOT"; }; + 860657C1D332EB6DA4FA0A21 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSubsectionReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 862FF5E7777476A7D3E98CDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + 866A93C4479BDE4577F5E7B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Font.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h"; sourceTree = "SOURCE_ROOT"; }; + 8684EB51D3FCE5D754454C88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModalComponentManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h"; sourceTree = "SOURCE_ROOT"; }; + 86EE91DC473C33C6434AE0D2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 87119953571F038DDDD7F9BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectangleList.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h"; sourceTree = "SOURCE_ROOT"; }; + 8713AAF990526009F3497D8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8814927B0C28EA1063EEB553 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 88841EBB57CD023273C1B011 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 88AA4521917545383C769507 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 88B96C6E76F7B08D38F859F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_MessageQueue.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h"; sourceTree = "SOURCE_ROOT"; }; + 88F83AF1ABFAE2A428714C4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../JuceLibraryCode/modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; }; + 892492AF888E54878EBDF2A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IPAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h"; sourceTree = "SOURCE_ROOT"; }; + 8A1440773B4C39E9F9BD3B76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_FileChooser.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm"; sourceTree = "SOURCE_ROOT"; }; + 8A4309D233D97D00F33632CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_graphics.h"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.h"; sourceTree = "SOURCE_ROOT"; }; + 8ABADD47FC9A02CFCF692C5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; }; + 8AEE85FD33BBE1492B96A865 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SHA256.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8B24AAB5524D9D206BCCCCDB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableComposite.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h"; sourceTree = "SOURCE_ROOT"; }; + 8B3A7567DB62DF8CAFCB5530 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableShape.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8B62E15410E8C49EEF12207A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AffineTransform.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8BBF100D5672619427BE1FA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TreeView.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h"; sourceTree = "SOURCE_ROOT"; }; + 8BC61A14226B424351065683 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; }; + 8BDD89CC09A6A9A6D525AA03 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LAMEEncoderAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8BF1E2514857E7161B0B5A24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 8C16B3A744FCB89C241242B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V3.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8C38E93442136FBB225D6B60 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BooleanPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8C54EA0E09130998E1F1990F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_URL.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.h"; sourceTree = "SOURCE_ROOT"; }; + 8D007FFA9CCC8CFC8CFA710F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; }; + 8DFBEB59A237F3A6C0C8401F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; }; + 8E9126330B355156F8790C70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageFileFormat.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 8ECCFF38491F5691C77F2FAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorParameter.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"; sourceTree = "SOURCE_ROOT"; }; + 8F23010B5687CC84D5618D94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F25EC17852F450782DB5F6B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPDecompressorInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F37C35FD44479FF319138E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlElement.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F6230411A3D641AA0BD002E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LassoComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8F8508660223DBC2BBDDF0DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemAudioVolume.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"; sourceTree = "SOURCE_ROOT"; }; + 90B68551E96B0F8464427C04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9116D0ADA9D6CF88E29651A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 9176D4AFF29A2331048159E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Javascript.cpp"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp"; sourceTree = "SOURCE_ROOT"; }; + 919BAECE150A694462A66B0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectShowComponent.h"; path = "../../JuceLibraryCode/modules/juce_video/playback/juce_DirectShowComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 92268C4E4F2D4051D5EA1A16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V2.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h"; sourceTree = "SOURCE_ROOT"; }; + 92AD2CC241921A7624BBDD04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NSViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 92CABA9C9B5148FCA22A0503 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + 938F57CE18456266C6E99FC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 93A609B77BEEAFD352361D7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinate.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"; sourceTree = "SOURCE_ROOT"; }; + 93F7CB7B38CB41F67A542FA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 93FB3181F01650023DC78145 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; + 951CBABFDEE3D2B3D9B4B5AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MD5.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h"; sourceTree = "SOURCE_ROOT"; }; + 951F9F842B6D39ACA7107024 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h"; sourceTree = "SOURCE_ROOT"; }; + 954B1EAA307AD2C0889EBBD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; }; + 956FB59B79B022DB0559F9E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_URL.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9598CB11B13DE1EDB5E9621D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 95BAAE8ABA96F23E47FE028D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; }; + 95E4BBD9EA8C59D2DEA56E5E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; }; + 967BE7DD4F2AA7AA8F9738CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + 96E32E150CC5E45E6067077F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9757D7FBF6613C9CB3ADD0CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPressMappingSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h"; sourceTree = "SOURCE_ROOT"; }; + 9762A585C1D71C4F94400DCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 97632D4A7623F329325575B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationBase.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97AA55E057EA63A841B7D8D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97B159555E69DE49F7320D32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97BB49D283A8D63ED258EFC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SubregionStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9822306575C85835E5FE9BCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; }; + 982EAE63C76A2B3D14AE71C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CarbonViewWrapperComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 98459CAB4F58A66FC938D5E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiDocumentPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9867AEE9DE17D49C8D178DED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; }; + 9949FC28A43624DCA6E72AB2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleMessageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 99B77DD42E04FF0406D09889 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageSequence.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h"; sourceTree = "SOURCE_ROOT"; }; + 99BB5424E0582BC9F57DEC0C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLHelpers.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9A31450E90F82EE417285AA4 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = "SOURCE_ROOT"; }; + 9A92AF90D2DE11B7228156DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 9AA91D1ED0BC9774E7CB390F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_CommonFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9B43C25A5A9D794511B62DE9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NormalisableRange.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h"; sourceTree = "SOURCE_ROOT"; }; + 9B922474922B177945F847E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9C5945E0DC5A478CD297A376 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h"; sourceTree = "SOURCE_ROOT"; }; + 9C5DA61556665B8C43C75766 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9CCC3B66878D449D2DCDC072 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; + 9DC2B8E2EDAC6F936794F104 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; }; + 9E2DA063D5F5732154FA5695 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9E641791FABF2F1A03D78D88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Sampler.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h"; sourceTree = "SOURCE_ROOT"; }; + 9ECBD7383597DCB0BA7E6C4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; }; + 9EFF96B9B3A23A7C056B0581 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9F6E4A7EDED0BD437EA25530 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 9F8D6C1ABD279ED354B62B08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9F96C238E158C87719F9FB28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsSoftwareRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9FD68FE75C0CBD0896E4EBCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + A08D898FA47DA70C12397B24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandInfo.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"; sourceTree = "SOURCE_ROOT"; }; + A0E313527F80F4583588DDB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImagePreviewComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + A19ACE84BA53D03B2616C50E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + A2057629D84C356687762D52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; }; + A24F8BB798A8E2C170DC8518 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoManager.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h"; sourceTree = "SOURCE_ROOT"; }; + A331D72512A603E04C52418A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h"; sourceTree = "SOURCE_ROOT"; }; + A4096A02463E8B010F9C59C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableEdgeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + A4545B5C8FFEC73F3BBB79D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; }; + A481F43C38871D9458B86F28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChangeBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + A57A0737C8A86F58F2027B07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageConvolutionKernel.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h"; sourceTree = "SOURCE_ROOT"; }; + A58BA491BD292B245D238175 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; }; + A6CFE6A91CA9226F18A49047 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Typeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h"; sourceTree = "SOURCE_ROOT"; }; + A6DC6B697FE764CC8C71A353 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WavAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + A7414C940C8F954895DD635B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + A7486D0AE6A75CB00582B51C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + A7A5CB392CC227CDF5EA7E1E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; }; + A7EE468F62EBFEF5E321277F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponentPeer.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + A861457F5ADA0DF46036D910 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODevice.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h"; sourceTree = "SOURCE_ROOT"; }; + A86D67E68CFAD9B334F516D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TargetPlatform.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h"; sourceTree = "SOURCE_ROOT"; }; + A8C62A3036CF6C50780F502A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModalComponentManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + A8F70411AAD4401197959817 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; + A91EC6BEEDB3A81DB243C7AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + A91FB8F8BEB8F27DFE68530C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; }; + A9A0D3FDAD0313E1A77E2D49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Clipboard.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp"; sourceTree = "SOURCE_ROOT"; }; + A9BA788E9221207C0E3DD4FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginInstance.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h"; sourceTree = "SOURCE_ROOT"; }; + A9DEBF10F4F5CCD5F66E0BA1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; }; + AA246BE1680359142F137B21 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_android.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_android.h"; sourceTree = "SOURCE_ROOT"; }; + AA373E7C7118660F103ADE1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BasicNativeHeaders.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h"; sourceTree = "SOURCE_ROOT"; }; + AA8DECA06405D75F5B11AD35 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_posix_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + AAB733F168F8456A393AF5DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB1D06FA6F324B4EF0F64315 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB3926902813D7BFAAEDC63E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h"; sourceTree = "SOURCE_ROOT"; }; + AB57B8C265A51D69103BE0A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AnimatedAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB76CA14B22B4705C37C98F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GenericAudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + AB7A36EE23451E5D75C7177B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DragAndDropContainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + ABAEF348E52D72E922D48549 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_ios.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_ios.h"; sourceTree = "SOURCE_ROOT"; }; + ABDC257562E695849038BFF1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MD5.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC1F2D3AD5013F289045A73D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FlacAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC67DBAF871C7E7FADCBD638 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AC816BF89888674E19241E6F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardState.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp"; sourceTree = "SOURCE_ROOT"; }; + ACB76D7E2C25A4817C8FDCBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentPeer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h"; sourceTree = "SOURCE_ROOT"; }; + ACFA5D787D7AA1BA428CE54F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SplashScreen.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h"; sourceTree = "SOURCE_ROOT"; }; + AD151BCF6658FF033B9789AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + ADD90AB47B68EADAD7D3F725 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ActiveXComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + ADECBEF533CED2D774B99350 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; }; + AE6F386520C5A4619B22B213 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathStrokeType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h"; sourceTree = "SOURCE_ROOT"; }; + AE73ADAC40A64E228056B48D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailBase.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h"; sourceTree = "SOURCE_ROOT"; }; + AE852683DCFF55237FB62351 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageListener.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + AEA4CD32C4FE456E56506C23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Matrix3D.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Matrix3D.h"; sourceTree = "SOURCE_ROOT"; }; + AEA83A85BDD39CEC3FBD9176 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; }; + AF3CEE3137EE41BEECC78DF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Font.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp"; sourceTree = "SOURCE_ROOT"; }; + AF542737B98F49AD978433DA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BlowFish.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h"; sourceTree = "SOURCE_ROOT"; }; + AF761727AC666D34DCB621A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableBorderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AFEDC927801DC56DF3222349 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; }; + B01992821789AFF657A25A95 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentAnimator.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp"; sourceTree = "SOURCE_ROOT"; }; + B06A9120276E8875161CFC7D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + B0A56FF4F9C81D030BD6451E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + B0B31336947A0323C5C4FC62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDirectoryScanner.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h"; sourceTree = "SOURCE_ROOT"; }; + B0CBCE56504234420DE443DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"; sourceTree = "SOURCE_ROOT"; }; + B0E0C7BC1C51A5AB11B8939A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; }; + B1662FEBC72BD0D6D068E213 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsPostScriptRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B176F86F3C87EEE822E2F155 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NotificationType.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h"; sourceTree = "SOURCE_ROOT"; }; + B17EE731C57CDAAA661BD735 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h"; sourceTree = "SOURCE_ROOT"; }; + B18908C24779B2DC62D8C08B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AbstractFifo.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h"; sourceTree = "SOURCE_ROOT"; }; + B1DACCEFB2AE44E4BB214303 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; }; + B2261516B51551B88412A38C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HashMap.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h"; sourceTree = "SOURCE_ROOT"; }; + B22CB865D154CC006269A7AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; }; + B2B86A2F102CFD8E8488FC63 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VSTPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + B2D68A91A110274673CE3A35 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FloatVectorOperations.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"; sourceTree = "SOURCE_ROOT"; }; + B33B4C53CBF14DDD6E19F8C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinate.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp"; sourceTree = "SOURCE_ROOT"; }; + B33D87EF6A59AC05F1B4251F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_data_structures.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h"; sourceTree = "SOURCE_ROOT"; }; + B49C928BA4089911E571B50C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSampleBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B4BE33CAEF343E0FD4B10103 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePointPath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h"; sourceTree = "SOURCE_ROOT"; }; + B5165CA4DFC958B7185475D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; }; + B597558E965007A285B6BA6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPositionBehaviours.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h"; sourceTree = "SOURCE_ROOT"; }; + B5B7E1F6324C6FD60A297F4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h"; sourceTree = "SOURCE_ROOT"; }; + B622AB21181705574D25C112 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AttributedString.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp"; sourceTree = "SOURCE_ROOT"; }; + B624AE4FAFD32FBF417CACB0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Files.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm"; sourceTree = "SOURCE_ROOT"; }; + B673500427558C93AF003B49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPath.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h"; sourceTree = "SOURCE_ROOT"; }; + B6C9C5BEA347D048018E3C3D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_QuickTimeAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + B723FCD7D774BA8C2004A66C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + B78BF0336B88A8417A36789C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLFrameBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B78F210CBEC98DC3927F6279 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + B7AC44300255D3234F62D5BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B7CDEAD8A6351A5E844D7C49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + B7E426E1537A9A4C368F77B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h"; sourceTree = "SOURCE_ROOT"; }; + B7FC0F16FE7E00A23076CFB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; }; + B83E98C1E52484053B83DF16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; }; + B84ADDD01BAB1B1E21DDFF07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; }; + B8919AC8BD1D96967D930C30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + B89336F07FA245BCF095469D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandTarget.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp"; sourceTree = "SOURCE_ROOT"; }; + B89C7A3A8EB390F6E84BF882 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; }; + B8A3E8BB179C8B50164D615B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooserDialogBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + B9146449549D87B1DAA4C0B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListenerList.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h"; sourceTree = "SOURCE_ROOT"; }; + B978D74769BDCFDB114870D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorPlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B99ECC1A59ABBFAD154DBF9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Draggable3DOrientation.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h"; sourceTree = "SOURCE_ROOT"; }; + B9BB092F62BADC4763052242 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorGraph.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"; sourceTree = "SOURCE_ROOT"; }; + BA1B1CEFBFF576EAF0692B46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + BABE3E04A41600A763AC8AF5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + BACEE7DB80647D962F0DBDF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; }; + BAFE4394BEC0E150AF48BF9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PlatformDefs.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h"; sourceTree = "SOURCE_ROOT"; }; + BB3684BF46B63D81675D0BE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + BC1276921CB154EB04E5EBAE = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + BD70FA4626657FF1DEBB10DA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + BD8165288D223488734845AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + BD9613A2555B6D5D4C42736A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DragAndDrop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp"; sourceTree = "SOURCE_ROOT"; }; + BDCE808BFAD59C06CBBFE776 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + BDE2EEE22C37170F8CEA8797 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterProcessLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h"; sourceTree = "SOURCE_ROOT"; }; + BFA5DC7CE5598B5C2FE149D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + BFC744DB1B385F6C0E8D1554 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageConvolutionKernel.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFEB19DB1777D4B340693547 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFF612E6000CE9DEEF603615 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModifierKeys.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h"; sourceTree = "SOURCE_ROOT"; }; + C0064E220804A2A4403BF25B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Uuid.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h"; sourceTree = "SOURCE_ROOT"; }; + C021346BE9368A629B49F866 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; }; + C02D3205CC47AD84F51D9A15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; }; + C02E818DF9C25E072E3F245B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + C0BE59402927B0E12AEB7014 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; }; + C12DBAE88C51C89932CDFDDC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; }; + C2530AB0D290282604A86AFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + C25C525D2EDBC5EFD75C4339 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + C28E74456B994CBEFF443477 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Desktop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp"; sourceTree = "SOURCE_ROOT"; }; + C2B58C343A6660A0323EDE06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Viewport.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h"; sourceTree = "SOURCE_ROOT"; }; + C2C0A562597168B80B601578 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Misc.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp"; sourceTree = "SOURCE_ROOT"; }; + C306A51355C1AB54D28E16F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AffineTransform.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h"; sourceTree = "SOURCE_ROOT"; }; + C3111CF603075D3ECED9F226 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableCornerComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C35FAD80CDE9225FE8939818 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBoundsConstrainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + C361A86BBF930196D9EEF24E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SparseSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h"; sourceTree = "SOURCE_ROOT"; }; + C37008FE99C11BB796974235 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextDiff.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp"; sourceTree = "SOURCE_ROOT"; }; + C3B6F57443BFFA1E5631B596 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentAnimator.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h"; sourceTree = "SOURCE_ROOT"; }; + C3DBF05F1066720451E2078D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + C425F930263580F64831D9F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C46B214480995750981835A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WASAPI.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp"; sourceTree = "SOURCE_ROOT"; }; + C529D64EFD3FFC856653E03C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; }; + C58464A1705EB8BA0C4C67B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResamplingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + C5F759D80F99D4781D8CAB2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; }; + C6427BB39C1B2EE3044ACD0C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + C6A2C9D09ED83DAC671EBE58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourSelector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp"; sourceTree = "SOURCE_ROOT"; }; + C6D29AF6D9C958518FDD217D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_File.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.h"; sourceTree = "SOURCE_ROOT"; }; + C750C5923B4766263329A9C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + C751B4E213343FF77A0681B6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + C77007B23C05C06BD0C869B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicObject.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h"; sourceTree = "SOURCE_ROOT"; }; + C784E011BA017F188F2064C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + C7FE38B73D4465AFF7A6DE68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInactivityDetector.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h"; sourceTree = "SOURCE_ROOT"; }; + C93A3A190653E956062C3664 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextLayout.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h"; sourceTree = "SOURCE_ROOT"; }; + C95DDDFEA9D017C9AFEBCF48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + C96F3FE78CB92F428474CBE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PixelFormats.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h"; sourceTree = "SOURCE_ROOT"; }; + C9C6E93243BC759D11517CC2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C9E66024B6626A70FC3BB359 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_String.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.h"; sourceTree = "SOURCE_ROOT"; }; + CA090BCA3BA1590142295E0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CA09B7EB9B9E4E867280F85E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XMLCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + CA11F6F4E56E77470FE8D09E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CA8A586B734D80BEADCAD8CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; + CB2089CB6FCE772E8BEDB0A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CB4D18D09CC768F84665E259 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; }; + CB4F3175207004E4E368DED7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; + CB5B87D094112699DB091CAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UIViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CB821AF522BE03A84EA7C92B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedAudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + CBC7832A02C0137078518DC5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; }; + CC18CE89819CC8D1218EE462 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; + CC567FAD26B9E394A678C1EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + CD0CD22666E6AC88E35F01BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Synthesiser.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"; sourceTree = "SOURCE_ROOT"; }; + CD1B5B3A90067C61ED51B3B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + CE21B3DE9134974FC3432234 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; }; + CE29883C83A0CF37463E7944 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + CE40D5629763EC3C551CA1BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; + CE89263BBF56D5FEC9AB8867 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NativeMessageBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h"; sourceTree = "SOURCE_ROOT"; }; + CE94014A314EE7D89859551E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + CEAA216C55B19BDA0EC8CEE7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CEF724781B62A0C66F89313F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF0EDBCB4673BF9FFD4C933C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsPostScriptRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + CF49EF512FC567BB9429E378 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF4C39DEDE3B5A8D188838EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF6F2D6D175E7BD93D969A64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePoint.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h"; sourceTree = "SOURCE_ROOT"; }; + CFB45934EB9FA463FA984F6F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + CFD132190F1F02F6241F4546 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + CFE07619476ED38EAC6F9647 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D0036D9FA73138C1E5EDF333 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardState.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h"; sourceTree = "SOURCE_ROOT"; }; + D0EB5A8457B29149A94236FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; }; + D1541A8D28A7E2DA898DB59D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Viewport.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp"; sourceTree = "SOURCE_ROOT"; }; + D15914EEFE2CA042E302C786 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + D190465EBAD29EA6160F4127 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + D19DEFE723E50138AC8ED9BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; }; + D1BB52076C130046B5415EF4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OptionalScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + D2026CB37FFDE5628F9F2744 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D22534A41E9BE6B47C9D7174 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsRegistry.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h"; sourceTree = "SOURCE_ROOT"; }; + D2542778D9FD06E8EA7A9588 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleMessageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D316E361296F28165ED17FBA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AiffAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + D3733B6D3F7076FFBD78E7D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPairArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + D37F73F569826C561E9E3CAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D3B2355F44296AD9D95EB818 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLImage.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + D3B9F06E8AB5BDEA5E7D40FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; }; + D3BFF0E11D3F9A7418ECA895 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemFactory.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"; sourceTree = "SOURCE_ROOT"; }; + D3E6E10241BBF62F012DE17B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableCornerComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D415AB806C286DA891754669 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HeapBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h"; sourceTree = "SOURCE_ROOT"; }; + D495C8AEA9C425AEAD4C4C71 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KnownPluginList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h"; sourceTree = "SOURCE_ROOT"; }; + D4B969973C0512F6EB6FA8F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPress.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"; sourceTree = "SOURCE_ROOT"; }; + D4C1710FD87D3FA13578AB06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + D5330C75A79D3FD00D88FF09 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D5963FFBD0218E61EEF08DB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + D5C686A4A13CFB91BF5D9872 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_QuickTimeMovieComponent.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + D61868F31EC3C8263BE5B245 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + D62F91E1F9DEB23A673CC1F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; }; + D63F2AC41A283C157196FB86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; }; + D66DBA597A75CF2493B59196 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; }; + D67366CBC83982075998AA7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemStats.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h"; sourceTree = "SOURCE_ROOT"; }; + D78365C74082A1253E12AF17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; }; + D7D4FEB8E7079BF5B134D6B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationBase.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h"; sourceTree = "SOURCE_ROOT"; }; + D7F68D8960AACA6245520A48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponentPeer.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + D80D581E223759749FE8D070 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; }; + D8D8E59CC4906683F54E9E47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + D93E3D50064EC0D791C9B0EA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + D94DE0E3A7E3FD8EC33DFEFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; }; + D9E19C612A4FA1C4A7B46527 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToneGeneratorAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + D9E37E3E825916FFC5391BCC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + D9E7F3EEF988179D04967CCA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLRenderer.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + DA2FFAF8C0EB7C47B430EE81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImagePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + DA50A3FF89D3196E58D52B67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Reverb.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h"; sourceTree = "SOURCE_ROOT"; }; + DB4FC6CEF47E8B3D7CB815B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + DB56D9790F29378B0216B337 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPress.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h"; sourceTree = "SOURCE_ROOT"; }; + DC0CA22BBBC628E6EBDE0E82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDirectoryScanner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC304B5B9D28E460FA25A508 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioTransportSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC3AF8B79000B8358A770D0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC7DDDB1C5B1333B6B9BF16E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + DD85A7C7C7CBE5563E68D702 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + DD98635CE638C144FA2E242A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BlowFish.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp"; sourceTree = "SOURCE_ROOT"; }; + DE3F83973A82BDECF6ECFFAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceSelectorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + DE7823A252414C8CBA93C5C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; }; + DED4BF9B00F268737A022927 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BigInteger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF65288A6A46308AC0BA2DE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentMovementWatcher.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF6AF4691ADCCB658CDDD3A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CPlusPlusCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF8341365E508EF7C920EC8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h"; sourceTree = "SOURCE_ROOT"; }; + DF8CA42CB14C9E5364E95A15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF8D7EE925553441ABDF0CAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + DFD91A1BE91582A859C4670E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourGradient.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp"; sourceTree = "SOURCE_ROOT"; }; + E0C8E29DC24A765B2E5933B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Audio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; + E0CB2F2E31EC9D0016BD85D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_ALSA.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp"; sourceTree = "SOURCE_ROOT"; }; + E16D622EC9DA6421FFD576F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDiff.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h"; sourceTree = "SOURCE_ROOT"; }; + E17497C4AB8166E29E150D3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDataConverters.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"; sourceTree = "SOURCE_ROOT"; }; + E17B9162F7ADAC361931FBAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; }; + E1BCCD17CADC08D4D9A04EB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MarkerList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp"; sourceTree = "SOURCE_ROOT"; }; + E1D5C29A0E7FAD3D57ECAC13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; + E20FCEA20002673DAB213DE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPath.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + E212786B086F213B7CA4ED6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + E21819B823D258F2BBBF2E26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTouchMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h"; sourceTree = "SOURCE_ROOT"; }; + E2769AA38838844A6522E4FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + E2E9CC735C960A8973F4392C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + E2EC1BD03575EB805C4B596C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E30662968DCE42D8335E2018 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E359F912B3AA352526540013 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageCache.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h"; sourceTree = "SOURCE_ROOT"; }; + E4235522A4F43044A5C38CA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; }; + E44572B81F6B4EAC081E43C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HyperlinkButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h"; sourceTree = "SOURCE_ROOT"; }; + E49DAB373744B917B597168F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + E4B21BCB36AC68D6C668C71A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_events/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + E4CA9545347A800A6C1ED958 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; }; + E4CD3BB664E6B293A11DCB79 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; }; + E5368BA7395DEF8CE20D015C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ProgressBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h"; sourceTree = "SOURCE_ROOT"; }; + E6C669BDC1B76977D02A4496 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; }; + E73FE1D1751A2D585498CD1F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + E77B60A2AAFFB97BEE8787DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLShaderProgram.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp"; sourceTree = "SOURCE_ROOT"; }; + E7D854EC010D103AD186C045 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V1.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h"; sourceTree = "SOURCE_ROOT"; }; + E8DB4F9E74B0A892FF6BCEA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E92C83774EC4A9A14E22109C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrowButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h"; sourceTree = "SOURCE_ROOT"; }; + E9466E9B4B931B30614DB451 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + E994488A0B4220B5CA064DCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; }; + E9C5BFCDB8C13234747AFC36 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Threads.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm"; sourceTree = "SOURCE_ROOT"; }; + E9E0DFA8D3086DFC49FE9BC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnection.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h"; sourceTree = "SOURCE_ROOT"; }; + E9E3B13731D22B3D6F3D2CFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPlayHead.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h"; sourceTree = "SOURCE_ROOT"; }; + E9E561D369DDD9CD345B6EFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + E9E841ADBBC042392915FEFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + EA07D9E1051E8FBBB8C21064 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + EA208A14CC3F7F4FFE7D8962 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; }; + EA5429B693398BBF8E0F2989 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; }; + EB170E698EB7CDECEC5CE6F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h"; sourceTree = "SOURCE_ROOT"; }; + EB344019F1D9C39FFB25E0ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLHelpers.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + EBA666E871E270CD6F91D93A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + EBC68EA7DFAFD1C3480B9795 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; }; + EC8BBDB5C2602261C54A51C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; }; + ECB835BD3A66AC09C9A2373E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutResizerBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"; sourceTree = "SOURCE_ROOT"; }; + ED33A2B09FF895FD2AFA55E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + ED3EEE79647EE49BBBE6D88F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemPalette.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"; sourceTree = "SOURCE_ROOT"; }; + ED8229C37893B6CB49A015E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; + ED8538AE8303587EA5EF8583 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ios_Audio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; + EDDCF64D7E3D1071D1A4456C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectSound.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"; sourceTree = "SOURCE_ROOT"; }; + EDFC0BBD478F8BD69086818D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoableAction.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h"; sourceTree = "SOURCE_ROOT"; }; + EE2BA717DB664BADF933F60B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + EE65A722876EAC5535E2E1B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + EE945B4782B670634758BC5A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReaderSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h"; sourceTree = "SOURCE_ROOT"; }; + EEE5278B630EFE1E15E5293B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PerformanceCounter.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h"; sourceTree = "SOURCE_ROOT"; }; + EF14EE3000D22F77D8EF4AA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF29698E99DE8B5E351EF371 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharacterFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + EF2FF8917F057B26DD01D313 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentDragger.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h"; sourceTree = "SOURCE_ROOT"; }; + EF4C6DC600C1ACC3FCC13164 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF6D81709098F6089B9C09F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TopLevelWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF723B3B26FFC52C7DF6E6FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF8E221F84DBFB90BA0D2121 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + EFDD51F6A181F486AF703F0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h"; sourceTree = "SOURCE_ROOT"; }; + F05F461001AD96C6FC4B5C1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarModel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h"; sourceTree = "SOURCE_ROOT"; }; + F11E22ECFEDD82EB6AE31B39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F12DB648151CB7EEE41E3582 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Expression.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.h"; sourceTree = "SOURCE_ROOT"; }; + F151FE866ECF5DD08EF23B48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ElementComparator.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h"; sourceTree = "SOURCE_ROOT"; }; + F15FDAFFD05E09B75A756D84 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; }; + F1913401D136456F4AF1CBAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertiesFile.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h"; sourceTree = "SOURCE_ROOT"; }; + F1B8D70C8902891CB3FDEFA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; }; + F1F86FFAF4BCB107ED39562B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; + F2269D1A1B850D15450A5006 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; }; + F29D4C985EBD26195FDE1F33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + F2C0E342185658E546F7F142 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h"; sourceTree = "SOURCE_ROOT"; }; + F2D3BDC0E875579221855867 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlyphArrangement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"; sourceTree = "SOURCE_ROOT"; }; + F31D86BA24EC2678D56947E7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + F3236AAEA9276CA4B633DE8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GenericAudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + F323DA193037B345B8B91B77 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + F38318C3981F03CA0DCB810C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F3B5B1EA1A0F1FA07B06B163 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CaretComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F3FBF9B8D43CD49F6284731F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + F4232A519854A8076D1B9222 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipClient.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h"; sourceTree = "SOURCE_ROOT"; }; + F51D8294D9047C68D2B9C27F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + F60198B5239A2A70FBDD83CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilenameComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F66D18E475FEF3DB6F568285 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BigInteger.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h"; sourceTree = "SOURCE_ROOT"; }; + F67B20BDC3763E7C26257339 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; }; + F6CA7D8756206BDEB26554FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDescription.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h"; sourceTree = "SOURCE_ROOT"; }; + F70BCFFF8A0FCDDDB8B8E4BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + F752AE98467F8E7D4CEA7C43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Quaternion.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Quaternion.h"; sourceTree = "SOURCE_ROOT"; }; + F78B51284578A0A67A33F2EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Button.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7A7C95D6FE1A72B58188DE4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7C1341B3E7AE121F6890199 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7F2A8C5CE190B9E1EC47F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F84CFFCD3ADC99BBA44596EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToneGeneratorAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + F8747A84949D635402589C34 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UnitTest.h"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h"; sourceTree = "SOURCE_ROOT"; }; + F8C0B0742DB274931684B5D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + F9081A768B4EB35F3D61E8DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CoreAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + F91867A7117E05D031730E9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Time.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.h"; sourceTree = "SOURCE_ROOT"; }; + F9E8B1F179E908E5A74EE145 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageSequence.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp"; sourceTree = "SOURCE_ROOT"; }; + FA016D0A7169A84A182C404B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + 4B8E8BD3DEAE0C479D04F571 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioAppExample.app; sourceTree = "BUILT_PRODUCTS_DIR"; }; + F96F6A11BD1D60CAEB22A3F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Fonts.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm"; sourceTree = "SOURCE_ROOT"; }; + F9A8389F52F21B93248B1E86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLExtensions.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGLExtensions.h"; sourceTree = "SOURCE_ROOT"; }; + F9FD00F994947C4396D857C5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditorKeyMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"; sourceTree = "SOURCE_ROOT"; }; + FA051E65BFEBED1313E7AD16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + FA9676810AF2F38EBD37199C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AttributedString.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h"; sourceTree = "SOURCE_ROOT"; }; + FAAE7C83BF1CFD11D34A04FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + FACDCE3863025B8A344171CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + FAF51CBC640AA4E56CC7E959 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeTime.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h"; sourceTree = "SOURCE_ROOT"; }; + FB17443A29A0BFCE1499C18E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_freetype_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + FB744E5DA149818A9ED58B6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + FB80D16B738E90DE96B8E361 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + FBBB399A45139BD4F9ED91C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + FBE7E25D937712E9B0F7DE0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Value.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp"; sourceTree = "SOURCE_ROOT"; }; + FD71F052D94248F16F02B388 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableObjectResizer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE52A4CBC9C8CF6D6130DB56 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PreferencesPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE7F21B2C968EDD120A18B00 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GroupComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE8B5BD29D8F426DC6320B17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF805A59A17E6F6F579F0F67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + C366FD2226833583ECDE68D2 = {isa = PBXGroup; children = ( + 2545022A0EE088A0C46EBD13, + D78365C74082A1253E12AF17, ); name = Source; sourceTree = ""; }; + 24BF2D05D134C386864C4C7D = {isa = PBXGroup; children = ( + C366FD2226833583ECDE68D2, ); name = AudioAppExample; sourceTree = ""; }; + F2E49DBAE98ABA5E5C031BCF = {isa = PBXGroup; children = ( + 788905256655086DF636DD96, + E17497C4AB8166E29E150D3B, + B49C928BA4089911E571B50C, + 2FB247186481F5110B579138, + 32EBBC998E5AD83676410646, + B2D68A91A110274673CE3A35, ); name = buffers; sourceTree = ""; }; + 20B9CD59936ECA4363FCCCA8 = {isa = PBXGroup; children = ( + B7AC44300255D3234F62D5BC, + 3AAA6A680D5A6C01BACBB156, + 3F4BF347280692C4AD70F2D3, + 7951C7C50178ACD194B54EAB, + AC816BF89888674E19241E6F, + D0036D9FA73138C1E5EDF333, + 5F67D2D514B5D47933082E8C, + 5E89580C8BBEEE0ED5E1D442, + F9E8B1F179E908E5A74EE145, + 99B77DD42E04FF0406D09889, ); name = midi; sourceTree = ""; }; + 0986D33A60CD7179F02B9913 = {isa = PBXGroup; children = ( + E17B9162F7ADAC361931FBAC, + 0BE56E18575B1EAB8F889666, + 43023E9280CA4864EC92D5E8, + 002827E70384CB5051DC2794, + 1DBB7AD294F9BEB842690992, + DA50A3FF89D3196E58D52B67, ); name = effects; sourceTree = ""; }; + EFE5C5B22FE69C3D3F927196 = {isa = PBXGroup; children = ( + 6AD2950DCA3BE8F0254A7BCE, + 5591F52441CBA977CBE18BEF, + BFA5DC7CE5598B5C2FE149D9, + 625FE12CCC970962EE1EC536, + 57800AC773D879C937EFFFB5, + 64AE756DF9D13327062B5CB1, + 28697A80BA58B9660B88AA23, + 1B103C1C32376CBF2394789A, + 82780256661660A08EA18510, + E9E841ADBBC042392915FEFE, + 6FD7AEB33E370BE902A5FAE2, + C58464A1705EB8BA0C4C67B5, + 37E2B8D100CBDDEE568C9D82, + 85615ED90EAA77242E8CDED1, + D9E19C612A4FA1C4A7B46527, + F84CFFCD3ADC99BBA44596EE, ); name = sources; sourceTree = ""; }; + DA41D3DA8DDD60C67A4A2AE9 = {isa = PBXGroup; children = ( + 2B654CF3E5F53432E73B0D86, + CD0CD22666E6AC88E35F01BA, ); name = synthesisers; sourceTree = ""; }; + 42D107F741897BBB52B61202 = {isa = PBXGroup; children = ( + F2E49DBAE98ABA5E5C031BCF, + 20B9CD59936ECA4363FCCCA8, + 0986D33A60CD7179F02B9913, + EFE5C5B22FE69C3D3F927196, + DA41D3DA8DDD60C67A4A2AE9, + 0F29F3A4AE661CEF5467732F, + 23EDC268BE997399F443A16F, ); name = "juce_audio_basics"; sourceTree = ""; }; + CB1B7A138B91EEBE7BFE8C37 = {isa = PBXGroup; children = ( + 3B96138DDA824185B1B0CDC8, + EFDD51F6A181F486AF703F0D, + 2C204E901887EE1AC09282FF, + A861457F5ADA0DF46036D910, + 45BE7811D6EF62D3ACB56906, + 8DFBEB59A237F3A6C0C8401F, + 8F8508660223DBC2BBDDF0DE, ); name = "audio_io"; sourceTree = ""; }; + 11FB0A16BC11F8811563E23C = {isa = PBXGroup; children = ( + 7E9286C0B1EF625BE9B1795F, + 0B10218E1440362CF414330C, + 1F5AB21B8BB5572345F16D3A, + 74432C5237AEAEAD4E57A807, + 1BEE7899664040AC3C5866D0, ); name = "midi_io"; sourceTree = ""; }; + FA179D6940326B16EA8F4EBE = {isa = PBXGroup; children = ( + AAB733F168F8456A393AF5DC, + 058ACC9BACC273A0CD4AD526, + DC304B5B9D28E460FA25A508, + 05F4D303872E30E0E100B178, ); name = sources; sourceTree = ""; }; + DB3BC4FF9BBE474A50B1BD39 = {isa = PBXGroup; children = ( + 40CE01EAB7B475FFDB7B2E27, + FB80D16B738E90DE96B8E361, + F2C0E342185658E546F7F142, ); name = "audio_cd"; sourceTree = ""; }; + 75059FB5256785C4D9234524 = {isa = PBXGroup; children = ( + E0C8E29DC24A765B2E5933B7, + C95DDDFEA9D017C9AFEBCF48, + 4A2E5A69C7177BADB85213F1, + ED8538AE8303587EA5EF8583, + E0CB2F2E31EC9D0016BD85D5, + 1E1FBFEE80C3686ADE3B4F0A, + 6F29FF53262F391E1BCE9081, + 8713AAF990526009F3497D8B, + 60381DB055903614A261149B, + 27E49EEFD8649E9F26DBF49E, + 4A7FA27B8AA27DB409E034B6, + 49D0EA14738CACC0F306EE52, + 5EDD94865096ED9F708C3C59, + 503B205A90B3DE3B0698F302, + 47CFAC810A119132A9B210A5, + 0F40E9138B6D40184283AC89, + EDDCF64D7E3D1071D1A4456C, + 9E2DA063D5F5732154FA5695, + C46B214480995750981835A8, ); name = native; sourceTree = ""; }; + C1CFAF0419BB789AA0E38629 = {isa = PBXGroup; children = ( + CB1B7A138B91EEBE7BFE8C37, + 11FB0A16BC11F8811563E23C, + FA179D6940326B16EA8F4EBE, + DB3BC4FF9BBE474A50B1BD39, + 75059FB5256785C4D9234524, + 86EE91DC473C33C6434AE0D2, + 1CC58E8F3AF64BE9788945BD, ); name = "juce_audio_devices"; sourceTree = ""; }; + A829EEC7C9D388964229DE57 = {isa = PBXGroup; children = ( + 23497CEA84E011F94678DC68, + D93E3D50064EC0D791C9B0EA, + CFB45934EB9FA463FA984F6F, + ED33A2B09FF895FD2AFA55E8, + FF805A59A17E6F6F579F0F67, + DB4FC6CEF47E8B3D7CB815B6, + 49F330138E609BC0B2FCA34C, + EE945B4782B670634758BC5A, + A2057629D84C356687762D52, + 20D894CA430125D6180ACA0B, + 860657C1D332EB6DA4FA0A21, + 1804F385A9B946734797C612, + 5051361BA7E00F1DC38E5917, + B78F210CBEC98DC3927F6279, + CB821AF522BE03A84EA7C92B, ); name = format; sourceTree = ""; }; + FA1254B776BFC3471DB96D0E = {isa = PBXGroup; children = ( + 5AFACEA211E6D5FD20E05486, + D316E361296F28165ED17FBA, + 42FDBC613302FACA9FDA8686, + F9081A768B4EB35F3D61E8DE, + AC1F2D3AD5013F289045A73D, + 0B8875740103D9A0E34317DE, + 8BDD89CC09A6A9A6D525AA03, + 4503ADFFDC985C61C84B5577, + 1ECCF86BD5C7ABBD8FBF6652, + 840FE63195B137B03D9D94BA, + 17C63BCBC9FC8596F5EBED8E, + 29F0D7BF3731A741411D18A3, + B6C9C5BEA347D048018E3C3D, + 31C333E8B5461842ABD53A72, + 2C09E22A2D6F69F847BE5296, + A6DC6B697FE764CC8C71A353, + 50FCEB2875B2FCF29C690911, + 46A0CCA7CD813904C9B38AD6, ); name = codecs; sourceTree = ""; }; + 2A60CB51A3C591E01CB900F8 = {isa = PBXGroup; children = ( + 4C4AD880BD869C2D5B9224A8, + 9E641791FABF2F1A03D78D88, ); name = sampler; sourceTree = ""; }; + BCC969C3BC478853FD7E336F = {isa = PBXGroup; children = ( + A829EEC7C9D388964229DE57, + FA1254B776BFC3471DB96D0E, + 2A60CB51A3C591E01CB900F8, + 47CB49E5D140AD7BC5E7EA6C, + 4C1559D44A5474E65356E7DD, ); name = "juce_audio_formats"; sourceTree = ""; }; + F94E85FEB3110173DE42317B = {isa = PBXGroup; children = ( + E9E3B13731D22B3D6F3D2CFB, + A9BA788E9221207C0E3DD4FA, + 3D5DB95456FD73DF6EF38C62, + 722D1A061B25E3FBA9675BE8, + 24D1CEB29BC23FB571BE0EC8, + 6B49B5DFDC05F282422237A3, + 6D393956AEDE148D19351B48, + B9BB092F62BADC4763052242, + 1199E7838DDE8C2C910335E6, + 8ECCFF38491F5691C77F2FAD, + F3236AAEA9276CA4B633DE8C, + AB76CA14B22B4705C37C98F3, + 1B736A8E8EE2F4C270C8F2FB, + F6CA7D8756206BDEB26554FD, ); name = processors; sourceTree = ""; }; + 9EEB441FDDAE7DD5F3E24041 = {isa = PBXGroup; children = ( + 19ABD47BB707333435D2CF3F, + 2678394F8161FBC107B8426C, + D5963FFBD0218E61EEF08DB3, + CC567FAD26B9E394A678C1EC, ); name = format; sourceTree = ""; }; + 2897EA058D69BF9B0C8A446D = {isa = PBXGroup; children = ( + 5E7FF52478337A319B91DE48, + 6F4DEF59A671D169B8F05260, + 2B3407D0626D7910D74E5730, + 4E0D6764579E37009B0A63D9, + 308A0C14FE5712ACF925AA17, + CA8A586B734D80BEADCAD8CB, + 0E79750D244E5C95E94DAF88, + 7B6963B7C229C4AD0DE95058, + 749977704AA15A0D6FA3B11B, + B2B86A2F102CFD8E8488FC63, + 0F9C7DD8B8CA6807E02134AA, ); name = "format_types"; sourceTree = ""; }; + 83B7987F50AC8F2EE5E1C2A0 = {isa = PBXGroup; children = ( + 570B0C815598550D71518FB8, + D495C8AEA9C425AEAD4C4C71, + DC0CA22BBBC628E6EBDE0E82, + B0B31336947A0323C5C4FC62, + CF4C39DEDE3B5A8D188838EB, + 0AAD0F08AF5170AEB68F9191, ); name = scanning; sourceTree = ""; }; + 0F1330B9E634C8C1D2A19EAD = {isa = PBXGroup; children = ( + F94E85FEB3110173DE42317B, + 9EEB441FDDAE7DD5F3E24041, + 2897EA058D69BF9B0C8A446D, + 83B7987F50AC8F2EE5E1C2A0, + 48695857FE992FD343D3EFF4, + 204605387364B68F56B522C1, ); name = "juce_audio_processors"; sourceTree = ""; }; + 785AC00FC0793B0127274AAB = {isa = PBXGroup; children = ( + 4499B2E19EEA40B3C258C462, + 9598CB11B13DE1EDB5E9621D, + DE3F83973A82BDECF6ECFFAA, + 1ED7F9F098974D1824E98397, + F2269D1A1B850D15450A5006, + CC18CE89819CC8D1218EE462, + AE73ADAC40A64E228056B48D, + 7A48CB105C5EE20B2AAA3491, + 1C53C4F34A3547694B6DC964, + 64E1EEF02B157E8DC3C242BB, + D37F73F569826C561E9E3CAF, ); name = gui; sourceTree = ""; }; + 7B29609B00A97DB47552F081 = {isa = PBXGroup; children = ( + B978D74769BDCFDB114870D6, + 7DA009176BAA3DAD1B35F5F0, ); name = players; sourceTree = ""; }; + DCA2C59535A97CCC2E7E5D5B = {isa = PBXGroup; children = ( + 785AC00FC0793B0127274AAB, + 7B29609B00A97DB47552F081, + D190465EBAD29EA6160F4127, + 09E6748FEA21346ED9524265, ); name = "juce_audio_utils"; sourceTree = ""; }; + D4AD8131D5DDC542D8D8462D = {isa = PBXGroup; children = ( + 85E37A3DAB080D6B242D79BF, + EF29698E99DE8B5E351EF371, + 5C5D51EC34D374F2405AD2D6, + 3C04C48B58867EA02A19DEB9, + 3CA397FE5872CE6CB0F72442, + 62B74684D8983778FB42B8C3, + 7F5DE79ABF9B521118C290F4, + 2091E99CE600D2CE4AB578ED, + 1FDE5979B036F7ABC463E315, + 80F49A74411A436E02B91E27, + 464DA97D2978A2CA768B8245, + 5A3068DBC997E07FD8AB7989, + C9E66024B6626A70FC3BB359, + 7B4708510F9CF37DBFCBCB9B, + E4235522A4F43044A5C38CA9, + D3733B6D3F7076FFBD78E7D6, + 6BD68AEA29A058378C87C8F0, + 0744962768C86A35D6715A15, + 8D007FFA9CCC8CFC8CFA710F, + 3B1E4039E71D8E5914733F30, + C37008FE99C11BB796974235, + E16D622EC9DA6421FFD576F3, ); name = text; sourceTree = ""; }; + 66CEC72801EF9BE77D39B19F = {isa = PBXGroup; children = ( + DED4BF9B00F268737A022927, + F66D18E475FEF3DB6F568285, + 7D01F2D239C0CCAE25928D26, + F12DB648151CB7EEE41E3582, + 7EF6686711E9C204C92847B7, + 9B43C25A5A9D794511B62DE9, + 17E6C78A4D618FA739394B9A, + 40BD3111FD3F59098D84C7BE, + 3226B9DE4C4E839CB4918EED, ); name = maths; sourceTree = ""; }; + 9C56D83D3BDD05DEF239F71C = {isa = PBXGroup; children = ( + 753A34F64B6F73A234F98929, + 5B98A0AA65983E10EBD10268, + 1207768208DE16246677EEB7, + D415AB806C286DA891754669, + 2F67F63DB8A9E866D2E9A38E, + 0B0A6273D0438F94A0C00793, + 62B12DB571E5AC1A5A5742DC, + 032DDE8B772727B97389F022, + D1BB52076C130046B5415EF4, + 0C9B17E257DF0D263890AC69, + 39ABB40231FE7BB0695CFF2A, + 6A972BA75B3E0AEF10002FC9, + 9CCC3B66878D449D2DCDC072, + 81A363C999CB90C9740E389D, ); name = memory; sourceTree = ""; }; + 7F38B22DBF6D9255AD0FF626 = {isa = PBXGroup; children = ( + 14DC16A9C4FFE20764935170, + B18908C24779B2DC62D8C08B, + 1F87E9DB5370F34BDCA80E61, + 1D90D583FA45AECD95ABCA46, + 5FDBE725B1D50CE6927CBF90, + C77007B23C05C06BD0C869B5, + F151FE866ECF5DD08EF23B48, + B2261516B51551B88412A38C, + 6688F08F6C632F118C44F6DF, + 7F515A5C01BF1E9F1425DC3A, + E4CA9545347A800A6C1ED958, + 7C832E30FE9BFBEFAE887F8E, + F1B8D70C8902891CB3FDEFA3, + B0E0C7BC1C51A5AB11B8939A, + C02D3205CC47AD84F51D9A15, + 5742F3D06FFAE3F44F6B7DDA, + 62F4498F48F1C7EF813E51C6, + C361A86BBF930196D9EEF24E, + EA5429B693398BBF8E0F2989, + EBC68EA7DFAFD1C3480B9795, ); name = containers; sourceTree = ""; }; + 0AB06DB5C2631EB668C528A2 = {isa = PBXGroup; children = ( + 250858304ABC5EC4C5B9D876, + 49F2DE82396CA941290096FA, + 3C7C34849B551EF325EEA9BC, + B1DACCEFB2AE44E4BB214303, + C02E818DF9C25E072E3F245B, + 3105D7A9F6BA318B79DDC438, + BDE2EEE22C37170F8CEA8797, + 9822306575C85835E5FE9BCF, + 5FA71CC7ECD6246187689CFF, + 757A8B98F9B75716D85DF54B, + 7932BB2CDF0BBDB550253B6C, + 7FF5DA77AE30BCDFA2A8B774, + 938F57CE18456266C6E99FC4, + 8BC61A14226B424351065683, + 159C514EC2AC5B7C89F19F37, + 9DC2B8E2EDAC6F936794F104, + EC8BBDB5C2602261C54A51C3, + B0A56FF4F9C81D030BD6451E, + 9ECBD7383597DCB0BA7E6C4F, + 4D9D135A8094707A4386F0D3, + 5CE19C97928B677F84758FD1, + C0BE59402927B0E12AEB7014, ); name = threads; sourceTree = ""; }; + 403635C774A6BBC0F6980B64 = {isa = PBXGroup; children = ( + 74D66A66106B1B8915E67A6E, + EEE5278B630EFE1E15E5293B, + 4AC22D39210D3189BF3C6305, + FAF51CBC640AA4E56CC7E959, + B5165CA4DFC958B7185475D2, + F91867A7117E05D031730E9F, ); name = time; sourceTree = ""; }; + BC7512A77A4AB71F889C67BE = {isa = PBXGroup; children = ( + 3EA94E228D9E4956494DEC53, + 7CF9048281002D8D75F98E1C, + D80D581E223759749FE8D070, + C6D29AF6D9C958518FDD217D, + 37F722083290923E7CC45301, + 16E0712BBC4355F3D2854D5D, + 60525010BB1C88CF6C61E37C, + F323DA193037B345B8B91B77, + 6A1833288C936779BEBCF1E7, + 6943B698E1ED12866C3801EF, + E20FCEA20002673DAB213DE6, + B673500427558C93AF003B49, + 9C5945E0DC5A478CD297A376, + FE8B5BD29D8F426DC6320B17, + 9867AEE9DE17D49C8D178DED, + B7CDEAD8A6351A5E844D7C49, + 28EB7629415CAFD5EA443ADD, ); name = files; sourceTree = ""; }; + 8BBFA220942050CA89C4222B = {isa = PBXGroup; children = ( + 90B68551E96B0F8464427C04, + 892492AF888E54878EBDF2A8, + 7B1D859AB5CE56CB8E6A7A4A, + 539A97B08CE5685F52310C66, + 7D2590A39618C876E14DF353, + C021346BE9368A629B49F866, + AFEDC927801DC56DF3222349, + 0DDC18CBD62470AE422E4571, + 956FB59B79B022DB0559F9E2, + 8C54EA0E09130998E1F1990F, ); name = network; sourceTree = ""; }; + 50B1E864B2356E8572B9A62F = {isa = PBXGroup; children = ( + 125FF844F4BED2DA55F1CB14, + 0FA2744FC75AA85A7B01AC72, + 439CD9F942C3BEB5F038C381, + 5BFF939FEACE52CFB95AA8ED, + C12DBAE88C51C89932CDFDDC, + C750C5923B4766263329A9C0, + 9A92AF90D2DE11B7228156DE, + 6393A472E16D29D70C0734E6, + E9E561D369DDD9CD345B6EFE, + 3A028505018E28D11D56FE59, + 247DBA4DAA228F551077F55D, + F7C1341B3E7AE121F6890199, + 83786BF097A3C08DF18DFEF4, + 97BB49D283A8D63ED258EFC9, + 7EF48AEB39EA3783BB388FCB, ); name = streams; sourceTree = ""; }; + 401A32949AE4A75BF94D58BF = {isa = PBXGroup; children = ( + 0D9FFE7342AC6AA69831D982, + 58E83747D5DAC8B6A43E07E7, + A91FB8F8BEB8F27DFE68530C, + 51304425CA1B8E486172E4BB, ); name = logging; sourceTree = ""; }; + 8C087A97055FFF267ADC28DA = {isa = PBXGroup; children = ( + 30A53BEDFFCEA0BF3C85C0B8, + BAFE4394BEC0E150AF48BF9D, + 22602331F3048F760A57DF0A, + 74D8E7D66C117C36874EE01D, + D67366CBC83982075998AA7F, + A86D67E68CFAD9B334F516D3, ); name = system; sourceTree = ""; }; + 03A962E8ACDBD0C24CD014AB = {isa = PBXGroup; children = ( + EE2BA717DB664BADF933F60B, + 4ACC11DF3E3FAD545226B517, + 8F37C35FD44479FF319138E5, + 7C677CA8CE54B378D929796D, ); name = xml; sourceTree = ""; }; + 1F04306E8F4BD6AA8AFA3185 = {isa = PBXGroup; children = ( + 9176D4AFF29A2331048159E3, + 1A65D6E553E5548D50FA59F8, + 784B8A83FD421680BC516E53, + E6C669BDC1B76977D02A4496, ); name = javascript; sourceTree = ""; }; + EB6A51E5AA5A5C974F82075F = {isa = PBXGroup; children = ( + 0F09FC5EE1D8696669386810, + 4C0C45AA79B864C0AB7B79F3, + 8F25EC17852F450782DB5F6B, + 61E2C2900EB986229D82026C, + 595A4B842DF683AB9EA79DB6, + 460020F474D8AD5AFA450072, ); name = zip; sourceTree = ""; }; + D31BDA28674C941530C73CA9 = {isa = PBXGroup; children = ( + 79F1D358726869315DBCC398, + F8747A84949D635402589C34, ); name = "unit_tests"; sourceTree = ""; }; + C9B1F8F814FE5B552A67C83D = {isa = PBXGroup; children = ( + 025BB62BCFB9BC624B6C65EC, + 3BF362FE18A7BC55816C4465, + 6E9ACB572E3F6EC33F1718BE, + C0064E220804A2A4403BF25B, + D22534A41E9BE6B47C9D7174, ); name = misc; sourceTree = ""; }; + D9B6523138F19B60DEABC1CA = {isa = PBXGroup; children = ( + D61868F31EC3C8263BE5B245, + 2E74287A8B3F00266B67AA83, + C2C0A562597168B80B601578, + 6D426654FEF78C4A3F5210AF, + E9466E9B4B931B30614DB451, + DF8CA42CB14C9E5364E95A15, + AA373E7C7118660F103ADE1D, + 9AA91D1ED0BC9774E7CB390F, + DC7DDDB1C5B1333B6B9BF16E, + 813D0754B88F11BEF7E5F9B0, + 2CB331F5BE20779E5AEBC540, + 3B609DEA3235848EA822C8AD, + B624AE4FAFD32FBF417CACB0, + 2B17BC5C2C35FFFDDCB35B68, + 2ACEEEDE012463EC66132BA6, + 4EE687A57FE874A6A2386F90, + E9C5BFCDB8C13234747AFC36, + FAAE7C83BF1CFD11D34A04FD, + AA8DECA06405D75F5B11AD35, + CBC7832A02C0137078518DC5, + 43FDB7EF4E52DAE9FF6D162B, + 2E2953742C1431A70048C873, + AD151BCF6658FF033B9789AD, + 1EF8CC1985D194D8B5FA91FC, + 1957F896F4DDB12033F0E84D, + 18D45688D8F8717DC47D1E83, ); name = native; sourceTree = ""; }; + 134363737026CC80D69F48A5 = {isa = PBXGroup; children = ( + D4AD8131D5DDC542D8D8462D, + 66CEC72801EF9BE77D39B19F, + 9C56D83D3BDD05DEF239F71C, + 7F38B22DBF6D9255AD0FF626, + 0AB06DB5C2631EB668C528A2, + 403635C774A6BBC0F6980B64, + BC7512A77A4AB71F889C67BE, + 8BBFA220942050CA89C4222B, + 50B1E864B2356E8572B9A62F, + 401A32949AE4A75BF94D58BF, + 8C087A97055FFF267ADC28DA, + 03A962E8ACDBD0C24CD014AB, + 1F04306E8F4BD6AA8AFA3185, + EB6A51E5AA5A5C974F82075F, + D31BDA28674C941530C73CA9, + C9B1F8F814FE5B552A67C83D, + D9B6523138F19B60DEABC1CA, + 81F4BB6ED7E34DC3C55BDA51, + 543AABF5A9378ECC67318D8B, ); name = "juce_core"; sourceTree = ""; }; + D7FE02721660A0F1ADDE0BED = {isa = PBXGroup; children = ( + DD98635CE638C144FA2E242A, + AF542737B98F49AD978433DA, + 6C67E93B6C5835F8C56C4D99, + 18710CAA88A2662E51D49808, + 6382DAC327D5E3173D6181B9, + 76F6FE05DE3CD997025CC52B, ); name = encryption; sourceTree = ""; }; + 12A6E418E243AFC94B96A6E1 = {isa = PBXGroup; children = ( + ABDC257562E695849038BFF1, + 951CBABFDEE3D2B3D9B4B5AA, + 8AEE85FD33BBE1492B96A865, + B17EE731C57CDAAA661BD735, ); name = hashing; sourceTree = ""; }; + 367D3E7B1A3582D5693B9FC3 = {isa = PBXGroup; children = ( + D7FE02721660A0F1ADDE0BED, + 12A6E418E243AFC94B96A6E1, + 3FFEA694C92E8634104DEF64, + 19C6E03C8D0761B9A3734BA7, ); name = "juce_cryptography"; sourceTree = ""; }; + 1DD90061ACEAF4356BC3D3CE = {isa = PBXGroup; children = ( + FBE7E25D937712E9B0F7DE0B, + 60643938F8115C4B9C64B3EE, + 0680C56908E9B9FC6E45C181, + 51585B78DC89C3B8C60FB051, ); name = values; sourceTree = ""; }; + C283CAA3B222E566D9C79EC2 = {isa = PBXGroup; children = ( + EDFC0BBD478F8BD69086818D, + 580051596DD113F78E262642, + A24F8BB798A8E2C170DC8518, ); name = undomanager; sourceTree = ""; }; + 723121B288F8EB847FF98DE0 = {isa = PBXGroup; children = ( + 83C9D49A4F81FA401E41784E, + 3FCBFAAF81329700C9160C94, + BFEB19DB1777D4B340693547, + F1913401D136456F4AF1CBAA, ); name = "app_properties"; sourceTree = ""; }; + 6BF9D16DF121408ADF8D243D = {isa = PBXGroup; children = ( + 1DD90061ACEAF4356BC3D3CE, + C283CAA3B222E566D9C79EC2, + 723121B288F8EB847FF98DE0, + 41249AFDA317DF598918C5CB, + B33D87EF6A59AC05F1B4251F, ); name = "juce_data_structures"; sourceTree = ""; }; + 017E9B99D428699F1C6D5087 = {isa = PBXGroup; children = ( + 97632D4A7623F329325575B5, + D7D4FEB8E7079BF5B134D6B3, + BACEE7DB80647D962F0DBDF7, + 068CA344569622AC46399E24, + 73D7E3361C9F1DE5D8264E52, + 6423E0F4C4005A16375EDEB3, + 36063F6B7F9D00DAFFACC46B, + AE852683DCFF55237FB62351, + 68E8FE815DF6E2C80022845F, + 4E49D3DFA722AF35FAC2ADEE, + 739B11A050C45AF258B06387, + 0115C9169A12F36DD8CEBB70, + B176F86F3C87EEE822E2F155, ); name = messages; sourceTree = ""; }; + 39D10AF212D901043F60E411 = {isa = PBXGroup; children = ( + 23FA7D4C4D291A54A41B05B9, + 201AAC61BD1439D0404CD52A, + 9C5DA61556665B8C43C75766, + D66DBA597A75CF2493B59196, ); name = timers; sourceTree = ""; }; + FA63A4FEAF47A149B05B2D7B = {isa = PBXGroup; children = ( + 11CFE8D169BB1FA1424C433C, + 862FF5E7777476A7D3E98CDF, + 5BA48D2E6A144E1105C70292, + F7A7C95D6FE1A72B58188DE4, + 954B1EAA307AD2C0889EBBD4, + A481F43C38871D9458B86F28, + 967BE7DD4F2AA7AA8F9738CB, + 951F9F842B6D39ACA7107024, + B9146449549D87B1DAA4C0B3, ); name = broadcasters; sourceTree = ""; }; + 5F95B461A46B124271F4D4C2 = {isa = PBXGroup; children = ( + 1664A35158FBA71AADCB379D, + 3EC17246B581310C23EA5F63, + CE40D5629763EC3C551CA1BA, + E9E0DFA8D3086DFC49FE9BC8, + 2864CE464B03FFF3AD5A24F5, + 16ECD7B6A2A11154B3D86015, ); name = interprocess; sourceTree = ""; }; + 259A4043A2C33A2F7542D782 = {isa = PBXGroup; children = ( + 844E060288C67CAB524751E6, + 8571CD08413C205569405EFC, + 15B818119E54576C2C7BE206, + 336617A6E385E55360312EF8, + 88B96C6E76F7B08D38F859F5, + 3AF9A6DA9497798FDF6D2FAA, + 2EDB0A77DEEF290EAA07A3E1, + 4D0E742ECB7DB1F70BF615FA, ); name = native; sourceTree = ""; }; + FB86CB37A490EC9DB740D91C = {isa = PBXGroup; children = ( + 017E9B99D428699F1C6D5087, + 39D10AF212D901043F60E411, + FA63A4FEAF47A149B05B2D7B, + 5F95B461A46B124271F4D4C2, + 259A4043A2C33A2F7542D782, + E4B21BCB36AC68D6C668C71A, + 7B274A56879F4B2FF235D6D5, ); name = "juce_events"; sourceTree = ""; }; + E969A83F4C0CF83A078F47F3 = {isa = PBXGroup; children = ( + 3210AE12F825D9CED282EC8E, + B83E98C1E52484053B83DF16, + DFD91A1BE91582A859C4670E, + D63F2AC41A283C157196FB86, + 7EEF7CA291E889AFE6C0384D, + 1BC517563ED432D3E3033450, + 27E26A34A2A3DC9FBF6C6B74, + 4C2A9FBE4440A4885A8E85B9, + C96F3FE78CB92F428474CBE6, ); name = colour; sourceTree = ""; }; + B886B1B89D7773E4E0B443C0 = {isa = PBXGroup; children = ( + C3DBF05F1066720451E2078D, + 5CA0F3D05AD800921797035C, + 62E8A57D8A56097060C92FB3, + B1662FEBC72BD0D6D068E213, + CF0EDBCB4673BF9FFD4C933C, + 9F96C238E158C87719F9FB28, + 3187437331BDB6E116DFD5B7, ); name = contexts; sourceTree = ""; }; + F309B3269E76DE120143DD91 = {isa = PBXGroup; children = ( + F67B20BDC3763E7C26257339, + 95BAAE8ABA96F23E47FE028D, + 3A320AE2ABD9443FAA57246B, + E359F912B3AA352526540013, + BFC744DB1B385F6C0E8D1554, + A57A0737C8A86F58F2027B07, + 6031083E4E57E154D327DA8B, + 8E9126330B355156F8790C70, ); name = images; sourceTree = ""; }; + F59D71157F4D41C4D4816141 = {isa = PBXGroup; children = ( + EF14EE3000D22F77D8EF4AA7, + 486C18005FCEA3E0FC43A3D0, + 74DEE32EAF63AB159CB78CCE, ); name = "image_formats"; sourceTree = ""; }; + 6E98284B2337B8ACB6DB657C = {isa = PBXGroup; children = ( + 8B62E15410E8C49EEF12207A, + C306A51355C1AB54D28E16F0, + 5C60278796530C3DA50276C6, + 2E7AE6E8520AA41965C96D58, + EA208A14CC3F7F4FFE7D8962, + 178C4671AD0A7572A5C23B8B, + 75F1705A66786F7665E5D95B, + 0A919F08E0442BC95072112F, + CF49EF512FC567BB9429E378, + 63B6DFA1DCF2656DF1AED8E4, + 02D59F4CAD8301ECCB3ED6C8, + AE6F386520C5A4619B22B213, + 7DA7642888744B79CAB96BC7, + 2D297AFC8E8E9B519D00CF26, + 87119953571F038DDDD7F9BD, ); name = geometry; sourceTree = ""; }; + 2E6FA1D06FBF4A4F13B37ACE = {isa = PBXGroup; children = ( + 244B7290EA0ADF1E7F5F95E5, + 10FC26BFC760FDF31F7EF24D, + E4CD3BB664E6B293A11DCB79, ); name = placement; sourceTree = ""; }; + 6018A5E91B7A26DA24103F9F = {isa = PBXGroup; children = ( + B622AB21181705574D25C112, + FA9676810AF2F38EBD37199C, + 07E25F36485450F905114EB6, + B89C7A3A8EB390F6E84BF882, + AF3CEE3137EE41BEECC78DF8, + 866A93C4479BDE4577F5E7B1, + F2D3BDC0E875579221855867, + CB4D18D09CC768F84665E259, + 96E32E150CC5E45E6067077F, + C93A3A190653E956062C3664, + 20C9FECB6515DEB13F3D0B12, + A6CFE6A91CA9226F18A49047, ); name = fonts; sourceTree = ""; }; + AD6C56A11E3F985F7C7AA351 = {isa = PBXGroup; children = ( + CD1B5B3A90067C61ED51B3B8, + 1478ABF4E3D10AA709DDFD65, + CEF724781B62A0C66F89313F, + E2E9CC735C960A8973F4392C, + 3B134E33FAF6A2D476C68EEB, ); name = effects; sourceTree = ""; }; + 44131CDF742706D6C0E9EC66 = {isa = PBXGroup; children = ( + 5FE6EF8557574AE95CDEBDCA, + EF8E221F84DBFB90BA0D2121, + FB17443A29A0BFCE1499C18E, + 844707F81B86A6ECFF9D8971, + 2BA8A348E24FA01FEDAA4FBB, + 7915D0307004CB1848CEBF67, + F29D4C985EBD26195FDE1F33, + F96F6A11BD1D60CAEB22A3F6, + 1C98C9CED951E601931822FF, + 7348654A7CCCA4801FBB3EFD, + 01A4F028A63749CCAAE5DF55, + 32F1879E6FF96C8BDE9C2EBE, + E49DAB373744B917B597168F, ); name = native; sourceTree = ""; }; + F7DD1006ED325822934CE941 = {isa = PBXGroup; children = ( + E969A83F4C0CF83A078F47F3, + B886B1B89D7773E4E0B443C0, + F309B3269E76DE120143DD91, + F59D71157F4D41C4D4816141, + 6E98284B2337B8ACB6DB657C, + 2E6FA1D06FBF4A4F13B37ACE, + 6018A5E91B7A26DA24103F9F, + AD6C56A11E3F985F7C7AA351, + 44131CDF742706D6C0E9EC66, + BDCE808BFAD59C06CBBFE776, + 8A4309D233D97D00F33632CD, ); name = "juce_graphics"; sourceTree = ""; }; + 2F1041C065A0A50307F614ED = {isa = PBXGroup; children = ( + ED8229C37893B6CB49A015E8, + 80CC3A04767718A98EF73C6A, + CB4F3175207004E4E368DED7, + 28D9FE3711234F679FB41733, + 2D8778974C68084E97C85FEA, + C28E74456B994CBEFF443477, + 12AD997217C5B146DCE05DA8, + A8C62A3036CF6C50780F502A, + 8684EB51D3FCE5D754454C88, ); name = components; sourceTree = ""; }; + 1F27292979CA7D0A6E999F3D = {isa = PBXGroup; children = ( + 8F23010B5687CC84D5618D94, + EF2FF8917F057B26DD01D313, + AB7A36EE23451E5D75C7177B, + 56FD90C9B255C9842E1DE6E3, + BABE3E04A41600A763AC8AF5, + 7285A22D6FF07D252D791F10, + 8F6230411A3D641AA0BD002E, + 7E0083C78E047CACACAFB8AB, + 2ACD26FEA009C3FF00F6E124, + 7F85DDE9A5D21D9ED2AC344C, + 6B67A8471D27DEDC4814E03D, + 7505DBC3BDE5012BB93961BF, + C7FE38B73D4465AFF7A6DE68, + 13329E39CC18775B44F472FA, + 800C7B1CC1FFFCD17C8F29B5, + D8D8E59CC4906683F54E9E47, + 6AD481C2B30E01BFEA7A58C7, + 0518D1089617C7B9598F35C6, + DD85A7C7C7CBE5563E68D702, + F4232A519854A8076D1B9222, ); name = mouse; sourceTree = ""; }; + 88897071E8E741ABDB94C057 = {isa = PBXGroup; children = ( + F3B5B1EA1A0F1FA07B06B163, + B22CB865D154CC006269A7AE, + 7EB3ECB111689947FA58FAFA, + 1E7CA6A3A1C17F917A7F7E04, + CFD132190F1F02F6241F4546, + B5B7E1F6324C6FD60A297F4B, + D4B969973C0512F6EB6FA8F1, + DB56D9790F29378B0216B337, + 2758DE812EF406E2AF60A9DF, + BFF612E6000CE9DEEF603615, + 1095B29C706EA27F3345B1C0, + F9FD00F994947C4396D857C5, + 6E7E3CCDA1B9DCDF6ADAA206, ); name = keyboard; sourceTree = ""; }; + B1F5418A24C949EF1EDCC5CC = {isa = PBXGroup; children = ( + 09221768D9AE08F3E84407EB, + 027B826D8F1EC95E886648AB, + F7F2A8C5CE190B9E1EC47F8B, + 118158D6CA3C681B3C33CC49, + 165951595FE0F9FBDF8F1F76, + 11A4BF5B35CBCE630657C39B, + 0A1661FABC94E6BC1CA583CC, + 6EDEFBC59811FE7A3C062C76, + E73FE1D1751A2D585498CD1F, + E5368BA7395DEF8CE20D015C, + 4DF7445B3EB54343A00CC25C, + 85C0B0A9A2E9011A381F4B6D, + C425F930263580F64831D9F6, + 1A5DF7BA39B40428260C31AF, + E2769AA38838844A6522E4FF, + 277DFD7724AA558ECBF9CD7C, + 88841EBB57CD023273C1B011, + E994488A0B4220B5CA064DCC, + 3946B6C3F4C5CF77AE29657C, + 300F36848F2D4A79559B6D6C, + 9EFF96B9B3A23A7C056B0581, + 9762A585C1D71C4F94400DCC, + D3BFF0E11D3F9A7418ECA895, + ED3EEE79647EE49BBBE6D88F, + 6353AD6AB18E11D61EB6B6B5, + 107DFA95B0EDBA20E6F491EC, + 8BBF100D5672619427BE1FA6, ); name = widgets; sourceTree = ""; }; + 20C66850D35C2F7AADD7EA64 = {isa = PBXGroup; children = ( + 49800024EAD8F8D3238A90D2, + 40ACDFD1FA477AF57EC46DE8, + 9FD68FE75C0CBD0896E4EBCE, + 278905A514838BB05EF5BCC7, + 5659F3E5E387D79D667939BD, + ACB76D7E2C25A4817C8FDCBB, + 18425E2A1A02A2F013266A5C, + C5F759D80F99D4781D8CAB2C, + F51D8294D9047C68D2B9C27F, + 568DBF7F795FF57A1DCA7A0B, + CE89263BBF56D5FEC9AB8867, + 2E8C5D25AB2D652B5691EB2D, + 66C7B3330BFC5043D3DDBB07, + E212786B086F213B7CA4ED6C, + 21168FEE80959F178F1121D3, + 215188D87085D91B6C5FCD14, + DF8341365E508EF7C920EC8B, + EF6D81709098F6089B9C09F2, + 1AC49D8536EA1C79ADF3F0E4, ); name = windows; sourceTree = ""; }; + F30B7D8CE97DE5606AE6DC8E = {isa = PBXGroup; children = ( + 10D3E511C1596A55D345E450, + E30662968DCE42D8335E2018, + 393CFE634E767D7D67754605, + F05F461001AD96C6FC4B5C1D, + 4510ED9DACF956CD26701FF0, + 331DB96552D8827A3531E620, ); name = menus; sourceTree = ""; }; + 4C272B3754B014AC08B0E033 = {isa = PBXGroup; children = ( + 6930876C15958A3ECDD37704, + B597558E965007A285B6BA6D, + B01992821789AFF657A25A95, + C3B6F57443BFFA1E5631B596, + C35FAD80CDE9225FE8939818, + 2C53D458935EDD6D74D4390A, + AB1D06FA6F324B4EF0F64315, + 59C362E42C5EF3F3D40F38F3, + DF65288A6A46308AC0BA2DE2, + D94DE0E3A7E3FD8EC33DFEFC, + B723FCD7D774BA8C2004A66C, + ADECBEF533CED2D774B99350, + FE7F21B2C968EDD120A18B00, + CA11F6F4E56E77470FE8D09E, + 98459CAB4F58A66FC938D5E6, + 9F6E4A7EDED0BD437EA25530, + 839ED2804072F1F4A49795C4, + AF761727AC666D34DCB621A7, + C3111CF603075D3ECED9F226, + D3E6E10241BBF62F012DE17B, + 09435B89075BB6FA4CFD6724, + A4096A02463E8B010F9C59C2, + C2530AB0D290282604A86AFF, + 2C127393C75D45AC918B05CD, + FACDCE3863025B8A344171CC, + A331D72512A603E04C52418A, + 07F9A74E51473D1AEF083D7E, + ECB835BD3A66AC09C9A2373E, + FD71F052D94248F16F02B388, + 0D7137F7245CFB5DAA18A4FE, + 85CACE02CBBD24F62F26B2A8, + 430BC76CC982DBD7BA922C07, + 97B159555E69DE49F7320D32, + CFE07619476ED38EAC6F9647, + D1541A8D28A7E2DA898DB59D, + C2B58C343A6660A0323EDE06, ); name = layout; sourceTree = ""; }; + A0A794A5F17590D11359544E = {isa = PBXGroup; children = ( + 5B5933C960929059FBAE8885, + E92C83774EC4A9A14E22109C, + F78B51284578A0A67A33F2EB, + 8ABADD47FC9A02CFCF692C5F, + DC3AF8B79000B8358A770D0D, + AB3926902813D7BFAAEDC63E, + 4A0B9707656C06AA2DF98695, + E44572B81F6B4EAC081E43C7, + A7414C940C8F954895DD635B, + 22F32B780E54AADD057330AC, + 88AA4521917545383C769507, + 26666AFE34453D68EA1CD34C, + 4FDD1C063357EE9737EED677, + B7E426E1537A9A4C368F77B8, + 45DD32716673D626B8F2C36D, + 3B1AB73B105D680E63D600EC, + 5341780B2FA0848C000E0E78, + 843939FBC4BC176E9C2C909C, ); name = buttons; sourceTree = ""; }; + 0CE1F0AC5B7735D5C59D065E = {isa = PBXGroup; children = ( + E1BCCD17CADC08D4D9A04EB5, + 3DF2F5F789876541B73EA0A2, + B33B4C53CBF14DDD6E19F8C8, + 93A609B77BEEAFD352361D7F, + EF723B3B26FFC52C7DF6E6FE, + A8F70411AAD4401197959817, + B7FC0F16FE7E00A23076CFB8, + 28050C6DE7011A70920E3F32, + 0C0C38F452969215F24776E4, + CF6F2D6D175E7BD93D969A64, + 2F7E8902A1991455A1F5B963, + B4BE33CAEF343E0FD4B10103, + A7486D0AE6A75CB00582B51C, + EBA666E871E270CD6F91D93A, ); name = positioning; sourceTree = ""; }; + 1011BBE9304BAFF95A476125 = {isa = PBXGroup; children = ( + A9DEBF10F4F5CCD5F66E0BA1, + 28B1C5C6AFE41F19212BCBAF, + 475280BA3A8D59845C56B2BF, + 8B24AAB5524D9D206BCCCCDB, + F3FBF9B8D43CD49F6284731F, + 95E4BBD9EA8C59D2DEA56E5E, + D19DEFE723E50138AC8ED9BF, + 4BE79606E126522A5FFCA28A, + BD8165288D223488734845AC, + CE94014A314EE7D89859551E, + 8B3A7567DB62DF8CAFCB5530, + 7917F2616381CBD80F54713B, + A58BA491BD292B245D238175, + D62F91E1F9DEB23A673CC1F6, + 0425BD62DB67A184A8DCAF27, ); name = drawables; sourceTree = ""; }; + 7B851D47EEB0A51D2C32C5FB = {isa = PBXGroup; children = ( + 42A9118A046157BA8286F106, + 8C38E93442136FBB225D6B60, + 0DB32EC20D82294C547A0316, + 0F2AA0311372228328A192D3, + 5A4CAD8AC21BEA6913ADCA4B, + 43BE8B9E5193679AA753D8AC, + CEAA216C55B19BDA0EC8CEE7, + E2EC1BD03575EB805C4B596C, + A91EC6BEEDB3A81DB243C7AC, + 6DCAB9D9819230FBBDC77775, + 97AA55E057EA63A841B7D8D9, + FA051E65BFEBED1313E7AD16, + 9B922474922B177945F847E5, + D5330C75A79D3FD00D88FF09, ); name = properties; sourceTree = ""; }; + 43B0193D1C7DEF84D41B69A4 = {isa = PBXGroup; children = ( + 663ABFD081965E7CA27A92BB, + F1F86FFAF4BCB107ED39562B, + 640CFFA7187DEE068F7C0753, + E7D854EC010D103AD186C045, + 7E9C5924EB87C1AFD7E48B60, + 92268C4E4F2D4051D5EA1A16, + 8C16B3A744FCB89C241242B1, + 3C539DCE1C0EE05849B234D9, ); name = lookandfeel; sourceTree = ""; }; + FC94936E6781852E6A5F5AAF = {isa = PBXGroup; children = ( + EF4C6DC600C1ACC3FCC13164, + 93F7CB7B38CB41F67A542FA4, + 3FCCE49E2927562C037B9502, + 62524F170AA5B50F631AC2BD, + 1C2F048BBDFE107360BBFA96, + CB2089CB6FCE772E8BEDB0A0, + B0CBCE56504234420DE443DE, + 9F8D6C1ABD279ED354B62B08, + EB170E698EB7CDECEC5CE6F9, + B8A3E8BB179C8B50164D615B, + 31CB45A436EEF3A12214093C, + F11E22ECFEDD82EB6AE31B39, + 0401AF6817AF1AEAC733714F, + 39B341C6A96025DA8F67F7F4, + F60198B5239A2A70FBDD83CB, + BB3684BF46B63D81675D0BE3, + F38318C3981F03CA0DCB810C, + 457A44F589184417BEEC66C6, + 7FFFC87F068D320D1F98AB72, + C6427BB39C1B2EE3044ACD0C, + A0E313527F80F4583588DDB3, + DA2FFAF8C0EB7C47B430EE81, ); name = filebrowser; sourceTree = ""; }; + 76533D71441DB73BC581D584 = {isa = PBXGroup; children = ( + 8406E1E4147F9AC6DFE0D5AF, + 0A3DFC5C47DC2472E34D9E73, + A08D898FA47DA70C12397B24, + 4A461606855E42B876AA960F, + 536CDDD56182947C118F00FA, + B89336F07FA245BCF095469D, + 8BF1E2514857E7161B0B5A24, + 85C576E54AFB35C156C9C831, + 9757D7FBF6613C9CB3ADD0CF, ); name = commands; sourceTree = ""; }; + A16C13AC925F01E513BC0632 = {isa = PBXGroup; children = ( + CA090BCA3BA1590142295E0F, + 4AF88AC28F3B17223B71ADE8, + 42E8113E2578AA7A73BC5A1D, + 56CAC3C965D4937837CE291C, ); name = misc; sourceTree = ""; }; + C25E9058EE7B0F2E900E3433 = {isa = PBXGroup; children = ( + 647F2177AEE7083291491B01, + 0C16DC35F5044178F8D6FF3C, ); name = application; sourceTree = ""; }; + 49D064C5B2141BD8D14AE294 = {isa = PBXGroup; children = ( + 4AE5D614B7AFCAB583208759, + 33C3EB30E1F7199E0BC8C099, + D7F68D8960AACA6245520A48, + 93FB3181F01650023DC78145, + A9A0D3FDAD0313E1A77E2D49, + C784E011BA017F188F2064C6, + FB744E5DA149818A9ED58B6E, + 8A1440773B4C39E9F9BD3B76, + 40416019EE08694C50FEEB1C, + 58C6BBACBF0FB679757A6CC8, + A7EE468F62EBFEF5E321277F, + E1D5C29A0E7FAD3D57ECAC13, + E21819B823D258F2BBBF2E26, + BD9613A2555B6D5D4C42736A, + 38B7C06966C8B0E02ECD9611, + FBBB399A45139BD4F9ED91C4, ); name = native; sourceTree = ""; }; + 2727A6D234211D5EEFE67B2D = {isa = PBXGroup; children = ( + 2F1041C065A0A50307F614ED, + 1F27292979CA7D0A6E999F3D, + 88897071E8E741ABDB94C057, + B1F5418A24C949EF1EDCC5CC, + 20C66850D35C2F7AADD7EA64, + F30B7D8CE97DE5606AE6DC8E, + 4C272B3754B014AC08B0E033, + A0A794A5F17590D11359544E, + 0CE1F0AC5B7735D5C59D065E, + 1011BBE9304BAFF95A476125, + 7B851D47EEB0A51D2C32C5FB, + 43B0193D1C7DEF84D41B69A4, + FC94936E6781852E6A5F5AAF, + 76533D71441DB73BC581D584, + A16C13AC925F01E513BC0632, + C25E9058EE7B0F2E900E3433, + 49D064C5B2141BD8D14AE294, + F31D86BA24EC2678D56947E7, + D3B9F06E8AB5BDEA5E7D40FB, ); name = "juce_gui_basics"; sourceTree = ""; }; + 7DEF87B9C8D847F2840BF97D = {isa = PBXGroup; children = ( + 7A468C67367399CD22A58BEF, + 7EA68D693EC63E5AD1B51FF3, + 175536F3AD74DA7F99855C30, + E8DB4F9E74B0A892FF6BCEA6, + 16EFF69FC0A6DCCB8B386AD4, + DF6AF4691ADCCB658CDDD3A8, + BA1B1CEFBFF576EAF0692B46, + 2C6D33A4B1F178774DA92636, + 00F3FC287D7F986198A936F8, + 190369B72311A50A82311CD1, + CA09B7EB9B9E4E867280F85E, + 4503340D22E0C1A30491A805, ); name = "code_editor"; sourceTree = ""; }; + 276BB424622D00B2F6D6EF05 = {isa = PBXGroup; children = ( + 2B397A82E7CBA92C8FA0131B, + 8814927B0C28EA1063EEB553, ); name = documents; sourceTree = ""; }; + 66D132EDB56154912C007BA8 = {isa = PBXGroup; children = ( + 29936B840C21753D71B54BAA, + 92AD2CC241921A7624BBDD04, + CB5B87D094112699DB091CAF, ); name = embedding; sourceTree = ""; }; + A53F5FF344A1D95EBBBDF3DC = {isa = PBXGroup; children = ( + AB57B8C265A51D69103BE0A3, + EE65A722876EAC5535E2E1B8, + 11684623C5BC9B99836F46E9, + D2542778D9FD06E8EA7A9588, + 9949FC28A43624DCA6E72AB2, + C6A2C9D09ED83DAC671EBE58, + AEA83A85BDD39CEC3FBD9176, + 3F56498672689348F97FE1FF, + A19ACE84BA53D03B2616C50E, + 79E1F731992D801351BECC77, + 9116D0ADA9D6CF88E29651A1, + FE52A4CBC9C8CF6D6130DB56, + 4E805C7465B906764FDCC079, + 0FF1CB412E3C9ACEAFE41AB5, + 4DAE9FA9C8EC7493491FDEA7, + 540011D30E5C05255D2F9F58, + ACFA5D787D7AA1BA428CE54F, + 5301D83E07FBC894AD2458DA, + D2026CB37FFDE5628F9F2744, + AC67DBAF871C7E7FADCBD638, ); name = misc; sourceTree = ""; }; + DFD4E790D5E34260219E3AF7 = {isa = PBXGroup; children = ( + 5B937EC199DBC45A407C603C, + F8C0B0742DB274931684B5D9, + DF8D7EE925553441ABDF0CAA, + C9C6E93243BC759D11517CC2, + 49E5420AF938D076F5E962C9, + 982EAE63C76A2B3D14AE71C1, + 616B784FCB645D3F2616B3E9, + 33AAFC22439616A878D7024A, + CE29883C83A0CF37463E7944, + ADD90AB47B68EADAD7D3F725, + 3FCA25C4DC0E7E70CFC17B37, + 043223EEE8D5CD1401F3BAA8, ); name = native; sourceTree = ""; }; + F60E760717F10C7C5B1BFB7B = {isa = PBXGroup; children = ( + 7DEF87B9C8D847F2840BF97D, + 276BB424622D00B2F6D6EF05, + 66D132EDB56154912C007BA8, + A53F5FF344A1D95EBBBDF3DC, + DFD4E790D5E34260219E3AF7, + 40E81296E8405B6DB08D1A48, + 3890B3CC99A7CF70767E86F5, ); name = "juce_gui_extra"; sourceTree = ""; }; + 6EB5B0C74A683FD9E8F67118 = {isa = PBXGroup; children = ( + C25C525D2EDBC5EFD75C4339, + 0CAB2AAF663F5DD90D95F05C, + B78BF0336B88A8417A36789C, + 4E6E46FC7CC57977CDEFF7EB, + F70BCFFF8A0FCDDDB8B8E4BE, + D4C1710FD87D3FA13578AB06, + 99BB5424E0582BC9F57DEC0C, + EB344019F1D9C39FFB25E0ED, + D3B2355F44296AD9D95EB818, + 4026AF7C01AE98E51C186FF7, + 4063612DB3C6EFC5F0A2F2C2, + 0859DE9EA0450BAFE24265C5, + D9E7F3EEF988179D04967CCA, + E77B60A2AAFFB97BEE8787DF, + D0EB5A8457B29149A94236FD, + 2086277583EAB1A771D6C6B0, + 056385085D79574486C0E69E, ); name = opengl; sourceTree = ""; }; + 8EEFFBC75F21B6E21D802A38 = {isa = PBXGroup; children = ( + B99ECC1A59ABBFAD154DBF9C, + AEA4CD32C4FE456E56506C23, + F752AE98467F8E7D4CEA7C43, + 3F01FA0D9D23B3A8D322CD03, ); name = geometry; sourceTree = ""; }; + 72D293A3B38BAD3129DF1940 = {isa = PBXGroup; children = ( + 60441B6BC9A414FFBDEE3FCF, + B8919AC8BD1D96967D930C30, ); name = utils; sourceTree = ""; }; + 4527369C4DAB2CE60232DE94 = {isa = PBXGroup; children = ( + 2E90765D015EF5632C2D615B, + AA246BE1680359142F137B21, + ABAEF348E52D72E922D48549, + 16C069B1F73826D5E4EB1AA6, + 12C4E2CEE622B2D83D4E08B6, + 7DD99D2BC48E1E19710A258D, + F9A8389F52F21B93248B1E86, ); name = native; sourceTree = ""; }; + F60314F08ACFDB997F502781 = {isa = PBXGroup; children = ( + 6EB5B0C74A683FD9E8F67118, + 8EEFFBC75F21B6E21D802A38, + 72D293A3B38BAD3129DF1940, + 4527369C4DAB2CE60232DE94, + 3EAFFA56F2F43A1058B3218D, + 2324CB42E9D6509A04EC7C2C, ); name = "juce_opengl"; sourceTree = ""; }; + ABEEA81A9680F6A4F8ECA0EA = {isa = PBXGroup; children = ( + 919BAECE150A694462A66B0F, + 523E4436EB863D6DE0298B96, ); name = playback; sourceTree = ""; }; + 1C67C665FD3B6D5133151E2D = {isa = PBXGroup; children = ( + 6105790D35DB968ACBDED81B, + C529D64EFD3FFC856653E03C, ); name = capture; sourceTree = ""; }; + 5CBF586DCC30079B9463982A = {isa = PBXGroup; children = ( + D15914EEFE2CA042E302C786, + 45DDC719491D8A5DF2742D87, + D5C686A4A13CFB91BF5D9872, + 5981B71FC0A50C72374F7114, + 06CCEC1EB7CB9296868ECC10, + 82082D02470579C3970E1319, ); name = native; sourceTree = ""; }; + CC319022914B6972D2B91A23 = {isa = PBXGroup; children = ( + ABEEA81A9680F6A4F8ECA0EA, + 1C67C665FD3B6D5133151E2D, + 5CBF586DCC30079B9463982A, + 3EFA5C3DC025E618DAD14A83, + 8373BE8898318D58E01ED237, ); name = "juce_video"; sourceTree = ""; }; + E697CF5985AC7D206A214CE1 = {isa = PBXGroup; children = ( + 42D107F741897BBB52B61202, + C1CFAF0419BB789AA0E38629, + BCC969C3BC478853FD7E336F, + 0F1330B9E634C8C1D2A19EAD, + DCA2C59535A97CCC2E7E5D5B, + 134363737026CC80D69F48A5, + 367D3E7B1A3582D5693B9FC3, + 6BF9D16DF121408ADF8D243D, + FB86CB37A490EC9DB740D91C, + F7DD1006ED325822934CE941, + 2727A6D234211D5EEFE67B2D, + F60E760717F10C7C5B1BFB7B, + F60314F08ACFDB997F502781, + CC319022914B6972D2B91A23, ); name = "Juce Modules"; sourceTree = ""; }; + C94E97E4A3CB628A675EE05C = {isa = PBXGroup; children = ( + B84ADDD01BAB1B1E21DDFF07, + 5FF5EB14BABBB07DE73B3084, + A7A5CB392CC227CDF5EA7E1E, + 0C45F05CF7EE8C0E36FACC7D, + A4545B5C8FFEC73F3BBB79D4, + 0246069EEBDF0407AC74689B, + DE7823A252414C8CBA93C5C4, + 4C36BE67D1173F7989BE5F45, + CE21B3DE9134974FC3432234, + 28BFBC2913988C2507DA643B, + F15FDAFFD05E09B75A756D84, + 5CAC2512334C51B8BF104DD4, + 77DBA89F84EE6B4ABBCC1392, + 0715CC6C99BA955AF2097BB6, + 88F83AF1ABFAE2A428714C4D, + 15BA4AEE0C0E22D7C8BE92CA, ); name = "Juce Library Code"; sourceTree = ""; }; + 094FA973096AF6FDD5A75280 = {isa = PBXGroup; children = ( + 9A31450E90F82EE417285AA4, + 16799F26A4934E01FE14D70A, ); name = Resources; sourceTree = ""; }; + B679234897D9AEB22E892566 = {isa = PBXGroup; children = ( + 92CABA9C9B5148FCA22A0503, + BD70FA4626657FF1DEBB10DA, + C751B4E213343FF77A0681B6, + EA07D9E1051E8FBBB8C21064, + 0C37646FCADAFC29F28333C0, + 7C86E886C3FCB671004E1CA2, + 4D4B44BECA12A8D1B2A458EF, + D9E37E3E825916FFC5391BCC, + FA016D0A7169A84A182C404B, + 72EACF200EDF2E5DF7D66DD6, + B06A9120276E8875161CFC7D, + BC1276921CB154EB04E5EBAE, + 095618F6D669589BD1DBD1ED, ); name = Frameworks; sourceTree = ""; }; + 6F245D0C169B0E9060BD1033 = {isa = PBXGroup; children = ( + 4B8E8BD3DEAE0C479D04F571, ); name = Products; sourceTree = ""; }; + 41A4B977F5588A439A066455 = {isa = PBXGroup; children = ( + 24BF2D05D134C386864C4C7D, + E697CF5985AC7D206A214CE1, + C94E97E4A3CB628A675EE05C, + 094FA973096AF6FDD5A75280, + B679234897D9AEB22E892566, + 6F245D0C169B0E9060BD1033, ); name = Source; sourceTree = ""; }; + 993A56BA093F4D3C2556398E = {isa = XCBuildConfiguration; buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_LINK_OBJC_RUNTIME = NO; + COMBINE_HIDPI_IMAGES = YES; + CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_DEBUG=1", + "DEBUG=1", + "JUCER_XCODE_MAC_F6D2F4CF=1", + "JUCE_APP_VERSION=1.0.0", + "JUCE_APP_VERSION_HEX=0x10000", ); + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../JuceLibraryCode/modules", "$(inherited)"); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; + SDKROOT_ppc = macosx10.5; }; name = Debug; }; + EA0243E56EC3EAF286B53CA6 = {isa = XCBuildConfiguration; buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_LINK_OBJC_RUNTIME = NO; + COMBINE_HIDPI_IMAGES = YES; + CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; + DEAD_CODE_STRIPPING = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_NDEBUG=1", + "NDEBUG=1", + "JUCER_XCODE_MAC_F6D2F4CF=1", + "JUCE_APP_VERSION=1.0.0", + "JUCE_APP_VERSION_HEX=0x10000", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../JuceLibraryCode/modules", "$(inherited)"); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; + SDKROOT_ppc = macosx10.5; }; name = Release; }; + 2DDD1A3A56EAB02179D1CFB6 = {isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_MODEL_TUNING = G5; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "AudioAppExample"; + WARNING_CFLAGS = -Wreorder; + ZERO_LINK = NO; }; name = Debug; }; + BE32D9CFAA27D791B2181C7F = {isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_MODEL_TUNING = G5; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = "AudioAppExample"; + WARNING_CFLAGS = -Wreorder; + ZERO_LINK = NO; }; name = Release; }; + 074FE87A26471418B3AC0921 = {isa = XCConfigurationList; buildConfigurations = ( + 2DDD1A3A56EAB02179D1CFB6, + BE32D9CFAA27D791B2181C7F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + FF720F7C44675347E5E0EB5A = {isa = XCConfigurationList; buildConfigurations = ( + 993A56BA093F4D3C2556398E, + EA0243E56EC3EAF286B53CA6, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 6480A9A75122084E426BEF0C = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0CB39189A1701173FED41819, ); runOnlyForDeploymentPostprocessing = 0; }; + EE26AB6336CDF8E778B3DA86 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5055109434B36CD6E0B6D360, + 55A794809FECCB07D3C4D07D, + 3621F85B854280F9027CE5CB, + 553D71A8359701FC2637AB1B, + 202C2E7636BF065345A863BE, + 4D0CCBCD970506020B7B776D, + A5F3236458D1B10A5380B56E, + 32945D1B73F05E016A260623, + 37A09B6DF2E96F97B97D4449, + 549F56B2B2C317F8825B1931, + 497800EE8B1FCCF085363076, + EAB8E408DC76E022A6D68766, + 9A41B21E365359ED2B2EA7C9, + D08237D0B93B3C2CE522A33E, + 6DD90D5F07BB81EF033A8A20, + 7BAD1CE41A8101004D40A2BE, ); runOnlyForDeploymentPostprocessing = 0; }; + B6DD28580BC7A7F690EF4B49 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3286435E3CC944A630866B89, + 7AC823C6BFA28E49D004E0E0, + 32D0B845ED45381A3B0D3286, + 7D74E1C0A7CA9488CCB8FD5D, + 2414893F5F6D7096A1350F6B, + 26E4E22AC7196AC405E218B9, + F5BE3CB7F8CBD56D6E0C6AE4, + F4869C88FEAADF584E72EF77, + 05C4C6087DA084BB2A20A87D, + E529B9215B8115D19FAFA952, + 291730DFE49E6AE97D4C8CEC, + 22F4A52A8EEA059B7DD0FCC2, + 74DB8EEA9D58B6E97C392192, ); runOnlyForDeploymentPostprocessing = 0; }; + EDF214F1951D7745347EA1D1 = {isa = PBXNativeTarget; buildConfigurationList = FF720F7C44675347E5E0EB5A; buildPhases = ( + 6480A9A75122084E426BEF0C, + EE26AB6336CDF8E778B3DA86, + B6DD28580BC7A7F690EF4B49, ); buildRules = ( ); dependencies = ( ); name = AudioAppExample; productName = AudioAppExample; productReference = 4B8E8BD3DEAE0C479D04F571; productInstallPath = "$(HOME)/Applications"; productType = "com.apple.product-type.application"; }; + 0E00FEF4A999DE35888889AE = {isa = PBXProject; buildConfigurationList = 074FE87A26471418B3AC0921; attributes = { LastUpgradeCheck = 0440; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 41A4B977F5588A439A066455; projectDirPath = ""; projectRoot = ""; targets = ( EDF214F1951D7745347EA1D1 ); }; + }; + rootObject = 0E00FEF4A999DE35888889AE; +} diff --git a/Examples/AudioAppExample/Builds/MacOSX/Info.plist b/Examples/AudioAppExample/Builds/MacOSX/Info.plist new file mode 100644 index 0000000000..555d84feff --- /dev/null +++ b/Examples/AudioAppExample/Builds/MacOSX/Info.plist @@ -0,0 +1,27 @@ + + + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.yourcompany.AudioAppExample + CFBundleName + AudioAppExample + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0.0 + CFBundleVersion + 1.0.0 + NSHumanReadableCopyright + + NSHighResolutionCapable + + + diff --git a/Examples/AudioAppExample/Builds/MacOSX/RecentFilesMenuTemplate.nib b/Examples/AudioAppExample/Builds/MacOSX/RecentFilesMenuTemplate.nib new file mode 100644 index 0000000000000000000000000000000000000000..cec7f7c72bb7b287e0d493d53b0c487866ed6038 GIT binary patch literal 2842 zcmai03v3kE6}|7xy!Xa&z`M5b4;%lM&tmWg|D6Ew7aQ2M@%n>tur*!}uy{Yt&e%Yj z!V5{9M2(VAB|&M`7EBWqMJYm*Qk147ZPe1JqQtSlrHBH7I0T_IjZ#F@)_t?%Ee=It zN7~t$ckeyto_pVY+c)U<=|*AUI3U0vfeZvFDn(`M9m85!_l1J%9ihIhn%B^~9BSCR z#V203IgHR?JfM+%hit2XfdZM33l3Ne`LGO1p%PYu3*68FouI-XJOW|Z2HRl=JO&&d zhbQ3$coFu%%kV0U!U6axya8{)&*3Qi0*=GG@E)9mKfr1D5GLTya1k!SWw;8Tz^8Bv z#i9%}4`re(l#OywE^?sxXaQP?79l5EjPlSDRDhPXJAy-g|6d>m?t@skA7;U9hyxqg zAs!MS5#~S=Btr_MLK@74bjW~=UYpJB>G0{kKEKxK3-*V$=^NdiW-IkI+77+L?P(2# zjEBWbU%%d=`iC^V!{PO-y1v1BXIcrL+E6ek^b*qPy|%dj#jrejZK-Zgwb!fZ0?Ft1 z89S!ULt$Z^e8-xJWJdjeuiG3r;V~TZa^A$tIOC;!6>sE?VWu%!dWA5EgB)G6@Q+_0~^K?-8y;x)BOkDvSy{=lWhr{ZQ15gGP z;OrD+%}2|n3LfAkKZ6HhIjn${@DNl(4b(y%)I$TTf<|cK_woDrQXa<_@>HJA=kaWw z%k#LC7w~0KMb-)xV!x@vI5dlFT3{Wtf(P25U5Mt=fYA2|)`3%3tXY&QT zh|lV(cB#IgX%)?M5LB%O3Eae3g&<9@V7f2dxg3SVLi^yav z41ga35QI>#&F=Pya@RjH7ukjfz9|JYZG%QTR?|*H}#w^&f>t!FfCQP8jBMcrs6j zn3_={EIo#5XjYir@PtUpTru??h27vh2TuvHM(&X7X(3q6Hza#rv}1K-s|kTTLwx}e zgwGX~pUzw)oz~Xi^J_i2wP+bveH1D9I{3aQ_wzhMR5UGG#l2kF54C*W-6{M)P^c3m zZdYwT&k|jhZYeGBGP|1xwP04O=GB769k93i>@@*=5ccyN0X?5*M#0}S!RvYM-CCt? z2Ivt187Zv*bZn^gYic;l6tLHp)N5AK#I6f@hlC!6ZZ23#AA?^`_tPjG1LxgPW;W!B z88R+vtMB(2XYZ)UOzYpzuwLBJ5DEuW<6a1Vn&Gpgt;45nyO+n=86No^)}a12R)3vg zU)a{D`3Jj&LNm9nIVG=%nNTdYQ$r|dxYVH7W?@UQ3YZ)<2a#2vD)`JCKuO|SK7B<; zkoBA-1~C?h))gH=))S7#_?nj-vc-uQ-!{nby+&CcRH0dsNN6^SLpEeb@hAZ$qB$rD zC8HFSiqggI%~8 zx8N?k2?wx_AHzHGF8mDMi+_w?$A|D?d*2`4pWg6Sed~ARjY?$q3ud*Mq zAF-dX{p<~N5j6 literal 0 HcmV?d00001 diff --git a/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Info.plist b/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Info.plist new file mode 100644 index 0000000000..ea5471abb4 --- /dev/null +++ b/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Info.plist @@ -0,0 +1,40 @@ + + + + + BuildMachineOSBuild + 13F34 + CFBundleExecutable + AudioAppExample + CFBundleIdentifier + com.yourcompany.AudioAppExample + CFBundleName + AudioAppExample + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 6A317 + DTPlatformVersion + GM + DTSDKBuild + 13F26 + DTSDKName + macosx10.9 + DTXcode + 0600 + DTXcodeBuild + 6A317 + NSHighResolutionCapable + + NSHumanReadableCopyright + + + diff --git a/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/MacOS/AudioAppExample b/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/MacOS/AudioAppExample new file mode 100755 index 0000000000000000000000000000000000000000..9eed8c5cd43bb4e13a0dc7c9c72fc2bc220d26df GIT binary patch literal 17813508 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%0AR~AU9epQOkDQP_>hX6;s8rC-^SkMo&88Se> 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 z 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 z

UkBr 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

JPpI^^*Bb!hq3@5SX8RIOwFtL5)X%2%(0{;TCL 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

XR`@|p<{GWy0p$e;zQCU)1j1NxNO4 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 z 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

gmYa5mVEGv-)wlpP10UBz3V_*m|;*87- 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%0DY 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

%BuT%i$P!`$ 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

Ygc#QH_lvE1D=WdmhoFxL+Uo?w;5 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

L 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ℜMqTX8ns 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Ν?J^8s)$ZZt|9Q`mwpwmb#J!K@p| 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 z%0D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

6Xn9#=b;}pdNbT=&shwl#=iNb*(&sz| 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

Jf!GVr#lV$a``}c~6Pxi= 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

%*&9biuxQ9>N^W%J-pf!c9|)x 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%0D@FDf-Zk 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�hDJy+r)0vazUo^}8rVvIy#jk(fB73lh#)%bnr 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%0DiB<=D%$P}=!4?H{>|LImUQ4&;dh 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�Z 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

7)m>rjP+PKT~z!jMn9AWPS^$cq1&Z71K; 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�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 z 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 (2~r`7$2dsAwpV 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 z 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

W=Qp&6JKZ_l(1}W5s54Vx}o`W)3 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�{Q*n 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

LYd00Xsgrl9!#l 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 z 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

O>|=KF?k&_778F6(ppFZ|8stL2ku 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

hw#@V(VAS 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 z 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

*>7m(S{^=SM^2CIv41e#Cdnk73i7KgSU^yKCMY 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
&bt$BY>{V~|aXI`T`z)Nw8 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

KI&Gh1@+ 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

    ~gn19U;_8S5J$-7L0+UZ_{7X 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

    QeNbB*4ao!s0}W3? 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%0Ddh>hp-y#Dt~*v5(z zR@ptngf&nijwM~}vox+t$6+!XPuoytyo=JSyJS{JQ2Tp6J&~s|njmr>fHQsXQDA(H z)NPmAqLYc&Z*22_z%j#RRvFre&`@k`3IWt&XnJ*4!;3uwZ8Rr<&a4PWBSS-#MONIc z4oXJ7>pUiciBxItYLba)NL2|6m3$)aJaze*{KbZ4r; zBEKpUB@H^;iXD`vGFAbJ@Ty%G^khK$hIga`{D#A>xNXt1ilrme(0jWH&aO@`g$Y5? zInU99=eJU2CHkE>80Dz`w!$OUkv(LyZbG=8^Uyk05qM9Tb3wU*%eB>0bV$`EjCA$X zC-ca}^D2-;<-mTvA52(8F0kTZL`zZ7a9nOrI4feUU#jGN6@4zxC~9*5aAa#rGh&Gp>FE& zMF_G_1znZjn9_Kgw#8{go6&79c~iwt@!=hC6O>{ z6EUpbL=4mcv-CYJ6>gwYx&T$)%ey%N+`_(VS+4A3@iqvlyl~k8MapkoFaFpdOO_ua z^iX)Y3}}9w>8U>l*JT74{OiTr%_Cx&xglyzompkD``ENJJwgfphnKT#cI%K{nYzN$ zja+kKws@_FP3~IPBT2MegE`_%cjBsOUj~+3KAA>v2@jj?6<$I{nFW~-o$28ZVo+Xx zG`O*KLtC0QH*)K<3p}xuGlO!P_T}gG20?`1mJ3|uBRTPoLLezVSf8zMShuj&G&3?W(d1EG)B|={)3jt3&fM({MZ&_d}W}AG?@K2dFlN zP_MjnE%FL(W*cQ&(yZ{4%Jjfq?}oyd_V4!oY=fh@c*85h1xn51s}~`g+lMd%I(tC~ z^!)};@^)Gnrhw+GR8S{Y&hN|lmp|dc5%CwF_$7u8>)_~-#)u%;A?U?6Cu-m6pM>uP z(z}C4APQEjZZ8f^A6qrs_D-jr3`X0PvzW_oRo9=Uhl%8v4ylGGK=O8jI#!9p@H)4P zM748|i$u}BVQ{fn!Z3}o{Ps!~r$CdV7>tfYbohRDTdrahDMJ4fc*(d({LGl-foiN) zl1a$^FSO?qJS8C$qTwIQ@*8h;e>|=Z%PTejFV)X|r*MPaf;X>HmsIzt`wIyH4(l0I_nBo)0$Gq|8>8|gvQ zHqwKpZKMZH+emj!n@CRU5YMyo1@-k}gI$L%*>(9k1Xzt5sBZ z<{Ng1*OZO@CiBM~JuX2VF87G`FXe6j45d`4JRD2-Nujoi4zesRVFM!c6Utn%HnWax zGr}18H$1DgqNlYip~4Z;xj9;37oi9iba-dpz(J$7SC4kXirqU}`6PXf=(fOU?o5Zx zK4APJEV=+{MTL0rVF!eAs5C+#LEt?loa1V9Fyya8e(6miDYvo-{mz?fP!_OiK|Uxo zuoLCO?`lhRkA|IYMtCwDWu4}@@Vr?^DaM(#fS@KXpFd}CbTg6v3P%@PX&b6)Zwe4~ zRpNAE2Jft0(g&Y6e{I{Fso@xX>F{Y4rXJHzanRH)4?`Up5SZMvIdSwKJZELnyczQJ{YD$w)i7n2bFx%Xr0W!)Pie z>9P0q!W)R$P<#eE1oA}?-woKo*r8Kzt!wkHdWRY0AUsHG4e@uu!W;#$5xFse3eE{6 ziX_rq5Ne0gh{VL5v5{W%$=v~?x?<4*Od}e-FXa;=YI|~Oc=*Zh?nB^$=rUE910}0* ztcLV*MFp+Az$aip#L*Ue@hEsrL=~eNu}|gUakus~5s}Zu?r5N0QM}mCXWR0`D0Tzd zgrb?&Tx7TR{RX9_pUb`@pfw`ZzkNI$@X8y`;l5xtDJ(p)4+~ae*5YfJ77&fY59dCj z>rOuifoj9HOUCXl)koC|u70%_mRZ4;i_1VOx41!g0;wI7hTViK*Ssz7W{B^R3fkM5 zH8!K=Y`2>|U0fBx#Ts1)(7m)y-Ho9={rrA|+BG|$T<6WSK<^=-`&#iu+69~vwuue_ zhBE3UkS}m=<|7_VplA2qE@yc7=j`ijxuUQZw)@u!jpE%JykTRpewfW~Ld+k+7xDzx zT~=a_>s1UzkSjwc@+X-d5sqc1ma}*WnQ*(_eAwdkg{DIseRS06z2AJZY`);)F;))K zLm<6>;r2)1;iHv=&;Hp6^@kN<0w6m_oZhp9^Zg7$V}?-xAdK({&YPO7%1I1u&8RW) zP>L+C_8~8Gx|nCfeE3Jvd;9qC@N|x{UhsofS2pkC;{CFRn|ZuUYw3Y{xSHJHh4)*o zQPw&!wt-Utc1o3_F(?2&G*NBfi(At7E|v6^*4kZzny9Fd`a-94K+|xs417|(oexAh zms-pvIT@eIJ(PAh-8$=`Wy53vW@x-_3`m{6Uc~s+Fh(io@ zAZ}Z}Up_3c-7oQ$^&&+7i|sgrV4Bbitg`aU@D*>CR{feC#5$0!j0d|#M$rk%6~2BQJiy|!|`dh z{#NBXxls*mm^Uz9w$jGt#Oq{Xi8H>b9 zI>ls3v#xS0GTjDHrnxBW<%sIA)|))6p2zl}?9C3j|MMC0{laWNkFM$4Cr#a5!Fs)p z8nng>##N}`x1XRlM{L?KXy}?B4r+2$9>P<|ZewNo zH4Lj|r1uL4qKuJh4r4)IHvJ5x3}8RE7x91h%G+}Fod!o;roTU{WqshGyf6L44R7%Plq$v+b&*XN83!yy|ebrQOg+ zNL$)fS0x+TWmk$XZ`n#{ZMznYga+*z2@Tpc5*oB?B-FLb5^Bc0=TKyXpMs?a;pLvw zxCXRTErs8Ot2o0s6W2Q&zx+`q-U6k8wslIYl@t2TtX!pS3o_c4$uNIapkw;E$QV$u~*9u?*Z zqw;;}R*>XLmnpIwX@er-0b;M?P(rY_*a~P_Ulh`_SGZPBe<96~xBpzx>bBf{xU*1+ z7JvCaheUcOr5Ji1RQ9d+ErW2NrrieieUYj)c{I<5Hpb4hSd|=8{cF2Gu)19sK z)vgTEz`z$Y$Mq|0AQox zLT>$F-lFWnM3Ji1IIuK~o150*-P%O%+@sn{I`^nVtaFe0hFFt`9l=P|SZ+oqFkd^8 z9Q5c&a?qnA$--D}BtWh7(Zo)=k5QMxGVJHot0+)djl&*iJvM?$<5FZgbYoQ7x5IKf zCc4!XkK^K8&HTtjZI0kd20|y^=#iXb2G=2U7`zy)>_vNuILa#^_K4BM<)^x%bv*12 z2sZ@tx?|P=qyq~1`mSuiG)kK0GdFfP)`=h{bknNGLhits&JIR&#>3Vrau;pwAVl;& zZuUsHMF9oHooHlNXAIh>s?CulPIudl+8|lZT5I)M6in%QT3*#CiKD!=Gf_3+cQNRW z0xfy})J0GRLBRu3%Lf83)WE!};7R*P=`9;n{mj6I*gYyCa1DxPTeY;S7D7wAY8so{ z^@sAvUd)xWnKVFwO;QyVXld6-Kmf0ifVy2X0m1^Rr-`ogR&!+ScOslB;_xvQi&%JK zF4)q1_+5_@9%I|nFXz8A&PRg}TuF%z_Gx>N6kUFoGEFIrDAMN-76_prMW9IxOydB` zbQ|S}*OFT^hc1K@zv)@h%E4@$Obu#|C+wJ03NI~|6; zY(}{aKvqq1kvy6sS7_hnaXXnQLSZ$714Q??S#^LI#A*t2`7rxj#+m#-)7@4Pl8$x` zYw6$Wq)Ek`f#mfXZFiO0YH90Ch0Lh6K57T(b&{RT%&@jJ`#s`H_MOG0fBuFgKG&%_ zP^O@UKVneha5)J51IqdBsuW0{uiQ$N(Kb65mzoM*`Yk$3+);vu<+)&PZ*P~I)Smy5IgmU8)M{a#q5 z<~Gd6-cSHZ?_e1=Nd^w}shDo14&3um+WK#u@}ih+x2q=$qM=luqQqcqs@Cv zlT8QhNa57>xme3mG))XO%oE27N~DlG4j$sd4dEf*5Uvq70YrLOI#xi+??UY;zq@;- z`g?TAa8fs=;QR(}7gG8=CtlmjEWuSd%VlSSCu8!t>2G{?w!>~8Jbb4jUG!@~vpo8( zTy2p@@*a+wzavsLv6UOrF%8|tHZVatA2ePI|LSQlYI$J$*$=#1|)jp+wSdGaQUWo?QN=I9xLzMo<47aKze^&H47hmMTf8Pfz<8nAA`B2RkN{tYA9jAF+ex8(rHI8c=CQ62W;@ZZiU514#@Dg^ zM7n1N_xj``EiZ00R{H7rNN(a*p6ui$VYxewfpPMyB*Sn!d@zSazkj1*^aFw zU27qwSZiU%JRdm7@ywETjWUHk*H&`k%9LH6@5Otl3l!A1iH6ge@U6PVuDaFj!Xmj zFCknH_P$RpW}xwmFDiI$#Y-_jMws);G!|pLwg4N~9t_ZB)embF=(d}q;Q#P?c6(da zVZsrZk53ZmVB}~R5Sl;&4h@MaC*J&sA9xaZ|-rmu#R$@ zlN1Riylu(^a-vz;zHSn{DISsJbENUvo8g(3{MYAvuis!#PIXZM-dOF)QO7epi^)%_hjz6xq`i;c zP5&v~+YEoDi|WxT?Ql})!&QG$J%TWxUN5I`{l+uS_j+fy)Z4v?`kmBUGD&oH2?9cH@F+Q1|Z9u^sN?5|D;m6H#eV{*h zy>ueXP*})5Gyb^SN6+SD*$yd>c3Aqe>5yH7!gH*~b-*71R+{B`QI!UCLpxy|=i9ZY z&3s4GL$b%dya;Yl$M@e~TSOS68F)Qv1xY^O!asSq)^V7Cv1=zO!I z{4~EEJ!g%+PW&mf_A6BoVV~W&qIRcJ84=j5%81+Lw#>L)PGv;xx~q(+qg|)REHfQI zUC^Rc<3s?CU1o82b(s~Fd|WI(*GK)&kZlUN4G73&rkx_4R*b#Y2abl~^} z-;MrV&O+VZ^IiBo`p?y^u=HnZ6$IbiJmsJUKWk9MEZ0yuvz9Ayx(r#eVfk-l(~v>i zSm-Q(Lsx@bnHBEN#_)3hO>M;anl6iYOFUe1!I+dz9OAyn)e)^0RM0s=_^93#@47;2 z2a0VR$}OKY2Uiv9VG5X$UrSq6^mewpTvKyo5O?Qn0^uXBKph1^-ZbkzGGxP*etomS z3uX^Thyx#W+BzVg$}LKSUu{d|=!pkBY9=MsWAtamgAM~5Ukhu*wD!prbjd8JmI5## zGLVH2yCve{_I8GjwRMBR@js)WE;!}yo3vsj*fM}6Nz7|DD)W~K5ut)C z_qlt0Q7P))f^~mlZ69Pn+!3vK^Y0JJQH~};><;-gWJYj*a5=IThKr9;XpdxKDRWwL zl))GPM%SB9rIW@*D30T#8#|5V4wc}YqnJmO4u}31sJt5ENb5BcXTzn<#8u{J(F7{e zjg3vEx@~MK4F5(1TFi^az8x)vE->1RhejBtxS#Fc;I1B72l8H6xY>NT{TJQF<2z^n z3-(-rP9%MKw51Sa+eLDfZ`Tpt7zqrd6fdxCX0@WA$dFc~E{zI2>ayd>K@t&ahX$^d zDRB4*tzw-E=oYs3{Ba{+cXAmQwgo*!@e{O*Jt3`7kaHT*5T(3kXsDEk>@8A%Qlh^NPlTyi{3EI*Zf@sUp{1hDWtP2%7a zG?Lt+|Bt$N-EJet)rRkA+AR6_GY6;J(@rOE?4F*z|76LwoM<9T-jbZebM@Z?fCqp@ zR+VJM>2FrgN}?h`5ClO01VH7Ycln^zPMV|bIOGH5h&JG<9THh9#}&K%L})G3`w;r1 zwY?CMCa;5w_0k|hae9ly7Cf=84VTt5`eQ8&5sxwluP9;`6@K1Z;!$28akFElq@}&Y ztqkaKKAC^QyN`9^p?bpXn&8Q+-S#py1bG+HA=yDe(>=(LL+1253Is%TC%?xe2WvC3 zZSchKH3vs4>o6n7@%3lq{7TAj2#v_pC{_(wx3hgq#&v56A;LHm)oB-kf|zqIT+17^ z&jdscE?8PtM$}q)G12;5loYjA6(H=2)I`{5ny4$zX~s#2n1ewntF0AiR9OOazW}RF z-XI(aMxH)+^68wg>4^?TA8$eLi}&lo%ykFWR0yeq&y+8!g_-l_2Br|qBpV5v<`c zAJgW;x%`IB+w}(5#dFaeVRw7;254{qQTJiN;y_vky4SFvKrI0EqS(l$7RFTEOiKN$ zItg|+YZ1}v-}e|o-l0d=ZmrcIQNq!1G~+zVjNHvJK_e*=IZ{mnIlCOQ#rt+Le~5LH z@;5m1jyQ(sp>We#9~>v|7xxeM43bom=P~w>rt;vQxQ@eHJuIOWby_K@8q`UBV5i2& zB;fZN=MVByBMF+lk4Nvg9@~nKou>CC(YOi;Zh!y@ulGQ^fjjwzBwu0I>T#EjkOUwI z`-Lb2iNO{maK> z1m7*}W3w`W(`RFh2V~>t!U;HtB31w@a1d(xKrJZ5sxkQ**|d5+xsSS>Xf=Mnr^bU1 z+lKT{9sV9ezK^7~=-KTb6TI-W8ZTSvqRecyx%Hj{5!oJ9zdXa?qO^t}SwHDytJ^^l z&-z(dMv;{R`1fWgiKTtREw-Y>3mPA}I0a=Rj^A@6)mM_d;#g%?(8=Jj$~~L2?Lf(Z zWl{yqPVYjr>nx13>AM08tmcu?*!#9>vcUsv=t?A;-w)Vy5%FXwPR8)Nz zh)abs{G}iH)^v4*X+&m3c9^CLRd2#rsKtl}Wl-oq*Qt!X+#cQMOYBFwezVluu<}Tm z)i(r^@q8vu^HrmRR^|X#Y6_=SxU zwh04uL?jG+$O=%E3jp3Jv9s9oM8x*?4bd*0T{F_{CLAGR-yA%wCMj@%WIk|R`_?G~Os z+}poFRvV>`svZJ(pT1}tUjwx#l^IW+Lh+qr(=|EaBh%FYq+;?F2r(?B1|hx>Q*F?P zWO_NUf`~RA56Q|NO%N)3G&QK~(bS-_M^%G9BrAI~L8$Ff)uOUTRg20V z)h+rEt?f|-qq0X;i^?8VEh>9dx9G*RvPTt+${tlMDtk1wsO?eRq7T#B9`!H^dz8Es zzJ^f6U9CkMD~0}{UVW6mhbK0j{zg7<8ds(X3^@8n6u9e0x){$_7n9}mHh|#^i<+N6 zI&DLXIaz5VEf%Is$5{2g)1p#n!LO@%`uNHPu01!%Z)kAMpDV{_oLB6U}fG zi|JFCbWBNYA9)QG^!{^&X!bui%;Ti-QEZ32{i}M04sfz{^j=7>U{iH1HVPb z*G$dI`j#}UdXpr`>ur)OueV9!yxt~B^o}-h%hcN>xn6IRM0>qWlJ503Nx*ls8Gv&V z^L02%(swjU!oH(XlJ{MW2H>rveg~u^_&XXU+27G9iT|!fLl94gKnJ9B4s z)TX}gRht1g*Y|yb)3NVWqx!yAjq3YeHyVI<$G%sP>ib?bs_%Q%sJ`!Yqaldb_q~Et z-}kCfecz`>9s6E48i07mzW0#I`@Y$`S&qMj3!+dsjMb(TQ%6eFp%3v8Ma(Oa+L!2# zl@=0jAP+^cdO2Ppt2wVmW_*#k7K10`fZ4CJ@oIIx_%CALP?>?eUqMGZy~Y0wHn+FI zy9w`Ojb=NXa3(@o{iG;5p%lBi?&S}#x&?(imic`DL886npk5|;$(|v4;i-y zT1L_x(=xxt|0%(+PRsqQNk2881h|6ik;q|Xc8Wn8qOcGi9RCA9IHy{=5&z@tdNC)P z{B&Bl8U_DW6)c22v30FL?so9XoEuso9<;ox%_IdQdtID_lFwpfuZIst(G+U%f&drt zTfLY+a)@4ZIb;Epx)(=*qoSVhj&ImW$R9K#aaUx=8DAv_>WQb~&20Q>0Gi!B%ZtSs zjfz2pCi*tIi!lAYE2C0Ksv7kz1xbCv6;>#z+c{`o=kl2BB2!}y8?4@|G729;xI+I# z7l*iSEu3o3>F?9&jT}ozGlZLpU1gZQt17#0CqtCcZy5H){d7JDE`N=u>-ZpKJ`uVS z4RN=WYNXm2UEBLlJ* z*!0Tgkhb7aBwWN0sxdO}x~9}n`;dam1t>5vE(gNtW32O}*>sSU%IXEjZGfXAPU@m1 zVk--=*|_r7E%ddE&tsfOw{;9z$i7-GRtSLTY1*(xNl$}OoXh*!!wM97SQQQr;yHCx z+;SC{z=ZLDuX-+aI#6W;?St3P5w*A?^mb1AU4Iw{iGmg;_Y-MGv&A*_uCS$jbaE zRV)VKn^UFg)^e3T@Xl_KoF0dX38&`hxSD>LUhMN75m>7_`Zn+?n6WsGSf$*I zY@y|J=)`FwNEK{YjznxEh6iu7A$x-aYchHv(>)8-X|y4%GDe8@gcOJvab~eaCFgDw zS0yX=%B<_f$w$r_Jtmn#R*xi+2Eo@im*>NxOofKc)JTO3oRJ7Fl*fOvl_`+JP@-?D zJ07Y$AJz#e;isgXS2?QQt2|1>?gttMT4cx0x?*eT&^JtClt@*9%o6$H^K|~`bpSr0 zEn||uC3Euy_eE5?B#cbKtNafiy`?u5CjNP0!Q{=dIY#W}%UTPZj zpz8J6Q(;#y7AGS)i5cUN^I|t67J-PKqgw{aR@2ML*U7BCmSHvhod7=v?H8^-@!g|{ zqWJ8YdIcRf)$qw<_45dsc$8H@+%&SG))_{&cRxPhXY~nGhUPW#Pv4S0GePQG% z@Q%YTfnV#m4Cr4TIYi}zq4?e+_~*lqz2gsuQo&;HezBU8rVxfq*B9XzX7B@ka*pv4 zNb&;}O%Sq?)tDlnaT-)<)@(gy%P~L++KgCSI*q6JGCiVb$&EO82A3`o`v5ML9*AmkY6R|&DaH^Jig5C0}4Mb9|esv1&JAkBD5{c z3Wmp`oCtPeAsPBakyqQMcuA4fn{Eh|(NA<=ee`N-NM8}(T#xvl534n*DqVAxUcM~^ z{fbYoiWCpxkNn7jrbx+n236;_0e-DRkyH}D=;A8hXq9_=S18IpdS+MlLBs=D6SQ+f z4gpXeyP*s%nK6%@YBFsy^Wjj+Sg?_Mxme8BQz_?dOuFbZ^qq_GL`RYx?SY6U#y3Fz z){1tkH!8f6ta6aD`=HIx$vcZRB9qBPhnZINId&kj8LTpKN4{Rfo9PVi5#x!mP@ncC z9FO7MS9|XsD3tQ2vPo_Uvy5OflC^6g$kcO3?cXWRAQ>9;uMmaSi}|hxt4xW#7RVO3 zMl}C)K2}eomsmpG91%{k%@9w`s0x(lR(@loFbu)sO00ORr47X zY{%;B+FK@o)1AX?W1d{bkw0L#%DmWRE|0f-kQ%1hl7<^ui0o>duDHC1K&fECu|PaN z`P<(t>GeONS|YG_rR49Vc|z7PdlKX_w#^B-y&|^amhSR>5i{h7%cjVHh*j+)Zw|7L z?CVU!c<~=Jh$;nsG`2-^LpEzR0eSao*t*uq)5V8BaM%hf@LfxIX;e7ja=J#KoDW5D z*)!U$*-xi@*W_hK&~@w4?qZYfc*NS|L^rmBdGQy_!!Atwx>trp85{9Ll?E2usYO;2 zy87hAy)6D4K+YWxR+$p%r9OVdyX3Q&uj)M(E2H(UkuzZZG}%TqTh2rmO2;{_}7>`IyF@EQ8yoGH=!}I||6RwjVB7!dYC+ zWEgD=wTz?)sbBGQ`F&iF>OF*3`ei9b#`fe1xqS;QxD;G9_2ijwC=-AWGO7>96`J3D zoh)bL`xv9IN+sk<5#7j@`;`ac@UPf`->!JUFUCu%YdAXVBMt#j8QK?>lQ~jpV|6uY z3Mmhmc(Wm}GD;&`#MBfx_LWM7!z_Aq5?hU)e~GLcnXQ^u^&Y4rL~V&?pYyL zn#=zCF^Uu>K~SB@_F&6sx?@r#has6XVP2%cIPYkT$^_VYh!co6Mg<}#{09(P?1`=5 zRuJWQrwCA_W}DA9LvlNqWds|(w*i7EaOq`6D-0#n8I0ev(<~fhb^hJaAeAYwsf8)L zfH(H#1o196T;pEQ6_V%GezO@QCsKV5yBei3iG5L8iB+J&laO5b2@E(cdOBBzWbXAho{M`k>ZrxX z*VO6Utme*&mZJvUnzCghSNxf2;e@vNqG=TlR?5{?G@a^*KLv7`%ly6YYPHDmqx0P| z5=`uRqU|Pt%BVCAziUCxZG_`j*F>U0j(oGIW*pY8O11}EMswt=rFaD1PFGZ;grdxX zM44gFY)?x3QCkYQg5y=eli<#u(d?s%}ult%3-m7*w;Z`EIfc#*i> z)PB&Qo}2*r<58*Vumt@GFS3FbarA*6H9lS`>HG>Jhha zDs`7xcw%X{I&L{sc{)C3*{?&KPMO=bp2^NeDNkZVm$NN8;c{e+(%kWc+#36*gD;~k z89`JQ8x9Wy0cH#9_R^>Pl%i8qj2@bmcbA4uQ7w$|BL=KYja+;Qeercm{*So-)3>+} z>S%8Wtb&qHNTwUdSDzP))nq9OX8S(b2W#Qruhyz*HilNlN)pNmC%Lg*ekdf2u#Fp} zpSoK^1T6>Aa-isF^m@8PcEe)%=sACdinRB*evP|2kh(gn=f|c@6-`}FmtPlu-e;yq zbs7V@SH`86Jr@sawH}Fhw9}fs;wM^@A@rwq0s^IdDc>+br%(3U+eBQ`=j%W*6;V7! z;Tnb*LE+UcEYgH3-OH4a`YGoWPXBhYZbc~~+Rsl`)ppI4h+!bg!#5nGjtbFt<9n%) zue=w@J0zw_;7%i~B6_hnZHC@%hA5)%UQtQJ=dtT&D3d*&-`wK$bh)KbWsyGq%SEfc zWI4O|EK%`mXX!@QU%F8@sg-ckZEC3)x=n3w={B{TUel(czUwx%3M0Br?Y>aAsm0yv zHnli%(`Eq9weSNCr+QUv8r4d;nMO7Dplvh&?`jD*1F3e8W*XJJIi^uf<+F{3AYKcU zGLULjEli`@#iwpmE#YPx4M4o=S&ER#vh8&$6;~Z4HL36W)TX}gQ=9s}Pi^Y^UbPv3 zbA8_@IQ4y>+SK=bYE$3$s?7kL>-#>z>Dc$GQGMU5M)iHK8x6p_W8W)C^?k1z)%U$> zRNwcy(GbMz`(8n+?|ap#zVB0`j(x8i4M4nO-+M^qeZPxJhEP>&814dm8F430{7tLv zb>O-s#0q*Gx~6N-YoF*v$@SbZla zp|(#QqJlnOmSiP>3S=H$Qpq{Kb&eo=f%TMBa$F}Nf$J-&;cxj=d$GUoA zZ3d}K;9XR0z=o^i$a~m_>~+kwD@(r%bN0k-o{0{WtICUzWJ|zhT(`@!29i}xWIKoz z>;`0Bcj7Xje`RDAp}R^QJQt!|E~j`qvQ@kZS&lx@(FcBCG@98AhI_yUM z4m;hXX1MD%wX;vRsTuCNP0esOZ7Qm+Zc{Vdb(@-sq1)7sOWmesxSKWuaIOgl4X3(0 zOrx6NZW`4LciU(H-c`fhK&lz;rcupsH;rnByKOWC@tWaoAk_?a)2L>+>qb?>-8LG4 zc-3%^kjk>H-(fdWP3rqz`5EG)f%ZhvaO(R$!Kv?i)uu|B)TX}gQ=9s}Pi^Y^KDDXu zd(~zD&h>qt;B@SJ)u_JjRipa8*Nq0?-LdZ#r24*Bjq3YeHLCA>-Dn8n^?k1()%U$> zRNwchQOCa5jRqjzvF|;k^1g4jt3N&3I?amoxGHJ3hFYH7j@>UK2~qy>S?xrlDkDA@ z5@nL^&I5ZczC1BSr4DxHeN0hg6kXyi=@3#-+Y`G(FpIMAtG|N)bz0u4So^VI@S`o$ z`MUa57=;SMfLMNg@9_%vM(KQ`t<(8{YfK9v&)PZ1O!?ecn?@uR(L86dx0}mI`W_S= zQl6X$mN+~1>pn4!YP2QHGJ?&n5^soCt7^f{MyX6f?qs&B{|UsamgnxhuA`ln&j;>R zt#_vbRp`E>I{hHZQ|t7PB%Ah$b^14eQl`ju9&jvU)mYdLVg#s zb2QLAC>x^u98Ig1Ih^1W?ClzV&-!+8gJRmx6vujp3h%x!tRFr`sAn$m7T(7wc`Ue= z&`+9Pt0TPW8}`UN>@A4O$F2gSJDVkkTeX?zg7){KC!w=h*J#0;;Okzs;P4|(%oCh~ z?Xfc4;`W!5yTw;L1++p26vDFE z_CN z`*V&=hqsG|6&_pcgzwPd-Th?V54+iWxW5^%CmHy`Q#oFJUVNizXpBx`xC_+$=?ayJ zRxf6=7kF3Y>x9~d#}7H0JvDawKwE{y%cghw7oN57ed>4g?w;zfubRDY)Ai@e@e)gd z2%X7fPL&l}FEoY4sey5a1jfIDCRJ!UsofmkVNR%iKvP3P6-{??L+NW*;+4*H9b+m37c>Naa^AZo*L@p30{iO#Cf z)@CqsZfKgIb-tKCiY3~$Lvk?#mM+q~C68){NxPwwjc0UTCH`^@f>zcN8LfsTXHyqo zqmFenWb^#D>8H;#{GXoP8b%R!fQREhK`$j?%A#CpbZR(Oqv<>T&w>dwuPP5>;+obS zsz$qYb(vaNRO#Moxj(0C(t(pZfp{hKFHv63Xftl_?RfcRvSf9R$`d5}z<$YSqx%`v zN_K+&JSRi9Iw*`mMqu^Z_$$ibAh#mEuqFz-LL-u~J;>z$)FAE8{8%WDBl07huRPs$ z^FtwuVD3cMY`0=PMOwam{Da>_D4$uH8m&XnII$&Yf*I=NNQ!PcWN4LmFp02XhJY8Ee35|G%^);eRONw5oH%I?)#~&s$JpBZI zS}c|~coAhi(ar%)Xg`>+k6q~k6vJgL#NFY)#XnJg^cBMFm&)b2WRubD;`xE zQI%1_CDl-4b;hqE`ykXAo`l(`X|qItL60b|CT>6KKNr_10tn-d!h?#?N(|->f~qL2 zxZ-N)kN1;zw*~qO)e0O2j?pr>+=40S_D;XwlQ$5)Xl1LFaHF~K#@L`s>ohC^&W+<@ zqufj`Hfm09(sET=@Fc=k?{1wR6$L^%H(h<0Tt6&VkQDNUyr$^^vq2AK-9BAwT`pc+ ztx)|ITkVFQ3+aTj1utST3cM(?U~_ORA1)s8(C>^lbAdm%27UY$w$3_iHX)%|Hi@}Q ztSe+bA`^+MLnWOypIEbZi>lTau(ePLHg4x#PLHfzp46Z4N~n$6k1HJog*9YB(BC_< z^T77*M^{RSQ`V{E2AU$95?E<32w$< z=^q7txoAj3Hr%{h@;ggVz_Rs^)f%E_cjv%|(i63h1J3Uez&Bt2Hic2Ny#D+cH1Z60 z+NPT^##TcN#lL~7;yrY)K2K*in8MBw-wgI(j1$F;lKx~my7w?S3bF09gtG%=9SV-yLpq!jUvX2DID`CksF>g z=L4=bs_!1O$bsGB`74T11-LtgKE9ZJoxH)Fggm#nVw=Rr>3}S<2D$p9)t(A$GAH~q zKwHBg`-vaZAr6yj&0Vm%=-BLGsz~=(yq_!)`ExV9ewd9pt_%CEJUs@NEn7=}24ad> zxzVC^^3IiL8|oFZHuU8483n4$$pa2|0dAZ)s!A+^gv^B$^yu6#42^r!y_JUA2`wXv z-F5AchDOQ^vO5A$ZaH;IFm8hpldxbI(O&8TYxH^5@W|{)Vzg`~#Rj==u+k`UZ0CU4 zK6PziZO$k(I$nJn-_!L;?k#P@bMACDK@`E7oCqh=)$2z*dpy0?#zA2K(+gChJDK064_7@D>?LA=u?hV`pPi8|0NjFVp=%ex;K@X&0t%DW&fL_% zyJ);#5RbIfAZ+Z4ZjkHDNfft0)Rg;DmmYhd)Fo5qi(4t;WKRBk!^KvG+sZbDT52l` zLOa<`M{srcvIf!Y2h}R#`P*cM3#QdMUM8H70={}T7nknp-TE`4GI5i7`FV;%GuNTZ zYC(j1yk7XbH09nb(B3t0vf$2B25k>>s6Pa2i;!_2wH7Zn#{NsZ5H%Uk+fU|XE9_bC zd1~n2%Ogb7iBCYPA(`cmv|m;VCuJbR^qKNq@(Hxa+lzVBr~B5)Z{9G&TtqazD|}G6 zinusbc1Q;ZKll?s44tQTitmMj6m`sW^XMGwZ|-f(D$R7z^AIeQw|oc|#^GJZmh$W5 zepw=OM5cALhe9vym1L%q`mrc}_glBKE5BHMS>X6aTbWvA4Es@7>C`e66a zyS(SBK#N|-y>rQ1RY7~}o2>GhR|`DnXT)2rQ<&|~MLm}b6*}wlH64Vtsp-~AF7&|eVeyJwr~xg@ zg`U*=k}@yooQ)nVKLE;^a7^|fRiDBMY^qqxQwLm&NbXPP$Q$mM zg!O#1X2_zsE#|XPf`sgCXoXk?1-_gt=PYXw7|Sz^MK(yC;>Wrk?A;C)))Bk}clYbZ z4#H(DRRq&ClG;zp^&3Bu=!>dpDU;1nYCSF1boGYYGQ^!sDA>OP6Hc@8909}J9G!fZ z*=F<&j?xT0$+3c{q7X~N9Q+S|VsAUFwwhW4dy52h3_LN4H0KC(uNP1NdJxd%#-r)V zx20kYCiL8L1gBn@rYiR$N0q8Y1l5EE3WR#s)X3{j1Hjp*D#|4rwss4$Zt%aKr2JMew1U*X2?5cjX6Jt-_2L8NWt`F^VqCxfDhK+P$+tISdg@n4@rD*u zXG5^KSU(~SPA)t3FKwv9G7|gsyLBk@7DSvdSe)Hi@2>s>>7i*_ zAEm>IWk;!ku;)#^nKF-~qA{qoQkpAVHE<=u@kK`H02GvFGynyoA64f?TrDm~;b{?> z_2ywojX3rTP8zkqQoE-Ls-zzWKnbaSy|}Uj?s&yAi4h8l9i35rjFMvf6i}jqG>!_d z_R2w=3_nMSEMjM6U}Xv+J@=H~feL4v_`@rc&g6_g4m-Pa$e1DBJA}u8?wQ~y&nj$f zyJx%GcJfA92vh*tO8dtkLrMl!9_#*HMZTBcGW;`R*^vM-l=D4QAJ2nXn zWq2ihRR>UveJ_5E(!TgLR?KaE&FEI-wA4u*F9mee*8)1~YXKd@wFl?ptI5n!u{2@{ zvb|5Q{5ofg;r6F1=E%@aac0E3*#o41qQHQ4ozTHCGC%7ZU)392ZERl<4ynsbz?9j{QKz=<84mnnL@(9OH*Iu7`plvEFe2IQd9 z+|L)$Cu4Bfs#Iuw&4@88+& zX;_RBnUCfVH=ib&Y-JW|zEa9XN++#@Fsf-j0N*ImdU*f3 z)Rn8xsoWm2i4ysJTXnbL zKIP*ZE|Wpr-e?IPxCd-TI zf5}^ojJEXeSZrIEN}#jW{9?TxU(-<;5<2xk=-X|c8=et+!|ZZBv8^(&jS4N3*b0tD z1kWP`5^-g`>1?|0OEk~PuptONe1~Jk^UD5OJU2nhQc}UUa1-_hUO?xW`Du#azWX^Yw?Gge9EsMx396dvc4kAD9s z4{n{^UffTv;jZw-5M+|=Y50odtsVC2VM#`Xns94n21)5b%A#NCLs3K*4{+CT#HV*u z?6GEeniVvcP9-zTgWJx2@SVFOHhiPHbtVlO7~pGPZvMB$a{6B^7=p_nb|%u+xehO)@Auj+#yS>&@RBrhz|9)(^{h zsG;t8QnNYpacT68fz(hqU0sjwCr?CS7!ZwuJ4saFrDcnBDDgMwErTA>Nsa)-qUV6< z8`ad%GF&#;{zX4->|%6{@au@2mb`D_c)47BLW0!l!{VE`U?{9ZX&|9bLosT+y~#F| zrqpRwYTP4m0!(+rFL1oW1_~8QSneJFib`>xr`Ou941G#sBz$v6RA}kS9G$W&MQX-& zRI%t^)5*8{#nN0v#|ALX$RCIKg@kq7aT&LCYzqHqq#d@4a?i#l?gnK6JiKB9l0HJx z$qmz#4egT)_=}K-3xyo-Wzex!i3!YRN1jmwO-ZJRQDiGvvzQM?Bb4THs;NY(#{++=j8yPTWla+92&EGL9pYIIZ4nAFK}g{k zrd&5qvt=23p|lALYY?QwAkDGp$`|wTJ)EBFceh~!69rMF04a`1k&jRhS5&frJeu%y zzebQ`L6Kxx$l?F$SaOX&J|R>lvj%yWoU9aQB>Nj1kIadDxAM#^1i0JfIHr4`ki;a{ zSSXdm5BFqRt?l3JtNyQ(VoWE3cuj{uaYyuA(Wm9&0e46~lWK$BUJA<@60}Dpt}V)V z%MwC+tre|~w#!^EthYTNQs9nXoWG!e+BX&jE)7Gge}Su$>&fd0B+!%}k`g|!Ct%_q z3x$)%{T*yr_gY(aO7MEZZdxsth4u~sJD-sGhLenI)jn5@qH(h-95NrPK@SdA6@BRR zx8PC}ZP9*GF14s-R$D|Xqu8PZUirQ%;8lwXc%!(Qk=YNA3QO0pdf^nsn_c%a_s?+ikNP#8$!^HTKeU=$p5 zX{s!=Er34O@Q6D9tRL}Sftq1|8dJ}AwU%D^QEi&It+H=s5r_L90>-40en95I@{uau z-QjRpu23*bZ7tuD_u#)!5bqjZO4j)49QJ!q^qAO^mDjwbaF=aKQ2_xafje7WpyJfM zy5P6%DF-XGzx+(O%E++rl(sEd@ABAQOy*=Jdkd< zat@r$uU}8DC5?H-OUqm4Q2)+9^9DD>cBDBI&uckQSZ+?!@a@`KaG+X<6alby8cb+J z=Cg;?D-N!VA2mQgx{n7y?l;A8hKd~PB{MtY2u2B4YY91ov%v=*0Jc}!IlAo$-`l%u zM9Bf7zv(2vck|ifyE%%UOkiRc_ZmgXc&SEu_~nAvJWAs>CSoGTtNMM-n4GBjR$e(OZg&zQ-hL~7Csz^sfDltv5CkkP z(4Pa#+nEiKzi5>4_jW6bEDaWbRj~EG2O~GlfpCO7f1}T9x)63UealXp1q#i-+6W>31@ zlt@Gi!X4G!4cpTN>b z6ADr-PyuZgcqXK?jlJkD03or)B8I}X3Xw-1q3#$Z%NvLQ4?egO+O*n1(7wB^Ekch0 z;L$4ixC6$=94rTaB$f1z?v7yW8)rvX@SO)YFaj;$bw`enp2vNCTL;j|103)ZXNL6z zwBeJ!R1UVw+R+PXPc5KUja8{ z$dZjw0cR}qavSzF#(gMHz8S@((hcfZ-b*&QY{^QmJ$b{Bo;^mzIPYgQ$7rP^Y0}b{ zAFL9cxN|6uPOOm0_#XWz^1D`ymo|mE2BE6zh{WIX;o$?B>P#-}(-qOgK4P*YF!(Ln{G#gSUT!qZXBb z@{a15uZ<`)NxbCAlFp2BM|KekQG(R)oZd;2gXt>k)H@Jasuxhc!U}{P)jbY&qUkh1 z79N6x7-vG2+rQzdRue8*p@LgZs1F}$1H@*rC}ssTX*5)_fHYev@??clFX4uzzE?&c z9EVfsPu^YZ|8OJYFLY{JOa%x%_)FR-T`)XWije%MMu;{}Jp8B@FJYSQodyq4Y7P#R>s5OIDi6pN-qm^s($6}GL6&k zke^$OO@>Bm4!x(I*KjFLa`Q3!)#FZSLWar*K0DY7n=J8sa6iIVc$j5Q9kxIio*K61 z`iB{Gi(g(wdEb#3K`!$~d-gtx zML~Q06(YasQuuUAH`!%uG=y@C^bqPH!xtoi86K=NdJI*uf@}CF@E7f{YK+#(ak@vk z1-S=ir#~YpMPrd&mzp`yZWYpU6i=B}Do{70Kz21%r9jM9vi+?+mwhYQan&Xx*L)OC zt2b%(I-3-`m#n{Rgw&*pglbYl!q|>>1a>MiCw0Me?aP9^X=DWx1;i?M z)^vaTfcoE2+19%)Yk3@6CKXi6A=|p4i|H30G;MWxmi~gn=e0&|yYVDnO=c-(Y-*I% ztTp*6sdaP}1uLO2Q^bXuurQGl<;bvX7;>Zga4DHFglLUH*e7oqmzdEVa=ek3KBP4v zk_I9$1&8{1ca1a@MhStLCw!6+2uj0GghD4t@k>o+u)!H5lnS0Zxbc!p#JzoT5Ys2FXH+LjQD$aSi2bqraf z>!2R8Khmf2?nl&Jx&0~Ba&sUX23!{KI9%oI zqTQs0iOW4WyA;Cl-*PP$y7i0m5^|j}o}~_*BDc_?Q-l@Tvm+5J7mDU+KSp8JTZf3Y zhi*oNC}Gl#z&FL{1rc2;#V@ykz9lz@PLZN=F6&pQ^$~)-O>m-u7c2to&Xn$>A%#FN zYTyooLa!m1OC8fSso@paszDjH)za0dZht=chRnD53O*^yxKO@XjRQj9<~Iv^?D=L< zqru1prSt9h3m%dsG$eHVEpJ$N!;H>2{}hz_>fwg zF(HxNBMz?f#oO^5f$%ky52u_cXT5hqGTD-9(ruX9AE=RWd8Lk|U{)>=F%=ibiw<*@L9xzGj1O zl8mT0G~xDGz}n;-uHe|~!CMdOa=5 zDC_UTL9}(neX2iF-zjuQsE}i6q`Bna;&CN;lJ{2&L>IUdf=A8psxR`z`Nttkg)3?R zGU70YEzzX_P3K1fuF+8}GrE50kghk&G49_u@wQrMKyQ+s8+6@tlUfG0AL0U{LR}0F z@QY~@Dr zR_6U=vP5v`Y;iS)$Mk%GS|P00a9Uur3tIANo07U3@uCY~$>wGc*4GW)1>N1@Fa9l| z>V~Z5YPAsOGDDXr%(hq}3l(bEWI02%-B8c`Aif8glq9Hmy^lgx)wdrsUR&cr&5?VQ z^b3zd)s$m|^?GwXTxGobhN{Y8+VGPc|2d!1Ay3*?fL14ge-pD{f{>a^FwW-kjuHD% z5>>V8xn1u++TGyH6sL=pG5dst9N(`ew|Kl=-d6OE$XDa_<^Jl0>M-TKX7^ z*XAFEXXCFWE-ig*52kvy2MZj{iyYu_zG~z~b*zU5ZAWVO;(YB!jwj;Uet{d5EYas! z?05h>joL*2YrVJ9OG9^hprdEZLN7;yLMV=L4Mn|ub<+~cZ3cEY#7W0hd#*UK6Q6+- zbS6eqkP$f&=HMtj8Qy)tL`1l4QF(160wDh)^^UUABV?iQ{rDd^6v%v~L?37abNIlF zM=8Lxq6X(PHxUP_*}|F zc|Ye7#i~Hlr?O#}<0V+jjY1u%^eO>qel3}^BiI&U*G$1ngw$K?x{Z(&K!#`D<2n=- ziXEJpC~tJFb^*zq@^SZbVy}}51Hp&c7ZAhc?I%jxcTB`@KA?Ghpi&rzGGWl9jA%9j)6qy2^--wr*CKN-4 z@`X!VRAGdUH+wv##w#&9;LIT~}?0x#q|pU3xUcCz&+8vOA8K|Dvwz!0xcp7SMn+;_$__C*Hk^ z35V_1GM-O?m?IZm3yM{rgxmH2tEefa+zo0Q1I$s|+EGzi(5>MKVpgHb?g!1OmKpc< zo4IkZFoT^QZaPgzF6o53+W&i)a8)sNidiV`gtkIZHGNofmo7|p3K>KXS9HdQIQya^ zKv${0o%a1_2uNUg29J+)+ps|q8dCU3)Aoat{Xi+&S`ErNA*PwNMClPbm`Ec_xjks} z0qb^63S~?>M0YFLAr8Gr3S{%Vd6=PsZl<(l*zSAPAC)@g-X$zdr*VgBOF>t!uQSCT zBXH(?0(+NMu1>QPzVzfaRbH zcyAOdLvLAq_(<*cE$pFq{l1>w*BPKA>#@pT+o^??i$v$?R6wc=x|{o&lI)h1wK`S* znWwKXvssc@6gSwvyS8=6#!#EJC|ZtSTtX&_joGpa?bsZ(4ZY_ZF1IL>@-1$zrXj$u z2z>+k zn#L2+v?zOybTW8hEXGPSnhwXa#o`NYs^3f|{uO7N29+V6QB;HK`lP~r;ys2lovkWs zK9w#(Y-e*3Vm=|70zRF~C0?+lBmrCo2no%m)}y&byh!KcN4)*3ol^#GU%Y@Z8#d}$ z;68T@u0!4OrCemN8Zm5jDFI8uj*&+FYCK0-iV#S`%!334$P2GczE`QE_UJJL3i)9Y z7C8(L@`2-C^lE{(GHeggW{le-yut1zjvid%FFl}i(Q5W)jnnCFmclt-;=PwI7Kuui zW`r*4wJSBCdD%({3OuxonexqaYE8c3Tr89(M{5D&DeE3~d!YxvXOcBHwv?frH+F`$ z@A1|frXF~KU+R;bq}AwqVX>csh^^5a;5Qf=Ti z1r7+ScV9&O36-A}BSYgP7 zKq!UD?GYQ`LJRGD9FG#V%+AWKfY*xOQ&#nJMNgCVxccQk57(2A3C$3N=FfUH0k>~2 zvE-bx_=67=zpKs^Gh>gM+U!#mP}MzC;Pe-(o#`)D^-^D&z1jF-e*Kw+z~|*+j{3J0 zO3{npMN^p`hx#Df1P?Hy;N|IUnFv&;fZtnvKZd0!=7^Wq3On|Iret)Z4ytB-XP|0Y zy0q4;$=A_Vw^qH~@ije~@{(Rxjo~&Kt;+Mor6h7?;N`SwJBisEH|3f>h}gWlUsG`r z7N)f+AKgq>h^h-(ha4*k(|tY|rOkN8M>Z>@s~6;GAWNm3)TR&`kf4=X4?Oa1T3TBU zXsg_|&DcKsXgNRoXqn%Bgkxxh@*j954{37nSOmk>^J2U4@6*NV3ul688#-%uDEGfg zQ=<3F42nU zASnkBS&p{DN+Lf8YQrr9TZxOUm@Q&ExP8GhHl6A+J6T&_kee!5-M?FMrmH@`Z0p8D z4rrs77YH5bG>4Re>?bUlbEsh?k>_3AMt-xuM;Uae$FXNuAHREF;w5O5hrlxyknQ%4 zC7Y1%K=+k5RBvqs>1_p}?cffCwr>{K5366n2p!m%w&#l|wu-xqb#(FsGUN%}<6OrC zj{2r+8o}p+Us|WLM?C3WXpLZGQdaD*oE=+Di_IpU^(vg+is$pbHW9bhw@4U{cZ2*M zzrq@!@Z8JCT#=}c>)DmA%V~vKVexOW(Q8L~mpW<`oVtx8mZe`zo z#;c!U8))P*>%bxo6<<4|E#gV7H=QyK$9}U4j{Ro!8}n_TT4wqbRpkA^U$Qb;8_y_N zBd+J9uadR!Hbc76Ia?u8zkUV1aB$NO!emenaWGJf@KDgsDbr|hujA!IL36jW-6QWp z$c52-l1ZkE1KeLIme=Ztg~-kmHW;1=HebTtiwDaWc|M3j-$ZLVJk(n*smHolJ58llAAhdcFG3xH&pWn^1l*S!d$`o68IOH zKCnPKrbV|IzVRUEdOkFz9<=&*t?BV~N*`g1Ak$m30UCFQdLS^Kea1DqIAS0WytRP0pGF-N+$L%#Z~zDNbP$eyN*p+C%81Hn^}8~@?lv)9IO<*Z8g7&48} z#|lm^5g9hAsp;6!J}{)OZP5jPz{N*p-UE7y*l7`L!?Od$=Wv}qN7=v$D)(G}ehiUN zUCZAbpx87ni)5RM+FR2DLhNp)i6JB zH)*R5=dNzq;hduyLsjq@|Bz4`GKWv(*cZDVNr78MS*RkOO7m`YwVeV zrIcw~x)_XWb)-|xcZ_0VBM5Az$-SpkolliYlp|-CjT~ zg~8cP!K1I!)%0qLN>s%SnqAPkp5{4D8+zEY(Hh(;h?Z~ec)KS=6@IWTtMw92EOG*4 zUo@~Yea#T>>{ktx?vta>v3Yq9pTuFWhqQs6Lm_?+vfaAi@|MkUh=cJ<_{Tyk5?zv$ z%8in^O`fvup@s$z zp(Jvow50ac6c?MB==d4Fh#JDyFHxVEbvJah^Art=|)r(3K8gWmtsAk9AVcX4YIa&r(_>F+w?Mv#J9u= z3KT^f#@Z4Yn9wF%*BR;t6{{0~*&rEoypRJUY&s)#@_K>0YbmM=v|k{}kY3u*qSRvF zXBFDkgP&5)Ff2z@gg{=L$o}#afg!a!6VZcmbZ~Ws>PL^XLTxAkzBo4AUK6~`nVpe%JDo&;qb=e46(~J%Cua?KMuP6yY zSAp+t?V%m4F;G7R{I~<2g?!_nY(>uuF298(Vy0bc%w>%S+k=*TgKWgxEUFkt9QWB%qiX5DL0ch-As89HBKzA~^+ACfgj9Opfc^vE5thMF{U>{M9yL-9^ zgAfFdW^oybEt`WjDSU(@sG*ngID{L#9pB%>p1Od2feRr3?|`8k#T~5xM~&3c(4JXc z4U>8o>jVsF?sbhiP4t^Fr+XceIo}?#_kXscN1$8fmk&rGH zJ|Qs`7qPD4Z^5ul0U%g^7@9OB@bY3K#SAyrsK! zjd~pB0!jqhVO)P-&L;1Eo4@_%L7O0C(gtFw4PKg$+n2=Kuq;B{IPqcIq1n5Zr71c7 zdY6LZDd>U+N0whYl-QMOi}-Y|j%gjdLw11rju^FtTP>eMPw{n@|se$ZkMZ<-3*w zRZiwNy0fqEn;D_Q_J9xk;}GaS?{Bggfetiq_r!r?N|%*KsFR}0a*VY90cYS)aKX-3 zMEB$qidc1|z5v#NCIs6>n5%3}>cjBFM&IUclDN9}KAnWi*aU>9)x zad>aIFq~?36x@nk;Jjy~1j+MV-+-xE_kf0tODH)?l#GgtJhKt;@*0^O;-%gV3op;M z5PcC4AKwX15?*B}MSajHx95&hBLjTs7sN&-V3Mlet=U%jrl?}8eOMZ>rTzJ|h&t8i z39&iC+UKjN`IhL_0bnF5geSaz@->nBYFa%!YBPvs+y8wx6RpS8cH{-DBXlA+Rn%9h zFU7I;zW7*o7`NH1H$%Gp?9gWYhaY&ITWqtFuBG(Y1FrQs6H&R!qy$eqmD@0kq22zR zWJw1MD@bxYn!`IhY<7uw-*+f<<5f7AXNzxH{8Fo9GoCNjC_4~3!TMPuhF4gl;M2?j zoU9&JsPdB+9L}3jd=FxZvunXz0X(CzJ3`W5{SxlB38OAyjw6?`k>DWq7T1wUFrQ=uet_EDmQ?<}*vv19?}8 zJV%3`kP2#G3!x`N@50(shpnwC>k<{eUQ1mq3SvaN=P}9VoHH-h*xmU0V?f{^cXvvWIC%MR zg`h^PpBPLmNuLKnghXBodKnJZV01Z(xirsu2WcLbE&rU!;OukX;Y?F1mCe=Q}fM@B;rL1J{Wb^4$z?Dz31{Qr;P-l zvd~T3ml;ce$nxki5H+eccqKXPG)f#syiK?c8wg?KA_SpmD>`x@pyn_F;&2!fz*UEF z^2Y_g^AM)NuSp(@=1L!e3St(z)CsOyPQQ>lreZgn9?I{sOPWzgvP6*I7%>NTHizSo z6JO6Lds-gvaeMM7xhGFx0Qon6l#4E{KCTlOtv@E;I0M*T%DMAYcFFD2Ju;W%06_Z; zJ&yjAAxANO97#6X3n$!nTq4ZJGipTJ>)kEoSiv0Q9cQZQAgxKcbymOp`x^1~{}|uj z|3Y9PY*xR#rs|Iifc^y%Xnl)^99O^K#Cdn|?|%S8{z0|5c>R0$?Dqa~@{iTcmtW-V z?O)EPSM)^YFK?Fcfqz>pzpQ?FLo?&czJJ_?Uw`=xfl(;%_RAj^zfKl+6F6`F@mX{H z$6wFiy?k;0@#7yK9jd_5VR*p>xGooeTx3e=^PDyR_=lV{*HEy3(I?|#_5I_!tN*<6 z>5Y0GU8#&&FdxvF17ZMd|dG0Dlt;F595$_Yc2cK36@Cuza6zhB>~o#ZqE?nvJ9)&sx)Dhup=ZKnAl5MIrS5VXN>hT%@1-$gr50}{6mmiTx3J2@+ zaB@p{hadPbhJ+I3$X8oxA+C?)J`&IhHBRoX@xb#duOX4%cT9}L{tjBj_^(7DY>Y^q zBce`}BhGBGb9WF#@i{W{)L;ny>hQYLVVXEpCa##@WpT*~UWc{ox-M^cQBN z;LpoNv_hc;*d0Mq&R6ub7{TdGVr_Tc7p$l!3EI;#I&QSM`p@;p)no?YvRLvdm>p2( zxEc`c!k?NXhk`s(an_dNN+n^DhDUe22;*AgR=h>2Ry;-b?y%MVxL_~?BqPHhaWtFW z`xBiI{@{mC6hC)I)CTW!sAjEJ&X%b#FSmFhVT&ZBS{GHXe3N>-q{DO)&M@eWTwEp? zYW(!rYxYqlYo~Uu57}r63T?YRTq|8Ia02k;OG9<7L-_cS;DeY@E zs7mgW{}m@e!pBwfJt@A(W`$4 zE#wYwe!%g;2AaXXXJYQ)#Vy3r1op*zMV=Qwr>Hyl>!3`0v%Gx$aCi6kY6*WXN={wi zT%l{P^XcB-h%C8s#)@VSNg!6o$WKV`>52&@YaQv*%_LH~F7P+~nbWnJ^#82jQxCzN!c(q)NZ>~{Jja+!l@nKT* zr(NB@CgU$3Cbtv#sjnw?Co@@_`0*9JkcvWaSN|am>Gbd|5Ae6#;AT>KzRlh_<{Kt~ zqKTLaEGH~(5@3I$-Km9E32{BOo$i-#(1z2(jFp zEr&@58kF? zvV_BgLB7IIB~1qJM=-@R4B;Fx-Yd#doZMIjar-aF(;3Qs%hx5IhB^KSmL$8~v*q3Z zzC3O7rP_qq7(CGO*W7Nl2ip%JP#d%BQ;)&ee&0_qSld@i{1W)_tO0qC?j=lFR)uDZ^oqTfYF`@ z_k5%H3p&jJ2!iCpylhXLUWr>hTSOdcV2P2gMW40kfH}Tsvr|jCsqHn|On#rT->^wH z9|eO5oSU7?>`i>aY3S%3nmikK?f`VRkFFizTygPwaYUCh$+NsYR9y1!5~`s<5wb8zLYPFaeGJil`yWj`_ajuDP4$qgt6USg zbRRF9P4tmJE`I-bcJU^tC-ToNtLMl~Xqz+FjsA(Z#qgYgB)Ov20Od>4+jepB>3){3iPfy=DEk0m zaB=w4;%pE=6%RHXbF?FV7=rLtCodAV zDRAL*YOL(-KuM(lqYeC!^W$hLclY|B>g0mGQ0yCVqW7<019SenuIo~H6Yb}uZRbij zU(H1m(HAord=gYyRmn7tLb?2CHi6e0v?#orDL!OH21YQ#4U?UxmVuJ^11k?*DR**> z`}%iRtLq0;zW#u^9yR?l2Rlk#a#t-1LlhB@>SFN`Eq>LzjN63wh@?EqFxQG%gY zE9dHV`;B<8-Tm}5y0H4k;xz1V)xfbK&fb*kyxPuLI$w;Y6Ij}sg~KNsm}JHV*M%Dy zE|R9hcMGR<#RubTQ+H~?Kj{`Psg6Z53J<7 z{>C-Q@WSrZWQoE$C^YhgjPvL5Q{80|4@_ZwB>v6TUI;52$-MoRGX*T${_CHA2E+A_ zi+3<AWqRW)EuA*)3|7znCFC z=H~Gd#SA9)K6Y!^{wQa!@7wVj54O%f;f2qK41Qg`cCGxXJQ``UzS%x%_IcB&e8n?F z(olLJy@f|9g3x(G4Sv~r9bL%XZewnZy4=x|z1mrR<-opN!!Rn{f8shF&jKM*(0Av( z(J}G?!o)v)nk?TS_=X=N)CzvRAEyBYwczao6`w{Xdr%LO-O~Yqs_xO{1Y=7A>oO&i z_K~_F|F-Fz8KHduM#rDWD;}BikuRq7_9|S2bJX3tm?Ge+@DNeQT#hGmdY|ae`4#1C zPDDE+$aka@>ZIm65R}$Mb`0Yr={lk!=pR(-R0o{B&(j;9AvBN)nkC}X@K`+OVQEFZ zV-%_P*IeehF+q;vf6WB-GHHfD$58J{!q^eK()!<1ySX z^=%H1o+wen(Ho#W)oD_B4tV(JI$5hFJ#{*EJez9gXIuE{?p_%)Pmj0l@2A;f8H#Q2 zC#u|EG#H6#HZb_?AfYGmSjz9f=6Dbz2|3NK?irH zJz-pp6Ser(&(VN(d-Rs(9h#~cwpTrJulh0i&Y*jfT^uy| z&54N8A2TTlx6g9D;CJ0N+&&11mJrXxP*uAsNZi7C{t_tS!KY*a5Bw^j_cx%p|-D1|-vlN!fMOZ7bRrbNf-lF}L@o9qB!)bjjt ziM{m{6j_YMoHiq;cYv?nDuS|!j7WM7rjSBI)umYc(b1#DAUjw2=a4w!&*btlaG`!8 z-ok(9ExLob9Iw8O@z&e=^BMWTap7p9Gj=clqQ4n3!n{3bkuFD~F0ls}59z>DdUi!7 z?1wA3xc-jHOABASdE2&0YlG!(c9*LRC~$KF*ICG<@PRug{3}=NAg!>hQRmkGE!i~ zL1f1<;!F}_Oi0a6nWintb_%{jn;o`Pi4q;0Us$QFXpOSi;9h&%u@xZ8m6b(KTyu!4 zg6qjl``3573MkM2p7DyNt1Q%VthLZMI#VNB0RjOkF|l* z8?^dcv+yA3bq?;Du^UM(Gf8|tahZ8(%i^rr6E5MC z8Gl82MMO-{$vpjF#F+tY$F2KiRptR()UkX>R46y=8^<-O{`B;2%Bp^ZTB2sLxT}+5 zO?Tr@shW1~t*)b3E;gF?e#Q%b=-P7_TuCt1xD3Sc_LkMZ{gF{ ztd-?Bcr%0-eb4<Lwa2`5?C@Dpp2`4H7xiUAz2I8&j#76^bujYE~`Tigb2u#_sMtJR7gRWPv`@hag8C8zE|yo z1D^(Y$@L*(W?Pz2NtGE)ynH+NA&B>~P}3HKMA0}VQaAOykm!R-VJxybX67v)Nh3az zvpLerreCM)$58L(xOj()7pbZ?6ni&v=BbmdI`U3H#8nUp{S5Pd{t?9^xUWpCwp+7G z<*nB@Itl&2ndab~gh_LF2GX;~`SdN$y*FRKDj`#6zVyCTvi$wdGSMtei08aPOwxqj zB=hl{$;o8HUpRvad1P;9<4@s!MOg57{&45Zx~@=omrCNEarpNEpmK~;$dV>gfrnF1 zsiGv>2?YA|!wZzIr5vEYgOBHKy#DMfd?2Lo^XkpRoa?uRXwyw6z7I-JQC2AauTb9~ zb9Q#pRjOl|Uagn2-o=5a{XD&0_q01f5bvz75njGQ2~IAWslaVG6I?vrT`gv~ zbP8#vH1Wo)c6H*1)7AOpc5PyftBv8&{xJRYd0^|~>FVwD2IqSVI8U;^xts%cFTP2) z;nF>fbgVUwX+7F7i)(&?ZYDi8f8qZrGkhXv!LEEjDuT-I~vD{J9b_&Zidlf$X& z(Ot68AV2*xkaYGu&k=DgGSHs`^bUc~@Atyd=FiGJB7Xqq%f%BIPDy7+auc(_L*st(ECgqfoC`Gds75LM7mYHLxHD}J&C2S4b` z{Qmb~$;IjDqaz*?zFMlXl}@_&9KJtaR-JM^Xf&}UP z(zYE1X)f2@5ykdjE~j^R81>}>()G?FVQ!PhdN&fWqmMTpTTjV`r zh>h3S^omsLEG=MxOYM%cBnCveE(Qw^*bHrDyW%J7yEa&z@YK z#m`=EJaAkTW&?K;&R6oUi&vcMnbXUta#+8I`zn_t^=?O@8)J+ba;?LDK;L*G4j*?E z#w|Z4&_7K+5R%7JsMEd)OTvb6vzw~02X*_>-H988Dt{c;G?UNP# z%iVESl{#DYY+R%cs*cZQc*PW@Z0{h=q-@~Nrj$m?iwmJx8EQIzdn3ctvT8w(C?dLDFYT`o!D*0ja7ak0-%zbWV)V=|Ox(uy zCO?-sg8_#(EEiwIW6i?(d3H+Wq+-;}ag~RM7O3i+zlo*;rXyh`rb8wvu}kR1@KDc- zcDY)I$dR7_SrQyI^IT5D$}-TVGLotXf6LV!yFIE%b$h`cCQ)yU`qzfgEozzWzLj=o zQD^NgBA3qp*y`^n)+2Iek=wF%ge*i6EUCtQ5;45pTJ~2^Iz`GH1^{@fcSfw8uSe@R z88YThfV72b)GEA$47jH$vz~#fhzNB-P+)6vzQj%S02(s4c)8}G?9*lxAx-pi%rP^c}j0Q<7!SfkVZQoNmcph=DpnWDTZz;|iI-f2-qeA2ykDZzhCs7-J z_Uo2FkDKv&{1GqFJX|B20;=9uszT;9zKEUPW*zb?O4*WUV|YKiJL*bwd$=gf0tcJo z@KKpg;?98hJ4!mDq^ADy#lL>#+j;C{er((A{rhg_k6#sR7u&gm`!PyHqFZProBs&i zSoci#m9bCwRvZH_g6Oo(*eR}>&_4d|5%5xgs>V^tCf+G9%JJ9mc6dUh9XRPu=&AIV zh+{&v%VI3-(DyFm+SmDUG-|!p?z4%bPc-)uJ`q@?omY;-4CzmH&Fo_O&oYRFKA5MD zTCqAiS1WoYbE0r8GF#&B4n>l>=3lh^z^ReR8WXSer39Y@HRQ_ zyT?7gc_!Y`vRI3Vij8V2LF|(Mie8IBh*{1pIKXY1=B9X=TO$c*kZyz5YwcSppHWR6GHX!HB|1P>M5yu11j0#HNNIO}|+ z&T(X6h>A$$>{%2mrO~b5y4HbY2^FHhK-Ljl-t=sSwhjvuaU&C&N&68u6I|5&AcvH; zUq7J3hkJOoy_-Nz4tAGTFprAy=~R`4>1!Ox$UNS56f_4!x;b)a`^x!N^lZVLr&|^8C8hpdg0wZLJEr$b9l zP$ZCiI>Tcqi`neuc=>F;?b-No@vs)Rc0kG7zrqB^L{0i41tJ!UHPQRo@UtemN5vTE z?Pb|pO=dXSiAO|bl?6^`Vuwm9c|mQR+j_vZ0AM+I|37!rInr`ZFF)c)lmC?3S+JfR zACU6O)Ee5t-Kl+JKvrv5$IMjEe6{WFxCD<|b|Veo#$A#WF7!Z>D&<4Fzo0_;XF+^2*P!+Zmg?2RYbw%2y6=a?zZ` z(m@Oaj4yQr^^?RkD4#~A#fpp+lNY;FM1#s_42rrg1lNSmuzE>PrJzLmuX_XQ@^^%zehiHJL&g%CQd@p1}=c}%0_%NM;KtAywDX8#`?Btke4KaL) zRn5_tf?n?-(Hd>=gjyV9?j|*$ytwjp-L+lSLRE_R`@#?9lGbz_#Y*J)m4V6ocMRGfIg zTd-sE@s)W*5(kS3rfu6$SY85cceKx=nM zC7AG50i^GZEQ6s`8*@e6D1ZDwJL5;Kb?+K>ms;FKSGRXN#fwQdcwm0v*V?1D@g~V! zfL)`SsKg!>8*f+AL+-B^*AMh;Ij?58A-4x>UDS8M$d~(o*@mi?$tdBG028_JjLz!$ z4Z_4jZ7wi$!pu0;lak$6A>SRh2}+mtrapdANx2+fU7_54P#AL+picktkV99m+&iwD z7_cRFZQ*PCB$9Dj-1{YtVkmIgZTm1vwBwG3_0z#=GLgdSG^1=L*sYT#vdD8{pNux(L*lK9A)E>eM-^G055Z6vxT+BIt`3P@0Db>pPj2OF9ybQ@V@4mDUFVQn4b7^*~ z(a!K)@0_PAs=PLP8Sg?%Z2aZ=1+r|^J!yn?KP&%E=jHii{t2a~^r@N_f+MKjP7$i| zaL0I@Pw%EwS@wA-sSlL6M=J#55Cggep5J6-$fq;@-kJ`j<9nr}Z9k>{g`Gr7aQ3v` zrkgQS;eW)wV3jo(H$QIs1$R~$DPvYr^O#RPxBWOo`0=MRvaApX_EjE%y8Jk(g8qw- zr~7MEh=CA)^YIK3`Tn0N-lc;dNVlZO@zN&5^O?oXNqQ}q*3cw#wKe;wTr?*~yWi%0OMj=ZM#^fhVkvYpX`x73Hp?F3#T8w6Ni zde^{{16JO+NPX5Xu7#IV=7~e+rmOdh`-l6tllg;ZN#D*px@36Z;b0|)7<;sQe#KB6 zTM-|x9q<%UDbx#?e@hYb_d3s>$9iH=^62j$ckbBXJT@jq^3W(QJkbg%-HH>-H$Ltj5+@CDh5`VHK+FF)+G%&oRt_ z>;mDsdVGY8hcD~JJ%`?fv>$t@wojqf8kU6P>8YiB$TjcH=Wju$dv8*ed_jP4v+b?S zdMdv#_W<&oj+ipk&J9mT=T_P9+8Um-FD|!xiom{w{O9o35@Uyfec~&(Bnb`pJv)jmuN{ zyIfVUO5=MHy=XrfS%eHfcvK@w8qs60!PNpa%ziSSrYJ?gNh5l2KE6U$QH{NyXI~mD z86l10Aqr1X!tUP)N5M!V>00sKHFTqhbo(Lr+(&oTdOX)6sE}}rnVBfR&bpr7|NW4r z$5$g_2Isam)_07%BY*$<_;(TL_c4xK#Ci)qGh?p8WC}n1C< zTTxivyw+&8v%-F^px4Zt} zhp-)`*WGQKcev4Q!*pXY0OR)ExIJn*ugCp)Z?4tkwr4koehe8&wV-whzJ42NXpm_s z_E6i+M2i8Yy8(Ud6_yocpAXBaa{Ef-`}nUWzeRJ$^M^bC%;xHBE^)BG|L1(#>>VP` zWBTC*5+Ocbs&@wJ_ipX6B7J441KZ=}SeRyW)CNX)#=MpA8=4^{Q#I3duPwMk(=Jc@ z4bYHYsi2w6UjYY?<#POud>nE;BpE33VD9s1tLCE0BI7kukEwq0f;pdW6#O&hWB^Dz zB|U85ZEE6=3aS*7N^6=+L}|gvUFK=p)@Z&VT{ZeFu-_KT>3>PbM#ZKvia@Jy^_*9b zEyaFt_K%ZY6AcePWt*1`4m!QNUq5z&Jo=UFN%7>$l2Raze!mqG5k(crY?0sPiPwu` zos(nZ^&Gty&z4y9Kz&3xy|fi|`61JS%ZJD|Y)JsykSenSR8K2<;u@{mVj@*6=`He-Yl;-< zW-7dl4vaV*eY95z8*!O`;D#5>H55D#R}|jZnapgE#Pi4=b?2v18E6R~`aWq>3^#`h zeIsXe5yxsuAsVqioUuI~Y9nkC(8#av9DTH6!mw;QsCB8a(dfnfJt{bJ^gk$d2fvaJ znha$lZL~!@fxN;eKPrjb4wuV{0rSb$s4kWa|0~hr86ePy{^TcuO#8TBHl;((XFq5d zlTqu>vsUJ=rS;ZRN~{+WYkw>WL+thQjFxhBRjMwny079qnV}lh%8lORrO>+x{FkJq zoL$5`-ISR7!}eA}kyVXmzrE=%$4eYmZvSllm5K=?7l>1P)RYEgAD@PF<3BF`iR|OT zLpFI3e6r&EG7JZc?*uXz4^J4}Ih1LCwYW!Fv3IvpIfx(1*3z`Dsc4k49i9d6rY&7#d{1yx#J?K%AanESTvHgX-&^F_N| z^8GP!lxa`r;uE{OXPpBdfe6IqA&TACRnK5#SAEQBr2@=}t$53qb$`K@fyg zsYv)gJcu>)qTjX%qwHgA@yn6u`}w-rw$DS1052gN-OH8t)HafCWi;Nom`v=igyG1j zzQ6Y+M?Uac9se$ULU*(@nS5&3&(H&|zqIi8x_$wd0Vo6?L#POsK2&?ve*1yj$PWaf zier~&kCSDSiiNJ)x`>*jQDmjj-2)yG!! zXND|<*Q4YSN`e=~)Ws zgzy!it2wp_m8PHz+=)d6n69e%Vgq%k8=>295l*PGat7utoO~DTyd&0mBl`~3FtgnE zs7wf~tDKe9cIFuog98cHR~9F7KPTK6{D1d8JhuN_ESeW3^$DEVxUQDnY*i2PLDQ{; zPBtZ%oqzVTnGYX(n@!2xLqgfcG2_OHMHjy6=wrS9)~v<03(gxFsRlMqsWYe)_8Huq^ZJ=xAcHX9hU7-w-H2WRtX+I{Et~rJ( zuqEUnzQg?wN7h{)B{Wn&X+VHF!1ymd6=zYANk^5A3o&xQNJ)rF{vc!=5q6GA+9Ao*XkMfv#Y0iEk9`1_kZ5K zzc3d<8vC6ij5pA_xT?C!A`wFHcXoa^UD-6KkGEnz8-&f4Bcx2^4f~anyzLHi_<$lJ zPPs7c$2`1&p;TC*e`Yu%`v0rAQTvSyrJv~GYb+n&2v5C8C)OuXT{LK^{>ZSKAPPOJ zYVkNevzXQ)>ktf7PyqMm20Y$Cj=={Hw`0v^4AFbeKRI~|SIC-rWz}(0JN6q|2#1!R zTq1PoAGpK2_UqRryy6O58x@lnha>@7$Eu`f47+|5nA;E+S5Gb69Ex(G3%X^wp1NoR z&y>yIZ0s=~dvI1z$?_}@#U#uv6vxe)UbRmZ9;sek`~V7n{Jjn(?qs)G(*peJ;bV%X zxBRklTy5s7mJ^seOHg&7E;0X9kLQtmWq@T0h$#}h6aBS%s8l-ym?J}{xloR9jtg3e zhNhohpKn!c)Sm&V^o8b93d75Ebp$8<9RhI#3&+G~-GAzV8LC5Av%l>XwLif$HC68F z?VIm`z(i@TvB4np{ll8PzRbbZsAlV^2$GHBXx%(Qj^OFda*2vR`3PWodeNF?m;`|> zL|9Kg!~QFvPBx5q>RtjF(&{d(=$$Q25BLpYa;%DhdwUu*fo)R(6xg~bk9ub<)i}Uo zb=Ul}9mAmy0p_nO(4L4T3<%nO+>PeaETk6OWL(Z*A0R3^gyGM71E`ANLdf z^}8c5v-*CsUBAw@@J##Wx9=k3&|T=1(lVn!8iDHt^FkgVLNQ6e8xZBQGqeM?zK~F0 z>-X7^1c_w6_zRV$lm&t{Y!~Ao6v$RlbI+1G#zhnkn=4UO{bQGkkv1_ohPwlBt6W_4 z_`JG>uo>D~K~?TIR~u1P2;JYb)72FG1D#_O;y3}dwKQL%)Y@!2PAFe%TM0c3(@XH{koR(4yUtU z{FPtw_t*zY+C$jqLFbRDo|O?+dj-jLk|zK#Vy z!c*Z!YSk|x!w!wzO8k2w4a+h{4v(O>9Ss(C;^(}^@Wzc}+N`_ybf(&kIO4=2Ack~T zF>LAgp#zb$otmc@8_T%1_1dk4{CzEp-IzU^RhqhkN-@~)&o4a-W z9qt;?7AeJNisP_HDnHX(kED{Saz$LVLpRPva4uSaNgpD*;=Vx770ZD-^zis&`?_g# zY)|$BejnCTWYFk8rOZhWVxFS9KNRT?*zASv$qlNue)@Sr85?ni6nBMGY*7dwgBs9p z#FQ4#TTm#|Un@btiJ(*(sR1A18BN{ANtJ)}EUR3Vm%siqI=#3~(*0F+u5wC$EjA0- zhls<@sd-1?^7f?$eBnndSa>Hi!<9S^?ah!OT<2|40Frlaw8jQeQAG) z%NqTC4LMzIfa*jEP#h7%jcSyyMASvxPp&qYvK2N2%Xi%N818w_3@pf2C5sw_DM0L;MZ2qJn(q zbOrSeuvqt}oe}?v(9<9q{aC^Mny=u~RrPrzn!uS_WQTDb^iDV4V`(@8IXrCf>HrmW zg@iv8$Y4nDx8P~E^%~B%y4$sz>EolF?^o(OIfd{4YL@M6vHdC98W>RX#XJah`>px$ zzMgH{wWwbCxKN3l?nzv!s))785sBfppn z?|t^E-NMqK?n}$&GscpJ0A+0%w4gE3t3}xHS^basnXOweL9(Askdwgd0&q{lGYl`V zkRuEO-s9*|fIfMUc(k!PQX!8}oxp4ZA@PMAQ3LRJL`YWHS z>Z}_IJ>YQI1H6d`qyGCzJP`x?AO{g8jB_ar`Q5t)N-~!lgJXJx;psbh1kIUVpH+7R z5U}TtDA|Yi=WPBDC~Gb>Ze`$Q zC%WI&4*ko@;&+}sNgId@1%g>)B`eF9esv7DWGGCeJF`L8or>xPwJ!^}H@#4D z3%6wV!==oS!!C+0fcV$5?j;c;W8Jax0iJm6-))7^0jdjIdBYyV)8)}E96bb53xaW- zLw-u^jV9;f8p+kuVmTzlAStI-K9r3cT5HNu+bi|T=AUs5d|QgE^u5z&4^{>_;655Q73b{^=spAWQfl#w1!@3f}CRYkl4p^Iqt9Ux&#O zDr0sq0y|x4vYxF&m`I+oV;nRlGuccvMS|I$SKBW{K@8m?-%>wH7nFiN#tuVDip?L0 z#3n=3c)y3kGqvYGk$?PQ+M=Q2)d}?57GAkKu0#u>!)WcfLbfZ-gau|g6|cqH)B=WY zI&XF)WQbyN`Jq{T-9AAgPu!=3ymqtx(m=`bLft7P`HMU=JBGP|#vhtdS zO6|$JJa{H{v-p@Atfp=^bU4K^rdDTrLVB{&?L7LmlpOi0AsZ?n3Y}$ds(u$k3>vPz zB*r1rM`d|_Qu6Y$y1=VCXh6fpM^F&7xkSS0nIxXi7>9EatR|366+!Ra;u*pllm!{q zb1j0Cm007AuXIFm{?KfH$a8P=fLQ)Ue&U{wk{&5V|_nV6tlqf zb{SIkDs1kk-6+rI@IFF+sZdU=2+W4;I}I-T_Me^=LXZ1I;H8;-)lkoA6$ZYHz{zw? zosiY57nFTZl1awKQWbUYG_*5x%kEf=@lVmpVhPvw$zUnvh~PvMP`UORHq;lGM{@`! zd%4BwN^Ck*k_~M{xc+;y`1*uQTlotW(8GC#c+{^^dwIjDOs5s(zP`8L8u;Y>>#FOt z09r0j5_EycbWhbx_O_J_0M#vN_GD8`VHSFkM@}wX$(26(RwIm#HCaYecTfhg zR6(6N$7E4Qdse3>113CPX6jA(4=bt*WglPkLzd&WMvOuS+}Sub{y^4XiZ3f!k%^bz zemzqwxiS>hf-5}O056UVMyGHk5X*snMtO52H|VGK3}>TA6Oof&C{-L-N)7mczHI@RGid4s9)qw6kP);Z!N0|+}_y`hS|AgB;kl2K7)lL2E z3t*f$PZiGF*9Wl=gZAZKtZ3fM(4!BWo)_`;|Kgv!_8M0If2NNHijw|<9({!^=M>6; z7Tf6pIf5|AnUWaPmsj@&n7{ZD67uS~XmPdHs5}A}Wd<((W)L2Dte$Qv$CV%|PLN>J z{SMkP7zatR%oQ_Hog1It?K@2_3o2BO++qV|$w`XIJ@kN6q=^Qv===AjXgb$F*#iWg z9;)K$JQIBOOzA{ix8PuRl}-?yQcIlu;Le~5d?qjaEX=aU@nbX=d$XZ_0mQsBeV3gE zVw37rp#|Ie(!i~IT&O;tYkQ04o<(t(ChYur-g%Thgd3{@+L@L@=*+n) zI2Zi9hV3F6+2lklbmL=aJqm z>Sg;?%r$r=I3yhWm8uf|DQ~?QCE5Ok3PJ06!QntEv|ggHMT>G)RY`8>^YC=>Rx2bE<*v+-V?k6ZVKHj3%NcZS0y8P-^COl-8tt;NQ_f()L@~qfVxgY&lo3>JNvS}rbAh65OiWG6Y1S46? z{0^JKmEv3D=`=T60QNSBMs{Qf0b%ML&B#e%?o|1Vc~XLS2ggSj*l1xS@?bCp6ojZR)6{Gb_LLk%hpGMV;*ObEXuF zZk3jg0yha@k0&7C>dg}3mA|2sz5QWqvtkpB!6I{j8X^Rk4x?d-FO0%GcneJe2TNS1 zG!~Dam1kLTG`4%`dzFh07qIIPZ^K`|GnXZ*d0Z>tWQe%9{I1N+UEI3(+{JO(Le1rh zKTehca|X#m6dxfAO<;J((shWFK(X}|8wYXo*ilU|tUQ*GxvqgD7PfPYi)P5(hTKFc zJWd(+ds!spNH;o;q znt?OD;@-7?LUT9q zSF%f)uE-Ym@ut%|m7_CUR^LEbN$dPwv-!4dU*rQ{e=OR~H*s7_$EJjECKC|y-l59n zRY&UIqWF6v)|}7lE2x{=HuOWB<3vqIs>>fxdf&coC5(!5`@UKBgjP_`tGi`Jj47;R zDVY3$f-vq;ti5Qaw+PC zsQ%F_S%2^x{1Q8nsuCEw0aa&jHb0>!78E~ygl)R$O6~Ua6*d>mh2et(Zf&B@W|KFY z1P%`*aK&PnL%OrAF5fke_3IK|z7wa#iX#!hg7hmyt~&luLz(%Ly1Q%krC}15%h0EG zC9{;WuecEohe*j`?x!~6hur>m4`G-hK_zAO2}X7D4%!<(Lk}Y*!Rk_(d2h(@fb>f~f%)0r{wJdsprwzK@r}E;Sfq<65>TX7cB`lnCfR{6$wg)Z2tv@eV z0=q8BF>W(VPHca1C#&b-wKq5?Qts5s_$g%?LigBJ6F(V9QIHEK`!H~+7Wi`XKFIbn zuz$)YkkDUV%L6R`T+k_px%vJP7Pa@^;UN-{qO8OjWS_h})~_XqzrDV_LQkcsuy7wj zl|!2polEFf9NtsfjjYV!riRkG5PitZduH`D?rn;kF|J)1E*&E z(Q<$cS;))tXm{kuBqrJT0Og;z>e@Q94Q^PQV>nH+Wf5g;n;5~Z8Zj|Sqz?V>9O z#&K+Hcb)0h*!cZU&FMrCUK|&)6cE9Omfu{vWfLI!t@h~N1W$GP_Voc$kzlpmV~iyD z2rTh7C|)H4pd{lO7Wl9&4G9)`tJtUseatt`2Uiny5}?x2z^SWru{ttxyD|aq4hDEb z(XK^px=#Q5b=G{k6_>`Ymi1;sq(y($gHbG8!lvg+!d;&!B-82yYQvxktM?S-K ztFZ7Bf~l5Q$p`aX+;p>O2;=zk?f-P!DX7~$5zqSxOF^fBwD4G_4*DW{C@W*tA>aHl zyM1#H|1&a9uC%jweFB>5-iqhSp+ZXNn*9cWU1?Cc;k0@wIkDl)Jhy-ObJIlYUpGIF zL19yzTy~EhLW*BBmg(M7yXrcm%7!^En;T+>zS{DlL$o>X{t)ndW?``T$c+~lk>{l_ z_>T~Wd~8;)ze5xTH@Wb*D%U6C^16WNZkdWdg6W9j&?WR(0rk6-&p^sgkg}QX(Vj~K z%6c$zQmGa#vJw=YG}(x7@v#*~A_#WR^q>-LHw2M@&BgKg9rSc=*YNUaFBx&}d1A18vgIFZ2aF< z;ssRoyvSyHQ&sK5zi0RG4`>i2kEPM2f74l6wO`DEroO&|inc`G2MBYz2Y~u@M)zia zcZAnK^F*;W2n%%LEl+fH}c+)xT&S;Gu6WkVx=+fAP#dKz;q1f^WrRcKqhY?-L>x*@?B6>LTjQmwuIfA zs+Ehw3l-YjF5&gs{vN!sT7^JQLF@_+-WUcoHdP`7Cz~!wdeY<3KG^}#iFguMk(8h} zOKA4@JUof679P9(1({992WUney(TB{R>rkx?+#a~;bOo_RB?A96LQuh*d6B9fwMYZ zK>Hhk37*h~1wVwybkZ(VlOEOZ;AbDK5SG}OrvE_u(GXAJ!BvW*78=8LZ@4lTg1bB* zjyI|ysOTyr?kla2&mcs5UCJ(@!d-9R$x=B3;?3iKKy)jJ7@)zJc@L6|T2`1N7yIR5 zPaXK4MVASycc>nm>7^#h&s?wI0g}acc$B+;TTQ(fJIpP9$96w{))OPQm%YT-J^Vg*rsf7J`ZoO;v9<3*LilL0o3XnS~h;ozp; zK0#h<3lHc(J96<~G@^)oj-_|*`21=KTM#~W^mz>XnYgoi*G8G{zl-6ks{i|1&*8PC z#f*U!e;vbpe)ammLaRSS81;?%>Ih=Ru1;G;reIZ*ql?b<1-?^;ar&WtXqI}%Q&kOg zzirpIkStos5`Gy{NIU3m+{<{V&tndq+GQ$Bx8ZD{AM;mu`~tI-2Gv1^b{7mPQ3hK=paPB+6Y;~gYIfYu`TdmdN{%u zvVln@^HtOrBPW#)@Vy4(Eqr$0$BT4<@bR%Sdr}N$TSJ zVzYqM&>J`sQT6Hb=>q=Gpmy}JUVm%Wf|T~3gr4&gM6pW)Xavw`Q|1hWTFaFf_I~&# zl?8D+KuqCf5Bj~?mMZc9B<0@l?%|gsaaaL2R3I7jix{Sp6>ON!Psot`1^2QA!u!Q~ zvjyc6`CsLROj8-o_o|~IKEu-Xe1nvwazs>BcVSpWdl+N%YlIuJ=zStWB#1>I3D+!s zih4?RCiZ+T9usYUs*C9R@xlN4ms%UYuIrbl#ccCi{}(gp1^C;ue4Iyp;T)f-3CwX~ zDRY4)ra~}*CP%lh!mYNl^9wA^^-}mROy6<1U>=sFeThl=5^h4 z=%D=zyygMN%fEtY&U$y#ZE+pr?u=6j{1Q%SUfzOOzJwokA#`@9+q^?kiqf~lFt9Ppr?q6UvMb$CDzf~ddqz-jNMGN%5@ zFj^yp{42k& zs?Fqq1*XB~1nC4@u_Acbx)sASVwy}{AE7B2)a9LBSAB4??od(NTrZu8)e>P*10_pegx&0u~*F!=84S)5*#6VzmG#+uTAL8+y%&hYy~h!%Khj zKow8q@s2e(bJ~e_^l!U4(lp`)B-7~3lA*-EM@HukESWkLn7!&^^8}CJe!FWwwI5;s zeh1Y+xEj{6OSmpT*B9DKZ7~8%CMjt)u^=@CS1?>nLBtDOGgX_oMdwzQ$!thTJeykQ zR)k4TP8iyhjPjU^f5i6li`srV`GWCjo0}?ifpGR+y{%F7%Jft8`c~H3LXiZfAbWM8 zGzzRQ6lLZLL(v3AUv`b5gr~$c=c>TCb;jZrD#f(JKxmHg3&vV#`}~oT$pKJCwwftUR1hn&Jo;e02ub7vM+)l0B+dL?2A@7YRyD z&X%=IsNghh-K3a9<0!InQi5_QXzh&UkQ^R>X6ggmRVQ@D2Hc5W8cvw0x88NRge$a%iB>=k?-&Hc@OUJkbKL?9-xF&#(}*o_~EiHvoMMoob* zt>_RF=#E@J5-4F!N?buw=pYZuasL##3~n*I`DhR~BUP6&8qlYN*qY-$k|^(JElJ{m z=h<1SNdjFS)qQFKa^~z)z49tyZfUS-9ZVXBbGdj@xE{i}cgIOOtiL0veLSOj@kE%*MJ#i&oRFf}CpWVYNxZ=U`w{R^2-g#HQK)c83 zckxh+;~j@de`j}xTwcH(Y3Szw4FW&i`Z$CiMEMjnUp_P5FWid|x$K>+;C`*(@B+Q} z`YTCLcD3wh)LeUhDM8}Z=+|Pcx8W{0*vI6`egpla;To6jx}zwkWWL1ZsnC{vNu6!D z)j-P<;uI=!#$(jDbamE>Te3lAqv|VvCgjQHz09)9F;~Z``CR9&e_4xFu1{U?+M{LI zed){Usfl0hsrR7?-1P<`EV3My9sT4)JyRgND15B9Gk65{>tFTqwVB=)F*nh-dD3T3 zqmU65g}Q54Z({lAhrC(A&Xkd zir^){UIxM#qP{;2&U5%lcA@iZ&aF?F9d$h*6w8I-t^JZzT>lZT7h6c#09Tj_E-`!(*kCi*>!|nZ;;_J(HWhfq z7%Daq5_WV%!1i$%fJv5(GO+Fz#*HQH%|DEcB=8XYtKV2MXf$NS;oz3*7G^dZ3*x1O zU%@)&7ovAn4n&lA%)53{d!~kG!mHz1aznU@u6Pl~)hq&vs0K2SxPd1sO*8Y3f%!hU zYhOMz-?w(^3z>%)0A#6hK|9VF^UnX2lxeuRf-Cc-v02>fAD5tyK2`^MbE(Ik67TINyl2Mx2bHun%V5W_ysw{)WUxqofhL-|t4G#kc+(UKpuARM#_tcdMR+s8=$iDC$!hwH&B2Qsf zdIjW0@X|BR6vzzAwy5(gluCmKl{A*TjV7KX;vLvlZAm51sKaQm>N%923fZG_Yzwv6 zDa8TCGpRnmY~dBxdMO_d?r)=uD`bNYm`;!3T_E}7+r#iWA`|pf-tWfiI*TS@)W6_P z-Yx27`!#vBC2$!ANigsX3({Q%zdV?LF(PclhS)1?2npK|gGiWBFcuCSP9_qpN!7_M zTx5jn2fsJVmu9`0oW8C$@Hg;u8oYD|42 zF5R$>+Y|E^As_qnQDH&^jJKDKLlpFad69IH`C7W_PS3~{*+A|@ku73Nz<+i!2O$Vw z!;!(U4$E(vW?e)I1f|TGk*aBDDP-jWWC+j&W{HqbF?i{P^5{QUQ5W`3)D0cZ1s951 z%FSJuZ7MMteT1O`7gs2seu~rlI^+~0Ddoo$uTsv)vv~3`3?gR<7%et-l4I5wdrzw< z($ECNYI6f?AQ>?K_=f^!!~hfpZ$T%5;Q=K`0L8%UFo2E)VPVGsVJzG=JctFa=m~Ps zfXd09d|0fS>&IzzBok5_Sn4<8B4l^&*m>e%ae^VQ!hA|sF`Ako<*-{;Mw?XcpLX~U$>C&I9sDP@yL znN@_8J+U@abZ%`B=JdK3H+3E`c5zWmb-1{0_vj8z2zOLR~RfKg2xDW0Xd?|0|~_Nm;JzyML1PlV7?^wPEg&P4hkvqhJedgyMt7a~r(3Sm)xdi!lzxbj+TReXyI3FRJ zW>UtCu}EKxRg3XG!XGe+T;)jF`Df2#hLg!356`<~n*k5~PG&04(dA1L(Zia%`|)9~ zwR?Kl*@g-^kpD89)|xj1sD2ImfPjm|W6nZR%1g8O<$GurI;>)T@61DnJSXwA1BSR) zrr#pGe7zjd1Qa0O8#B?5_ry#>JU5x8;yl#FX9jsgc9==LFH?Gm7B-9BjthIB-O|Dy zm#PBVTn9`BbDWE%l-uNT&G(#Kj95$j&XbJ~`8nc05t6tIb$pJn^Ysj23TQ>XBjr;V z?@Rf#cs?&z`+3-RF-yqN3jhV>QVi1D4bOy zkLUaFpxycz$5Pfi$LXbd=Qu{JYccQ4z=!;&(>r%axZW9kj(Ytj6G$H<x&)t02n9nEVzXrzG>Dt_-Gj8U2oDj&mWrIxS?$Q*F-5;6x+w1~`I%#ZzKz+Rl? z~`2e8Ps$W3;F+n_-+4$VQXh?wl_Jye0&qSFA*S>n8C4jax7psrZ-$4ggvi zvZbq+g-HE4Uzm8^E+I_JBSSWr1r9(jOy^wyGIr&tcuz4A(BT0lC2qTw3LsSwXZ99 zb`Q0|@FyY(WnLtWRe=YSFp8`eFJvGnR>dwXlauU8LBr|I*0&~10>zW8o)e{rU7`L`xQ$gB56IYV*22@ z!HX9jE3G#a^uc4}b*PgD^eKB(zYGj+-R5H$LerOay|t8%VP6!3(G41zDo2pxWtW1% zEjvC2I&y#%FP#rNJiqc+7oscsL%kNq5I4}!Y`bkN;d>?KhE6wrHy)m0yI_Nm`|5N( zhvlR1bZyC)*W=nXwoEU@K*e=f98^r-#XyD4AXSq!v^((%o^O~M-8(KJ0qe}}c(D4j zJl;c152nBdGn9NyW;TAp;$ct@)qT?9Pv3cPg$A2)IN(9AW`)seA_N~jEC>NJ4-H7t zF@({5s6_Xe9t;6_^YVQ~XZT|Cv|g;f-L;?Ek8m)4_f)T@i(zGRgf*UF#S^7IKs#Y- zN7_DE>{AoC#gS7Wh3cbhgg>ZqoX@-Voz9$>hi*W7a&uPaosZ_nB?ClyEHc0bqX^v- zzyF^1wSWEU@no*=9&oIG$<&D!dILcZ_0k%|WoNvn16@Putdc%$hnP{=m9Su7mQnx_ zMZbO(nUOuxO7|NjM#%Fa<0~=O$W|f<389#L5Ua{iuam4#{WmwcqD;ivSX)jLj z72N#nQ;qgY3(Z-{wFu8eg5$@-PXR<@@mriHz9e-p>G0{E-Ny;ni@H(_T-Xmy{jHgQ ze)u=E9e&qr;h*hVbZzqSgiRfVFd3pU&!V`VlEoR<`>~K=9ZnynhIi+P%wqrQ;?LFM zv0Xol27R|M8}Kg5*lbZ0zsyjmRLrqT>N*oSJUo3;=J@{3NDwjppKVR zb*z8283tn3&ESVKesAiRx65|+?OJrHA0PrJNctme{=;80WuXD6JM^od36f4F-G~i( zJnPW_yw6!9%`za(2vt<(p2Q2EA@+dsdNbOL(1XcI98?g{hEvEo}4fQ8`qOuLF9wVMIGg<_=HUgnYyGl8(j}DK0aL>aOJ;LXqi5}*w z!_=Hzo?ds=e%rjDl|L!28@P%^Zx|mHL`d;sPq-Bv72ahQM4W$rFn^wCnqVihgC$1x zQ_*RUZ^@V_kY6o0Z`y!%sNi@B+l}|ealayVvLEpI7U}b^)&+_X+SJ z6I?)A-XOusG9&J!l=^J)q)%=$VETl(hAA)x9B_`4t=A{p!^dQU>Xm>s)-|Olqll3EMGef^ z&$M)s)9D42=CAAS+;4cSu{wEMFT{JHS5M9C8{8YdJ--)*2!?%bp6nc+sgspBIsm@j zn5S32fV8R#O7!)#d>>ruFTfkNP+7+5kEESimni{o8Fh3_um)d_SO`|ier#Mu;)SQ&3=v` zXY~Zk7YFu%BY1jugt}_vb5vbCi@Cks*4yU&Vzt;jHN7X1VdEGcd;h8s?Ph9-M0Z4F zA0tW6nU9#8>6DoW&(|y_f!)kl)(Oujc_NB?(Mn8lFDmNK>if?iMoCrgN300M-n%&N z_Qk5es_WIu>-PO(DcTfGXW!*AWi0Uht_FyinZ6-liR^VIT`$G=i}hyvvEI&}7OSs+ z)yvmrddsbR8;Hs1NHBSPZ+ic+OjaokADwZkWUNnB;IM5hb0yk8I(hcb+?Xzq$)s`* zkcd{qQW}wXJ(%B!!19tEqxImZp3kozKegL8OSsxP|9SV+tf>`^C2}!qSKE5A+Gy*P zq03mbvI84r3p$Grq~rXe4ykM41j=%oehSiv#lG)dy{(JxQ%^RF|7}camw8bIT#OeLcZ^8%I+gV`YY`WIu9o5|&eX7zRZ^ky}`daBp;3>HDrt$V#tRp6xQ zQX!=2VQv!7C@8{-&r$<0gCK68mp=xa*Df>$UTmJgG!J1R?(rPsz}H{9SDjqdYtfYQ z`K4VoE9l5$*q?c!JYdWhqQAXr=i>wR?q^JCLVX@)n+Y|}c(|KBlhcwDTc9?IpvW;l ziXv|!Oedf>DQ2_)UYmVxjFn+WiD*n@Y)peCKN=gFgt6En=}hv{6sC0r|zlOax+~q`0wH-q+ypGPO6VNQwcf zle_w1*@&X8x9vX(o{+$0_%ecl=Nq6kufZ=5hCli|kAPUpwdo*|%*n*V$wY#!hT7v$ zKN-HLG>0_twt2H$s@5xgC0gV#f{T6Az_|=udW9;I`K`$I8yzi4Kx?2>M-Gfmr4%N5 zUPS?-hg8mk5{jj-Ow*OsEGTp?E#=KU5}$O9afHFawc>fR92XWZOJ9Ra zQD&~g%xbQ%)-Y-9+&|#Ol^MF15;!7Gyvlw@zHcK&Bge7H?mdX6r&eAg#|Vwp9Lppp z+3vb9>|EGmBxE=fFMVgB=|c@&O_k44uwpF6j6aX6t{^1Tj>Skx@kOi1Vpt*!7pN!8 z=U_x-*%+cJHD)n7?2w&>C>qDJurP!Ba?au+S|=9cJEEm&6=V6tra6ym1l_FC4_6f# z-MG5Bu8ywS5qcFC@li))PEMq_t-!-Q49#)g(AwecqhBaBh{ zHFp|5!0;cmjis89d|;3o>EUd#XF53>QPj_M$%QLb#oDaj$(+wkyIjnE`cnyrkXaOE zw#$qQjt0T5aLgoy<5tHBV4Nh)5o98<$~nurs_agy906ddX9|E!h4-kP!BEIOWW9Xj zSZz!#qLmh9r>=WD+cbooxv@YMx3X*hw$i!v;U6Wqrxo(($&YyZFmY1`E}y}L4Kx;a z=ny$2;GPlr28cGr*d_y;V$Zx`WZWDU2btbJON}ZQ5Mu{Y4sUiPpL?D-*#LG;-xv~T zPFa!Wz`Bf2u!?12Ks=Onn^+zE22hqN%`flDQ)Aihj0&0`)(oR{F;`6-NDwD`oXrE# zO<(p(>oIT1D@&C}bAPjs7D4XvTvj9`M!`MCE}&9oFbThs$RjLvkA@L6IN558Zz-$b;hhB%8EQ(W2Mf1kCwe?* zfkjvM~#5|xw_Hw&>8G^e418#0=1c7ySf%Oh-HlGwq)Vl$#i@k6;(jA^HE z3E0z*-7Mr%Nzj3g^JvHoN4h-3jtx2_r#Fk|mnFJ3Z6-$jOI-)gPe^Kj^sSf% z&v_p+Mu@{?W=)dj89{Tm8y;x1JSKCFpdF_Q9noGTxVsX~D~==L1n~F%;Z)Vly8XIt zHk-FKbadkKMZnV4jv(Oa69VFaut$zmi5-(-=^-3kbwq=rJ7}a+k@})5ZRK-q-%w?(q<1;VP{M zoU5-saHg7hz_GeH{98rU47(}^L{Euo6$a#pIi0yEgpWB4czOF$uQ$zYv%QAv3$kUu zX;Stj_tOvcL$gF%xjq6tM5FONvcqjLzDJf4nv3s|D{SWnRUvJODikly3$K;9L-wBb zB?(Q$6OnTA9TX*VN8<#us_x{LruYP;JY1j*SoIR!kv^Dx^%RNTIl@+%$|Gb3!Gj;V72a94BVs64A$#aES=ha&Ua)=_xphTWJTbbXT4;+`m&E ze|~}Rb$Fe{AG9l?{QY15efsXNhve<%)YrUkOhu#X}FwTmCwa1vCN=+8^iR$*%BIlYq8{o-mhP(U*b}4WAP^V8OE>5DiC0z-)e$ z?jm-quo!*5f?#(r0uPp^_k27-2{3E^T96c!h)a%^U?x})h(=Ve@I+QeZ`(B-uZt!h zDv7gz|KluW)yeg9{k0i7Sn#v+7G(PJW>e=aUKB0}_1mADX1)3Cu~{zud8`-fW(`+w zetXw^Z9>Mr$^|y?LE4+BYvR-Cz9n-|*{)#lyN@|GaAF&2R89 z&#U-OK;3_RUEDv^o5gJN+mFQ@qK@wGu}uHZHR;Uy5qHaCliu zHyuwzmyozj$IHoGIN;&h-^c`QZ~J|Ao}(dh$B&UHEv#b!M*-I-1yp7Bh_nU?fS z!k?b^bf8x%<4ApSyKBjpVl`rUjo`x-9U1IJFq@jLPY{^JN6GSp}-)FCdihHFCn!zlwKeGN2# zdCQIl;C=4*bQ%%Kfpb&oK6pIk>GZkLmXE&n!#m5PU=By+MX<2Op+crK3RU(2x1JMp zuHZ=wk*Jqr{Nj>=yx|aV)pΝi7{<>6-C8aDkA->4o!wl=ho!uKiXsjtbpraAeNn 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∾p9sifF*ZTAi=z9HGIg}(p_zciXHpNqw-`0FK{R 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 @C zqSp-*79NLP9X>*ck|qbWJVNN%qi#cat)5B(y_ZzI{3ZOIFM@zG00HR`S&>ao|5Q3)d*boxKZww{rAa6PM7# zHnSi9xdHxOxjT%PT+Vh_$GE~eoG)CW9MJtOQ7Rs958dL;ozuUQTh1)JM~Crip|fEeqiAUQg1th%pgc9oF>i;Uf{Fr!1zNs?m#yI4pq<^WC>|950d%0(*!GjedO1cBBl&{$V^&3lD~MMr{NP=a*Wr59p#=uq)nb4?Vr>nA?K7 zf5+8=G`#nR@nKt$R=Kn3x_SFo$dRa}GJ|v%^}IA#o!p*_h}j)aXe?!=q31#eorbXB zI_!7fK6figcF@|R`)wi9=ZPP`|DJbOgr#9vr`*Eb2oeYN&s&k`kkfu#^`sOI;x$M{R$Mf0&`w_i%z;9)fHZ7Nj^njQ zkv6E;jw^I*uN`POy2l)~G7jrLw8z|q)&V_cAoExCn4>s+T#q@9#G`u5Q6xI{)G!`% zCkhj~Y)bGB)+`&{6hHITyVdq-KK=5LxKniqSJ-x@^qUhPF)W!b%-dhSDmh z5)}mv=Jdx=GvGQL&FKeD9Np2(6se=^xnJj#?szD{usFy9>F)dfPzhFYIkc@%iZ9b{v(*_O_#_bZoJ~ zyzNdz_U7f)#Zo=z*EK|8tJR;M-JF!6*gu?yt?^)Z_gW`lSl?R1KCol0VIR_~)=&@Q zQfo-Vdw)28x-n_JJJT9PM@gS+G+5o}zH{d>H1zGtYczxf*WqLg;m4<P zYexc(=d}a&BYN$C{a9W*PJEC=c;mf)9IqYt5w^sGdhH~dN63F`3ug7&hxC}ER>oo7 zhxVAe&^n;U3}pVQ9&;3jkLxkVk$6;(If_Kbo*Kqu?nGffE?e0kuqQvc1Rpj-J$c6s z2r3uddon!d?&EN1kS({`D*U=E9+!r`d(V-aSnquJnH1X7g#?Z;ImPF+9yU!iLST#;Z%m4(Zd=jAEFJuF?_uJo)S8 zF*hI58=u{6mWLnnU4EOd7x^yV-Oaz}i@U@80ADYQ)#_ix;px+Ez9{nb;rcT+n3^uW z<@fW4RX&|gzu(@^Zn00td287Mq7d#@>*h(ojztWE%uBN~LIwb3d9Tr?@_(ll)6VFy}>2w6lIJZ;bqlN=i`l)W$J?+>K`A zarrX|%=IDP%@3R1{_GZHd%gnwo(ZAtE;`yukN}AdSnr+lf(Xd3k=8S@`HJP{XoZK7DWZ8$)&Cu-pem7t5mz&*lzW85eu63fvW_0t|yWJ|E zeJR%YeD^=PZOX|FxSAD12VcQZzR0OL1(!m@o9QyQUa1)5Oux9Coa7V)GcvF?p z0^BTViVYEND9EV2da;y*`}Ag0Koqi^W|R4LyLzo04Oh6KNWlbG1&3ZNi}m6UuwD87 zK=AH2Q2=#BtxM?y56le>u-qVX1CdHc86lKp08G~)1__H ziAsg?{mo`y;K&%Fo>wrR>0LIvZy2PsGx=73C#3yd!eIdx0+njFSWrVk@C>$V<#hiC zmLZ@+dZp&*2FA)G|A|1~THZ?1aSe}^B;9(r_|jl!=pY*^VhfoA8Yc^OZ!&dwLuH{b zq0wsKeu!wfSKO)8R+Tn6n&PY|IJ&Z|DLJk;UM5?Ps}w74=vu3(B9wr1Fb$QTgfgJQ zs~Avjl!EiA_6mr9zcvvjl7I?L|aGZlG57I#de z#bK^;QoqpQfjTqyf>tvdY7r}h!!BIMpi^b0TR^M1rFNDYqVLO7YDz{QZc;-UdhwAO z(h%v{q_OBCDS4#GE6EhBHfE6hYsGw=y=*1rxck~p(((4Vm7XK+cPl+Z?tLo({{z9v zadu!8-W_+>)npuRr&Tl@ad%ZT47sB!q;GK-DHU-8$M{f3sUEy0s&-=Y@kA_T`m1}y z!Z5nsdb?gtRz`MIZd&JdT+Vh33?mn{iq+DE^haIDYCeN4UWIYs1?w0JG?kCk-bYjX zeYqcv>FC4%Xi7vc4oFiX(s&?Ev8HoDDm~TiXd#ktt7REx?^;nGX&+l@Ir5&i({#lB zZ6)ZKd)-RVp!?oR!LOzRs`%+ho3FxuoU>&v^+Sl83m#ToSMS7{R&YQNMQe;V?t;Bd2_ zOqfnX8n-})n!uT2ApPFdFw6oPdSF%>CrW2l0#&So>_ZppIQmq^2Clxev5u%Wb*v*w zsE>8frb4c&FFH6-Iu^}?s!+6djC2ehOS7<+Jt7>@wQV4Dze4YCQ5 zaeetjI`{h8gg6JoD@wgX07=9Skx@*Qyvs0*`F;Mgcz$_)zj;|N_N?{Ln1%zEmLS?mh0^b>eyyYrzpN5O&nPk8SpY0kV23Tj8%PXH%2$&t4~3p;d9 zOHOAAlntUS66i8Fol(jIcLilJ6++(|N^_Qdqs-3thuysR_H;lUas531MlEU;rHq2$ z=vZ77H=hH&$hxkAgFZu4BPkr8-sVead%b?luRzfr^2OJOzd(=P9CnV*yxIh^fbN{U zpYL<3HxSL^`Vy7#2$rqvy4zyuMAxO$cT4C?m)CvuKqp|cxb0K%xX;dS^ZopJyMjK& z|9qLRio@%)_w{zqD|X5Inwim}c|5B4mM>`MP-PXckdX>5#+L^OQnT|%*kP50qXRo^ zrLGt~etviPTRz{uUu_=$Cec*RnIZWB0MEe@_%J`rn*TwW=|MCC|%L}VM%GN$+mtexJ%C}|Z1ONSEh?IEBFG+Wj#4ggoU-(UlspuUj=GYbt_ zMP@&kvuy=*q%P`EqBOsoe!UC4Iy$MJ4ne0UBCy1rc>h%J==K7w=Kbq7&&I|6zF0|H zs?ORBFSF*zG5E(PPe`YW2Ew9IoA_t*?GkKEJep-}(O_#&g^TCi1I?*B85R4lYuVy> zHOIjI-DPbX{fvb~ zCwGsVZN8xP$iQjt-C$Uue+;V4&(?J5SI~IN#5uK)xtT0>^B-hA>xGAY*Y!pla++M14~m(&sY7DU#*6&% zdilrZ@W;z)1$$Ms^yBObq<#+3;_gGf$`APs+*o-eN715q+Kc!30{XP?HV|qu^d^or zCIGsy!^Fy(Nug7f_-h%cBkn`LOn-t$4qD!!Ur5yrDFl$~4RSs)AJ7uf^gnKPxA_a? zPrSL4)(Qqr7C?GImy3m0)wm3kyygphBF%h_vno)L*`z9XGUe4tc2MQJLoXI~4P+J1 zz$y46|3M3Ox7r+njq}q=%NSm%gSz~DzK6oEM|h-e_4?;NmnL3)u;KWNLxCsI$!+z~ zWhN94-+;WO6kjErK6QlCy`U_k@l)nD4y;QRO*Saz(ut56h@%S~rFH&XgJ=HuH`HsY zhW7Xyb&O}K@*n_TcFA`-rNRs!or~jfzTUs=@;i9R5Kd|^LVUzfN%HfJP`E@ z4)OE@%U-1f%ob}P{&O}Bh4dIR%|@URg-^RvWp1E3kMaF2bxU2X=KK90^XI-ogE)i( z%|6R;>XQ3>&mV(=qewmD0ngSSg9nhhR5b5E6mX~Lpic6X^TE_y69?gtR7US@`utocIQvFAS?=;ugNneQ zZ;a!~;c2(|@s$oUz*PlF{5UUG;KH)~)U+zc={!dGPbAe@}Bwsy2;BnXS z$zg)ix54L=?;Tq?H(4HNCM`{S;44!V^^Q<=tAvgwgch}67g%j5F5%$au?ha;H7hqv zg9axIXTL^UtIzC>Awt_$}rQ*-3m z7)1ojtnqG+SdmP-u*2oj_z||aehJ+8=5n)KiiGzR#9h`^2jFJo>XIQO$|Y%f$#&o# z_?RxqiHi2GyXwXq)q_<37TDdXWZ%zLqmr4I{j_MghTR<^ap_*%)i&Ei;9nCnYl-pa3P;*?_ z1d-j(cX0H840ocG{(`Xy$1VjjDt8H#Kas_-%%d?-vGtal-LtrV!eLIQ_cKtmvWiiN zkwI_^Uqmno+4F9Xwix{o_f;D)DMs0L<&ys-i|7^@a3TC%IeL(o3TNZh^@$8XCBxnr zs7GV~=3pWNxEhE|G0jeB{|Hfk{~BT3nZ#vhaMSDcU&Z0+78};!H8r@*KAPbzF|UKv z)Rxy+QB6Dh(F}st>aF%ZTb>`bZ0Hm$tqS#A^557QvMn4OJ#64&wTR_<#gt|9Ej)LC zoiXk=Lb(0)*C#XCx}$&b&43L^R^@;g_G<`f&Mq}7+~LO%1U1(p#=4bCOjqBf1FUT{F7ct9$CO7#Jnq6hHIT zyW3Cir90U#KVpd!akN4l32eW#!KL%n3bHL4--c%rHR+RtKuf4a0e9`h5&|vRM67B3 z111v9l%@y{dga)7tn_ububX1k;wF_;L9%Dk2!wmJ)DUx+D0BF8t$60z_`9LLaC%PbltovNmXJ zehuDgB>y5@W=-&Z8AfYVzgb?_G7Qq8D2zAEXgA5f0GHpkBCc6Wbp8VT1gX`w+MBg< zHFHg(-z=vYbAK5X;idYQ;dL!AZ&(}atX7HsH8}mYRWjpmBdu&iN<2E?fMs*x@rmU< z(2v-~tMQYdA#9+hhrtF~OB2eY;2mb7rG-1qwbuiWK#Df*d51TaSB@w84aFu=L~C9w=(4wxB5y&f}A zsAm|>zoe@1&fu5OHu?lTMcN z@eR(Kg$ct<-L)BqxD0@oQRub}y&s}J`%OD#T>eZ|?ALU!V6)qw-NK;x>g^maw3|kD zu3X{y-*|5H zIao#JtsI-SS(AhsAdZ8*Z~r(ltP9zG$N4o<97(_6##f?=Uw7w6PQofNZ*uELPN>?6 zQIqgXcvF;p?X*ZbtZR8>n!0a)Z#+(y=KlpP5ANV~?1i`^-zFsIF`2la93OPUYa8oD zz9SkwLW00X!4Oe5gwbuH=$^^1?Swy;)YhOyI-uu?G>D5`b8$NV130%?rfw3Tkj>{! z9UX^AjXfkb)O!TrgbFi+EhZ`ZrX;4`%5Pg-R65hiiUze$K~Yita#EtWD{os&7@_Ip zLD|ji)l05Sm3~}p<_GH0i#A7Vlnwo;=&Yb_CQ~(qcWJ)n z4k7wpJd+Gbi}N6f zpFGqQnWNTjmafgjw?%r<3zYgsct}xke9zje<194O;!wfkOVX5;{=A*<;jpRLL$BZK z^>R~c&?cJF4>6k*`>*Sq&b9tkEb>5~*Z_Uw47wiPZ?<3ZCA?(5Tjx8`x6681C&ZAbqq z+Ew=!e?{HO=Af;EV|(>&{qzkdCYBonB2(XYsUmHJ}Km*W}=P%c=X}r`T6x~R~(AR`RWeF7n}98(Tj6oNbxVu0j$O^ z&Xr@>i*sV;&X?`VG20bBe}pg9-K&-327j$@F~Z0?cdH~-iYa^Dj(sLyx1&$^D)sfQ zLw4BI&ye`vWNj+yrxjrS%9ABPs2P=Do(5ib^pq5Dy~f(hR(I;tfe9vPMTC>&hzv0m z?-*uYQ6{ZZiXJJwmij>;Q)k{5kU6uOGM*fscAFnx*R|w)oENK?T?t1R`Oe&hJ)}rikSs2Y;m;ZLp47>Q5Rw+} zKxVK>wu|ghyAcWY$~CYF;{nTw+A+V zZX*)-%q$zR`KAwnbiD=~oW__oxA6>lg-?3;)nO+%@);f=-fZ>|%s>#sjtxg&f2{Kb zc@-^I&f{pD1IjOO&dPRPccGr&=|a-m46@NKf8Ko0X%_rxrQUE7*EWxTGp_Z94PNiW z>wIcac5k?{OmOpdzWxS2BIBoG`ENj^%>C!v_aZPZeqz9iMo9*&Mxfgkav2I&kcF?* z8>7aP=VDzv7ke=Io8A0d{`Gsld&=jFJrfG6uhwFYo-LeR?4NeU`tSSAADiF7EZ;+C z{;+qSmQKOA+qd~L$KWYn`0;sJMA;iZi(1f&vdlM#|21%nHPwqYvYBrl)2Vz;T&($- zH|leFwO!;z%vfdQU^6COvl;iMT2JPSh3?u8VdF3J^&av-GBLzbcrvs#Hg*fCZT4`p zONz$hMXfFFH-GNoW*{mKbp61Osk6h^_cN@1zdIGeY6*#+3#Yb8qgF=v%y{&x*{(yj z=K8GN`{rJQ)q)6`{rx7zyYtPlL(1mozk+7J)Y@OarPbjL;i982$5F6(mR})Yz%t4YV;#He)?{?guGb& zXW#a65qk+qW8oxOG!;pX;%=k%qY2T=^Av!9*%YS=MkH+cI4-d8Bdjt|am1;CL#CV6 zOQ>_tp*__0sd(IDo-zM<$VPQG99iNz;)=?lbU_f2Ht7Q1o+%-w`f{#8l$JEBAsQ5z z1|gArMP^*$fJG)*g1|gt(K)Zu1$l>5N+-09vL``IwC?9I36nTb;T%aEoH*^3RLL~V zgv8CmlKgOo06~zRy^wjleqDQ?U425Yg4W)t;?Zq3G{FZulMd?B(;AK;V; zO*NfV*ycZ-ata#{&qm-OTy0*kXiRko8Uq^RMJSc_tJQqJ|6~5l(>S(C#0_msQI;V& za&8chD{fmiSp3AQBP@3M-VGMWp)$v$yFXgWQu;L@+-%jdesseyNZ8saeq{p(gcI5l z2BX6xZ;2Q3IA~jFx3u$)Q*BANY8=YJR=%AUPP+<>2EL1q!-pfOQ^p6)T38O9Y_^)k zq+Oj4jf9kou7U2yazr~7DQ7m-N?He#;9*$G3`IK|$Csrg3`U2omMpwGfMIx{pw5N) zmg>`L^JBVPg1g_qryr@K+88@^e4OFP6r6D*VrR{@6Z8C9frwZ1Di;_P@p{?`g72Ex ziA0Y&`>@+=@1Ew17SdxG+d_scP~zkwGe*XZ^YGAsIE7NcHc?;*P_%3X0Wm$(WojJ& zRnjKU7j$zqx`%8ulvQtD4ioH$-5?olPq-QYDcQoZK}`laGPBvqKVJ5SVhM*ISO=P& z&9_kMpqv?Df3WYj_cJJ!0X?n#m(;eTqB>=Q5!v_$9C1~}rAwvuMLBC*PJyZFZ=T@Q z;6|53Rw_J=5~;=v;uEL#q2WZSeOz3U&4{-QV7?V_m4pQkEDS7`0}29?Xbqus_-k1a zpeH#g?O+f@%SOZ0+gzR41>4{&zpUo=#SMBq%K%OupPWZ`cF|`Y-0ddQ0W`4+yxVMA zSon?zTN&VlIHPTKN}R(iW}L&+Y5&Hd=xy_H_lt-F-F&Ebz1==u(dFEaqZ{q*~pRxIpeeC@S02`SZ4ZIp#NK2CVl znZ}KXoi&%9=#WyK0s|4RO57lr47ZyI1JP-B#|OCDwJAe5J*K+BIZhL>d@&Mf1J01R zJ75>z#K z`f2sLee%TF)R;vp{4zpj&5B5%M1_d8Wpc8~z%tgZ8l{NAJ|Q`|eW8NT$oe&d8a-Aa zc*-o~<(UTK%1LNf+@b_2G@D?lNp=}w@d=B~;K%8?Adzju`CLvfC zEN%2s7kqKLsLKwC!{E~jUFO$PF(yOF#d(lf@=Z4gO0JoGRsV`5rY+~nq5H@-`~Z%= zi?C{tl6aKy=D3U04TOcM+B8Oj^E^u9^U1~yVU%|X+kjrZfuB`Q?BSay(ZXkCXKrJl z&W3kJyk!SXfm(UprHUFo=UjF$o@sLxnP}Qv2`Um|Cy!>y35guT#42t~DD?7>=#9NR zl~CfghPt7|$hdLMxWRS<*Pa~!wb@oBcNj%njyq7)MPm3^y}Zkj z#)sxTqVZt9Xp_Ycct#DN!?Tp3UMHHJG=M8vcG-`{>h;;jl}=w)wx~-vwb%qUx(s&m zV!SB($ei~9qt~K|2 zw*>gN*k=-ODCWfNeKnZL)N}1zFt@{0GJHVr&-LR|{s3b zhDA>P7$O9*aY!TpvK%&dxt-Q7Oo}Unv4sH&9intgZ4b&#o$_f!h@*TR3Tu>4gP{y9 zQ=n}r!OJe-_TnyIpeR(a2VAl$){j*=w0@2Dv}#u?y1U43IX4Gtl;Z`v$lYMw?>l%v znol{1q3)c6P+dm-!{iF?(QckgE?!bBbiH0~JhpqP z5oj1Ss_Jz^Rx*#?`rZJ9GEWv=>Fb8)UJ$QW;c-|3Ebt+8`3{6l@dpAZh|3`_AqIxm zcZdNH=TW2)%|Okid;4Z?>2TE{xrcD&@A)oL(Yqn&^`1(==$ufNeTF=6vHo^5FLs`N zPRV0FmGs~l2aqF1p#WYlB=0!EQON5E>P|*+#z>~J%YuyDJb(dd|fMC!={&O%Jp)T$= zQb-p(ni8qoGX)854m{L8F5okXt1}2UF5-rC19T9Ck;~aV2 zd$4D`0zMw7bjRs)lnv|vo$+5WR{@ZITNgE$VfF}6s#O{oUkfXjXr^&`D9v7r!`1)l zwzIT}7|xJK>(^e84=v0qK37jUFn>^N+L zv%PQ2NSe{tJ=dq3$PhyO#&xTn@CZXNwX>_ko)4C-+n#5=3{deAxEb(3Oxyg-*g`>^ z6q@+s#x>&xOB%;U=_YAfxF4;?EZkufX+enl=r#mM+hTe?)EKS=w;q=xn!H5#8l3XA zoe{Ht>HSB}vBp}23s&>tgWESg-)4KWADPvlx=$opN)T5f=_QEM-&h1VdCiA2337Ic zJ-gbhHZME4AuGDU^VEmK@W}#f+YmF>t}t+ZSkgRoU3YB0+SKogI*h(D;D?gJl&Vz4 z8Al&YaS)npVU<2+*0>NR0m(IE8jwuZlYk5gYbDm2;&dN3RU?#4qgv?i-VxC#%&FY1k}wqWq9g4iuS9$!DtzrlkR>+hS@3%Xea zoo=O@u2$PQ5?t(7js+LFjU&Nvv2_c-8ytsFAAT#Xdx~kOn*C(HSU^mw8df$wJI~jv z`R-eOy?nR$3$7KxC04i`r)q|ln9oEH7JF|IMnh;0aqV0hf$ZMOB^I5pjf>~N1)`~V z44#ZWp=h~+Bs(AsPT?7!!e!T&N06PH`R=fK1vPn?!<&kW>vbX_x&ZOTMisBu@a`Hm ze))VqD+=W~!oQe%S1g57TJ@uTF|3X@cXdSnqRWfHKsJDLZ{6#Cg@g&n5_=snJpSe9tZ= zGsbhRo1NSgKl9Z!^m(EQj*6A!Q4S3qsK+hHNBevD!Y(J5NIvGqCwT%6Gq1H1s~H(zi*W zAsa0!=1GZnLsi(LfvkRM1W#R24PgC~1)@;j4J73B9rF8k*!u-M-rAFpBt_zplU8`- zqUvLtO3TT!X)oJ)LJ}Lu!4~KH`F=rS1&me?E2>m`1#W= z&)2G|w}fM+Cdn>pt#S+fP3NFdjmX3u62<~l0y=qpSxWxh<7S&LZZ=T9m{YroScsL9 zm20MG0%R5`S0$JW)MsTA(y^p!NWpfx8E=Eu?t;7tN#UgGVK<&1@K5v0+yRDI6GJSV z!Cd)$^YFAB85d59uj9TA&#qOVSrW_!$A*>m!I43vb#S#SXnTd{tbOnA8(|7#_u)LQ zY$L^59;WFOcxuX`GcQRqV6z8f1Gx2~I>@nO1E_$td}i7BOR+!X>wJg*Pwt|ov@XgI zD9jKs4>krt2YmG5<@x#bYF8ZK`S;ab{)maFDMc02>4oB)p3kyN`u6?2SbcptTv30| z-SqB!Hicv==!|pK^E^ILlXd>H^u?tuI6hHX1~#Z#4#f_=fmP(%=`9dcYP{Z;k7D+6 zS<3e90;>#+snXE5uY5bnni5C{KB`9BNqcOWr5}J%W7+$fP4>lqx!;>&sZ^-K6+OPv z0F|$)SGNH-Z80}wO-43%(@gAfPMAI}Zd9YWs5O4khku&Px2>@WfGO2nz&F#Gq*23t zt{&Al7pN4Qj$5825E)NXKy20hrmfXzaM_>7r_9xJm?W)yKrg`1gtdl9hJr6u!?A2p zn(W@eWSb*OAvavtB!S4-=qc}UuB6-XM^|3;O5L?dt$;Jin+Xpmtl?OO*DZJ_<1d>Z zU-Iwy>eFt%eJURJcbnzm2lQRN&DV>3XGwuMa~(0Tnj6>{sBy+K3@HvyH*T`@2w&oa zfVt922{@r(aaJS*%yn9JCS(~73xCU3+kCgrPVeU5@k%M2F2VoM+X185_)M4m`YXB- z!&{4*U{6j6*!%fDU+CKkPjewUhh#+v5nsCAu#A}2OT!|)`>G|eW6q~3+l{hjeRaJ6 zqYZ(3&zMuN$x{}Prv`Vdq829tU*rx;HNWP%J{jg#p-&<|nJv~JdX{0-WBz99yu3uKWH(X(WE7_G@Rg{6oe+Vm zu2k(VgVovUK}IJ)ba++0BqOUz<>`*5Cr&1Mpa*Zf9_}7@#r9BUP_mH{M|$E9?NCdc z#q@~p^bv}jcGCy7i16zVC^#19u$aBmC_ z*_o+FISuq1I=O`!9=KDm%BdWvnDQ`89zbww629xhQ?qS>Fk`7$vtoL&&kz497KbNx zYoVG7+yS|1eX>em*;Fu_Q-3G{@P|^rqjb3fsTBp(t9JZv&y)APc zvvaukgo3wuIsBgQzLDtRB_0=umg~Yp{I)il4ulqnaA~1~(*MiS3yxVaRwxAbPaeJ(bqdl&~e)_Ll4-tCX8 zV^%QUk2nhdnVm{vfccW90m-O5rHj|s3oHj-Eb7c`{r55Z`{ZVRc*?N12jx}rMHMh# z!%3CsR-pvCm@iu@kIPuj&BiDCQIf0~)VHg9^Iw!jyzw!bGNid-R|dz~z-mC;=TS4| zYLdCl&Bwu z%{U#NwtigCv<4F^MgeMKr6~ZWy@bS$9FI{Qeq7BDa4j1WedR6ccs=BX&|KEsup*_$ zF`LNI&VA&jtCbFm1o!___paS-cUzzn|p$ECJ$lvAx_ZAk-}m z$HM2M?+_0Ex2Uiqzx{Xl+ub)bD&PQ(A7Xi;VJP?TpYj3F{l#hj<7p08dG3V$!5YJ< zpgWn%&V%kRMjapBU!3gLZI%Stg6cwkwACT6C!eoQy~eS~PAszNcx?Z%*c61bmmpMd9=#A} ziq@Qd{%or(!nQy>{k#Vsz7@FI0b3Kyixrk<#M9>Sqqq@WIGvu)^)f3>%iL8^{QO9t zIj#bT9qBU=T_v0aGTJpBZ!=!)@z!k$Ew*TbZyW7i23{m3@lsk zE9+M2qH_9nv0RRG%2|`~%Yrp-lk(7@4ZLZjd##B;$ev3=ZQr;ewDwZC3*o(7K3WX} z*5w|(geG<;i1{%oK?YV8z8^w?Q1pA0{35E9mgK5uSu@bQj-O6yZHA1ih`lEcpOW2q zQ-w5AwR14>qtip+2jWVtw)zl7(&-q2W{GEYP$AYspn--x=fbD3%egoZb6;L%zB>Gh z#P45qe*Yd@6Vcli+ECJY8y4=??kORS$>hl{E>sgJv}E;`eX_wZ0f3_7E(TNR4kXh9 zC6@GUG!?9Ndpd79-h9Y$w3!8IyS7$ixUiQ^k&?BiX)%OGsN($xCD0s54y7q_`1K?m zmS2EhFonhA29-cPW2~{c=zYx02IK6IR)|D;cxKBpvR{B-uygceO7g}x7rlq@e8SZH zL9EL0y9tVL3HCP*^|@H{AChz z`g*F2zP^Tshvr|f z4&2r5=MrD-*+DPw7gIQvS$sN&xT5s2j^9F2D*|@|=h`?4IL!vYl_|7D<;*KZ+Bfx7OLu1`>ce6|Y}gfvIk_iyxXIEenTwY}Qf@W#-4 z25%vl1cy_Mh8&L*dW%yulXsTYQ(lwfOq0QwQhKnr!stpUR3p21XwQJ<;gGnBYHnzw=*U2Aalg|y~Sa9s4@Cj|_cS-}QANFsJwMhREyr?E}2pgl`r?H2|@Ka`L4L ztr!7$(-Fpdsqr56dkIaOFYr{H^VO8(!5h|K`stYx9yG6*p0G=bAQraruW&EQZR~p z_xato`RcZpjRrRSGbptIT424BtyovgJ7U8;BKj)v9*S@l-g+!i9*K~mRf0YBqZ|fx zJZuLPR%^X;0m`H;|=Lp!yyZX3EDs+$6;-}}Xvhu!s>6w>zX{1%?&6lR~mi{6;^Q|vBF zUe2-og`1b65jvT)|AfuU`YFC0*|63l1G7~NP}|pv0Cx8I-Tl?kXZttvYeb*;CLX+B zv;@x)JRrOKEwCe-a-=mgPmt4l{sa%FLKX0j-@rASg06<&oa?BxlhWHR9AZ&4H`~Mb z<-BRWKFAxr*x=>Jl3=scFYRpLS$1+U?TKU0>ELuoJ=IKyY$h}jd@9EhvQUIM%i|De zCvsD`t&!xWX=`*0^-#Y4`6SmiTQF@{PB9%hMo_$t7>!3R$;Kfh(=d6nSwCGp%MzV$X$fnV1$C(-|L zL8-HAxbU*VGA0RSsV9^-J)))+Pa(age-M;n<)wEN3j-XcvR*)|vM>)Z9*AzpWminv zrgviwFarlhF6M$6a&>a+zD!G7(eJOHpntZzJ@)Lw2x8mDeUK&B*3~bcSs7>&>+qlL zTk3#+xbJ^hyel?PC396(emsR$%av=;DLzqdDi3kAZsmlj+s-f8Q@gHTZJ#&rGRqo{ zqp;rE`WDUw{OOntZscUgecl+jmW_4*1RmWnP<}ebJ+vya$&wBz2^Y(9FQs_0AS0cj zW?prEY@Eek<9k#-qAP3isxwhDQ}WWt2T^jxS3Za5XNt#!*PF%TBTOpXx4Zviy@Of) z`vJ~ows5rR4h)64>zL8PK#VPQKHg@jX=w(x%R+3ssW&&pqq}qMM)ybI`HLrcJ{?Zy z&18r9@?aRptA1mKk>EXud@O$O)9!-g#x;A4l@#Fk0mBk}O;~1udh0&Z_|g5Fe0CQQQ`6Qwt@O11;_BCtA5qz7w>)+K4T)jWplH zO~)ZjwxKlhhHbAPuWe_vWW|C;c&iD$gM-8)di`UF*}sb(^ZlnfzE zR%-!V@){IS!jaN+%Qm48H!Fvel-$rb;QSQdWf(R$%w+!b1g}|AZWo0Q3)Ud4fFPVU zYG?D6;P+!I)XZQ!;F!Wx&^Qi>*sJ41BOb_E*YiOOqTISXn?guvIlQP3!7&!>X+m6& z`HVo}sjzEvFEYHVC-31Dm=o2+`72#P3XN9bz*trH|zEWlcM$RzG_m zfJOb;ie$NRg~2&Y?#Q4W(_ur1gI7t)3#M+_01vbz9n*SqsNMsK^U$@S1{BphLk;Z* zkN*$8g$>!9?Mqo)Z`Agw#BNC9Df#-4mfJ{hI=MjyD(Q8MwIWRkTByRl z(a@3vA0*5s2XGjaazMqYtMA^;a`DU0f+Tx>eRscLOzh1HNU-ZGrxujdRt+fZk5&&QbVuRk$Jg*; z5=7H4Z~g1=QBtwT)qH80$}0q^pfY5m zgZV5b5)B>9udF&4(FgM9-B`%{WU=0M!IMg0M7#aS9pDlXJ&u2W@f9%eRy8(7EnA6?rfrZTCgyVj$Fz` zg$gPCH9#RT6+pQ{byHL)zOso_OL^?2pcMB{rw&+~M(8WRBYa~WOO+w50V0s%%B)>9 zyI>VE3CE!GHH4te?K;TP9SVL+Qmczfiv2;Tll@gJT}ft|rZS?T)CLC`ghZK0VEv=m zanqJHb<}nAROA)hIftT~>(#r}7G9JE>-5m7KZ(~B{i=a=r*AIJrzCRv8_n?xNjvi& z1_-7_E+=kmV=;GQ#B<+I-K`(JzkNn=hIddQ#+ZNg8+>Kr z<9xBHSUO~D)1f1nU%YgU&b$}*Io{lC?2?qIH$9USUUe5~#9i4@nokpP4`}SJ*>D_# zZ_tPwgRIS<)W-{&;JZDsrt6Z-Q9rnR%e7Zgfa>^1SbsGfzjhh7>QM=Exm#e8HMbq+YiRWp)(UYmQ%u5X(hZ6cN2x6Aw}{=S{E4sX1ZHE_M6vGYV2ly`_;yxuOC*^?z4TtE8pjQ zmjh4(9Vf~yBdjG_egHxAgYkoX@r0%0dNIO-)z!#YJZQX)sH!m@dBXWau6{WO%vT*$ zs*O#7JIlIE^UfdWg>UIHov6w{52s2T%cR9sS}N6~`8Gm-#1qmh%6P_WVz- zAIWXe^8o}Z75`jvxujbqST}=~J?Dl_DGXB}lZ+xxd#PQiu6qeit?XU`K5%XKQWw$&89gtO>EoLV@f+QIk1fB% zgXa8%QsWnI%O#}y<|;Jcdf|+TE$M~ABXCLWH(C^Ab8~XFzTbU^Kz>k2000}7dlF&4 zw=6Q8sa~p3ofDLKEjfsstHPiXw>ihqqR#SGC1sXFsj4goJ+LCnJ7|`~yy*xxrPO#2 z9aKWorbY@P(AIFIWXhE(P6uCtNy_t!Ftu(RC0@(Xy#!ODb&fwlX^kFV>v8o~&C%8T zTYq=8gGyBJe{R3RVcq0&ckDHZh3_{JD$@#w!Pz>``xQ1w&Q3Y%KgC!|seVJL*l@y^E zR;ZqY7j845@Ojz%3iRQy%PsJLc*U-8IJ`sG%8G^$C_=OU zN@%_;^pY+FyO<@?LVDenX~*Dc$nr3nQTTj}P)_a8D>=y`tDH@=&IUoseJC;pl)#3=SrJd()0FbEpV^#8%VyT$zi-dq4%+S=*-ttU2xGg}!K zEdIMizuFnd&0VgaH}+X3T}sFZw-s<)jwETz10e>6zG$@j~}1EEY~;l<>znn&1Zba zRQb76exEA8&y?Sfl;4k)-%pg^PnF-#l;6!n`(U&W+K`PlW}^+-XrngTu#GluqYd0> zBk#14ciPB1ZRDLc@=hChr;WVRM&4;7@3fJ3+Q_Hc$fw%Kr`pJ;+Q_Hc$fw%Kr`pJ; z+Q_Hc$fw%KXWGbT+Q?_x$YcPY z8~Kqo@*{2JN7~4bw2>caBR|$geyolBSR47VHu7U_Ya>6_Mt-b~{6ri1 zi8k^RZR97~$WOG9pJ*dL(MEovjr>F#`H432Q*Gp@+Q?6}k)LWKKh;Kls*U_q8~Ld= z@>6Z(r`pKRw2_}_BR|tdex{B5OdI)`Hu5uVnP?m^6O9FCqVk|(&Z#^wDi3svPB-avn@%_CbgND`>r}hWsD_475 zqndg~we^f@(;0O`nX3E4RNWw^v_t&%{_@rN`_G@>eV&8g^gs686CRU)d|Iy{#s$9U zxA?m;AJ)&?{`K=_yWYr1ocJWqBN;Z4ZNz?e83VrBZ|sr5xXg+gOyX>ZQFJbn{`z6D zgg4vV*r2Y0Ev(=UQ^E%`S!|*93k?7A9$t16bygxlX8Hx*WIz8t|M_-(`@FqiMH(0o z9F$-Uhqs&ceFOLr=e=W9)8>r7)WDxM@2_D810V_t_ z)P1(o;YN@S5T6ZP-MyWE?MXa8V9g9BwG7?Km(BdMuyNXofE{5Z!WYZM z?kBty1y9?3=(k%ajH5Jxa>Q`*0JXJ$UqJnw&FzD0bytQrC*P1S47~@;hL_BcnQkA} z&&xYEZw`Ih>TI#SdRTvlL{$aA9D!W?y;$9?zyCg8-N6JESz$VSU3l$7eTX{EzkO z?elVJTfKss_Ogn{i5m%(Iw}=D^#EOGm#%{kBcZ!ckwg|xjz2-fe-vaxiXr|s2d{ru$tUgNNx7fCzatzY#Ipz74E z?HC|J(TUUuBJt%UDTJRqZPrgv?+kM|@Bd!h?H=6K%8VDM9MU~>Yj0s@pfiv-yZc#; zW%b)l0@#N&ME%#BbI8yTx-w2IX?}~-^<73v`r7Kze`~0)Ukmcz8ptU=XuqUW((Cna zbUIPUYRv|Y+fzY_XK*Kk9)}ySYq}|Gi_CqG)CoOk!Mvh9eY4m;EkPWK$L#~DX4|s_k%wfMvhp8AI zCfsf!nTSn4Ib;p2ox&!a_I$Z}00rmw7Hh!gWF!g&m9-Os1^lO^W~ZR9S9fS#-hJw~ zP{rrY8HC$+_aEU)G_?}k9c+K)h8NBQNgAMWZ_5M~2`O3^Wtt6+3$*B`1?Wi6;fpdX zV}T|w37u&RbK<8iWdCy+Eqpe|R3j7i>M&n$T>m-hs-k(7_AA^UqOs5wB}xG9960ty z50G0i@FPhIawf2^!AXQ0sP1(rg|URyLNcr+5i_$}LWpS>H32|-%905dES&b!e3{8B z+S{?AOo?Yi$Cj{TE+DTA{sT-&(qPKInn7DI+)Z$u9-ZIcgH0EIE-NM2)B{MbdOE1O z0$ACqI(b;^u6xXgE3OS(Yxb3++x}^{wegB2lZ>96>k@p zC6#5lCxEGeKyJk!&ySKPJ~oj;lT$1~U2bIx=|uak|8aSrG>BoXw2?W2^=v1evcKM- zM4esj@Xjl|6<1WqUH3%svc}NI(Jcnzh8zmhZJt*j)_3#e`*jGLWz-%owh)iRVBPX3 z0V|Vn1Q7j(Ajr|XxFIJLBAU=aSU(@;D~RxHPD2$syFh7A>B_KE17u!&1N2BHgf<*G z0VgL&!2xly-F&mN^dntS)o@j;wVus)aP#;f5S?IvKPR8#kjgrt|FN+BTkbH?S9(1q zn+BMd21JINb|*I|O_KFn@4^wwvq-d=r4(NL(U}WDwX?@u2$Rtf+1cUKjZ$FZMA;Up zh|M7E5L&zfZ{ur!_v+{QYK?ZL90Q-~*yj}0IWBJ@r=eT9&J}KZ6(Rd;YD)S-w&S_j zkS%R}A`0;`;9Qg;hzyJw|JVjTW zJ=jEB_c@(Pb7I3@ylaI(m@)-QbVpXDr^a^Y9Y=#N?|lF-k?>qWrm%cr$sE&%cdMu8 zo&DN%aOv~bMzKLy;E?4{iqdhh%3Eni2OVA>`DDZE5KE!X&f&)3Hwb8Rtr7(Qqn1=2 zN{L(Gfb91o)4C7>cfJ0(g6B_hx!C!Y(L$zKBL(3&Ky$*(kq`X1K1!%d8ZKaN^lgsp zu>^V}r~Zy-aqlxH1c@c1X^(}i=wi54H=|a#!!A}f7K0XI{{xKq!7jUrB@SLG*z`e< zBn^xF?d-5Z8!(f`5RDGNM?9_p?fq^G(+fAIpI~~+eN7>74>9J@+0|D#`SS3(Tz*#3hH?cUGf zIZ5_2UwRxXFoHwjjtezMBD$iebOr+f49W&nl|CRA6R4|3Ud{BDGMpt)ru!yj*Ab*I zDQ{r};pPN(I|90T>Tls<1WYgA7bUR3S@!%?d`U0?%so0PwVjuDDBPg@ci^~4_D;v! z&2HCEKfy}B`0)hW*TOXfGb4FAgH0=L)F0*>I0n_ub0^-{ht&?J)>88`Oc?Tupvny6 z0RRIcJI$~j6p_Y5G4K6b)uG^@JmThkfrhW!VJEZ;khNNr&@|*{w$)C4>%13 z_oj!i@p8*2mUE0u2AUloC<19stogXP@s^qqU^*i5!~Dx?asRWx!=m1W&5{C~Ww|i)l&Wfj3Nb&@etrFNe(R0Iym4_``78CUAeTWdtZS?*a(VXPJM;67tI!Glz zx^rmK-K|*60?oDa-L8Lp+QF1s2er(L>Ew3qzr!eB^;htJd8jiw;fXHnf|WydJDG^C z&vIAh^a<)uz}Oz=5QK4g3Z%AkN2&-4&eX)dKqrw@eW?kgML^}hOq zapggjv@pbU9v7VCZd1(!_tpZ_;03~~lh6F+n&1}U_9doL&=prKSRyW?#!eh=O8d>5 zij(%O(Kwyelub;BN0#8{-}IZyd;css?I`L9F&~NYklwkWT9G)S->ga`c_^<7rX^ru z!Jay1C|k4Ulai7}*2NgsMMkNTMFzosIKx75=Z!G6gpDm;)~(cT zWMqsIgSv^5?n@!ZR+1Q zk$c8iban$py;g|y{CT&AxB+;je3uFg9|B}JXE!2F#x<))*MVE+6PzTlYSFO{%sr+j z{)YKdcZyOdiQySFdk@CIh(_HhwMq{Oyh%p8RHl+jy+@Tz3Jj?qK}LIPE40(U`}tQm zl7O@)Sn=;*F9k8|y70?uNdAMz2QP2_gJA=H^E>i6#;hm~LS)-twhvXLvXW z20;_6F_y6V8x&qKsVZ5wQv@b;N!t;`vu=vb>`IH=nPR?MwH;T}u^k0d3dEIF7^XW| z#@nnK@K)`9my%=PuqOem^zZ$CYH^8KZ+w+IVsj9C6o) zEVlpyyQnh!9UPj9HiKdiRLsO{KvWjt{HM$m$Oyhz&B4i4T(=G!;ct?V>-80+ZlfkH z8Xz48gq@MOv}y2tbkoYi?IzFgs5MZF=cisjYW5MPk9(TS6i}kJ1$hMT$}U~+04e8B z<%pxmgX*#0Up?=3>lK;7WufUf4=y*!&YY+ja9dNf=c}LJ;h0Qp&Cy%)-3jDIYN)F+vl9%?!L!SbEYYg$LK;FXe5{I;0$q+|l8dldt_xZ=2Fq zatcW32j=s!i8=y!I+698ad8^S_QeH&Kodk%5${3E+RQTQHSQLjz^w5rg-Aim9QKK>x>ds#6=7>2d#t%;>^y>^G7LR z0>B<&1MeUqllUWY-F>P!+;Jy1?Tj4*k8S^ zpz8Xm_iU{%$JKJ)IqJiAu#Nl}=pEiLoP(PGb9I9kVjy!BD8UVIs2L=ApvA!2Id7C2 zi;TLQxGC%%N=spfsH~WIR=C(2Q$=}iX7aGOb9WQ@o=|{ zk;f-QEAnNG4UpRN7F@r{#TYR37^)u#psDM^FdTL(C&Sq7cAyRP~^~GkB`>)V*g~_%s6-mL?+omi+1-xhf%xpK@gWZ7jRsd>;ml zB}`B9>Rwv00SuFK1B^Hm4j?vl(BsjQQGEkG_v~0)EZ-UX@cFN+fp^6HCRBn8 z6%AO3&i6+OejHmtSStVncZ%Nm5sAb&ca1ApLj$haE&FF^oCEPfM8-aNB zGX&Xq)>Ht7(+vje4F-D-?AXY^7nU8y#O#{mH;|dRrDPCG>q`Ujf=z5!faK!PfE*@J zVBO4FH3Oh_NozpSuo=YX?VQ>m)bw>?xn0)^DHJ>_B)$)~#Aq7bQwG^&w+>R_jI*v# zFt7tCtsoBU?yj_@0;0f(NiM@kK~Z2@@Cbn^hDT8E80GnM3yEHj3%bW>^V@6<3ct#nZYgroz#$Fe zFs18zSGd-WQcv7T47P_F74#MnJ`cp!ZkZL`F>c~E>WGcQyi%POxdSrQR2;zc*cPWj z`GCCaehV%G9ld{n(BTho?x8@=(&r(bu%TYhH{d#$sdXBBo+QN?jJ10?Qq0pqt}J5$C2RaQZh-I&C2@S%z^&8-rRb5A@ z0wPA?Y6?7Z!xNuCmt5)%AqrOc3g;H#tFvx6+sH@sxC`I$K=yaa>~)h>fB_u!*($UF zXS3eMnpT`tD7^#uwSUjy_J+ME$h5d%mziPoUjbw$AFvfRv^zU&?# zixnH$<7vzJ9DXo4fsL4M-v-0lM$W_FwGJq#cX@vgelL|#1a(Jyx)e^{3&upjnTE9L zTU&W?un81%bYWDq_+_;tKARFwmOSEcWRDd|&~fW+^nTP5O`I48RKbL+KA9SwR!Z7P zpgnH8iurs{)wFoO<{BcB>t_*Q=j7U0eh$upJ)MnCzFR^0HM-9V_9Eo?foB8y78Vf; z*~E=VZv@-J=tf~(TXRDrh@JaPJ0Aua0(OBA6)c8A8gNQqNW+O&f8m6G{*#BwRgM`0 zp<^B|hWY~G&jyZTQItn8B10QcuVYb6cNo}Ca^C8bf!7C}OU1nijVH(7Au+FbQ;oGY zwzVILnLMJ(WcC;rZFc&Uv}?S0S8PS;TS{=lE=Eb?36WSFSe(0ZPiSh6=*f;M8kcRn z7@{3Xi|3u7SP~O}u_}eNi7Q1V1aBA#yi$#1UtO>RgQydKETREf zt&x3=%A$foD2Wusz*YDZynI~a42NX+p_Xlb1$Lf`Ra8e?#$KE=I;|yk2OEQAR|dG^ zJgS+y!fDZ<niGJK`v3d^d`8ZLWq4<4Wz&tqeoKxSYpd+Z*=df%bl^Uj|M^W@z` z+WF?I5N&HvZu)Nv(10x@DR{`XaA)}~Xq1srPzyrcbTo@eOaWJRaSeC>BML9!GjZ?- z1eTs3AAi2yEOv0IXnExx+NPKMxDMy}o+eM#On4Y)BP4x-THzjz@Hu3rLu?`>DE{1C zP$4&g;^KR$PtyzuI28n?pEF-K5{C}B_c&>-hEF2L&Mspy1o-Y7S``vnf(y!z*!b_U zv!o53cPjYcTM-|W9EtURSgN!f2V677D-|vVyZlLjCGJ69C6&b>UxtNgNi`M1Cr5yl zJTSjzeZJ1q98;HH!zriTk_&AGCqbUdKOBkN~5cTLMFPS^Czs^K{0$#-E^_tR%a`D51*$~72ezC zOmjN|JRgL`k$khm^gouklYA2mz`%iG9dyeASAvwMOho9tgzNQsxm&mb8D1g~v_xgS zg&+lLqf<30yaWk3l#5%@QP<`Cdj~glEYsX_3QPL~lx>Ba@T-1D#m&5m>bK|HE!@SW z>g#sS_zvP2W$U4?S1Z_7ArN)`^UQh&VL2HIU^RglT-7Y5c_R=9LhtU>v+e?m7G?j9 zjCzk(BA3nF4ru}vPC$3cg-Wao!+{`S2A+Im<3))v|_ zry>3Q<8pp$uO>!}DaB^Ue#;tQWhNJzvAKNQ+RLEv{P>Uc=5fB{z@)J=*t$`iffq}4 zmN5_e(#|VOR++(zTDZ@1;wzwNBy&(p&C%~rhin72AHJ3~3Qgqn&rk2UCdnEls-&%v zjQfhZjHTo z8x3b5VXK?#lpc}`?B;s?C!A2$nAlBj=}r_qIYkSXf)}+W3-W1`<6V=1;1L6k@x`xY=he6uey` zJ7{IOm~gdSDohNeB1{DcFAw}vS(pkCg~k*vv~SOaE=F)l0{nbN|4j;Hgog%sV; z!V9gHr}(oI#XszT!tb*?h=3)+aZht?%5M}(B22ehui)m}c860o22VoAG1390PcYsY zPrvW)xeXqOHWP%lufQZNQZcPWN{Xm4pZg=^8ipcIa=cTs+ss$ndkAyDsCQrwVP*Qw z2F_${kS8H0N_rr^B~%`O?IYFn96P*e058YD+uYWwV@pxgQ;JQYbU(bndkYy{OL#>I z?MH8N3e6E4oW&Fy67Dzi-5jEH-yY*A%oOJtBc=oa(QR%9%8zJ<5|ky_xmyue?ASed zgSkCdfBj~`&E(&Y%Zp_i)C!HdqXM-Mx9#VTGzZ{S(i2hkmr}3kaPiWbvzY0hg*M&k z#)Zp08}KmQ-ui*s3n;woqV=n1c&`tth(tvBN37Cs1MmzJo`%4kF2jF{NCFEC8^K@m z2#FnAxMwPN5i|AGKIsZAOe2Uwysj1JurmR0zJZ&@{c;T@_8X7X#h)z3SI%aEKQxd>_kP+%XdJ_JR6B z<9KGlP!!;#T=8+rFA4)C5M2%?-5KX=h+8D9KJ(J@LNYtC4$6HD14(0|fMswfA^F-_ zOof?uMWA29X^>k4IxHqZdhsqC#+0x_3;7C_jva$&Tn6oubnuM9WawdGF88{X21mER z2!^L*ae2Y`qs1bZvo*B}qQ`VnVLI%Q7}^Dp==5s+!y;A0(4w-VQ$PwCz6vCkTKKt| zKQ3;$BAY_}_;iK(>jPHn9)bRa5(Z596^7MyU`frFx6gnJ>=wV)ZR)w1K)G>zpaL>d zj;`QLQ5?tS649MeB`=a5%O$kcf@32{$uy-tFEWCZcRK^S3nrWO1b68L5%7YzuX!to z$ZZK?gY@+jqXzgk7Xc1_5VYwiN<>$D7>*dQy`Mh;U){nKCi;jX?XZ+|^f91JE>T$4Q zoQYF4Z`v?ajhrSFbZSOJMx$Uz%Cj-hrI^tCHD><93Z^6>W1s;1+Pyf<1+$GV)ckBQ za>^8i=j{k@fWi77QUN9#&^UcfD@7frT$`u6waZqitJa*RA^ljVA{Y9+2P){t6rtm` zU+jK=59Uw-1KltW)}^TM$G6wKCEJpV&P!plFU(r7DQqS!k7BnmK<)&(v8yoKntUx? zQQ)1~;eO4~gYAVylNpl*7D}6C^7+_VFjZoi`Q+f!6{PR2%o=BCa>_i$q6=401l`1y zQN$2KP?&Z$7>;58y-L*ynK;=?skw*TxomFIaKV?g@dLKS)a14x63%6g!=q`+d}X7% z;nmT>20y<;{sG&-BdN-O3ZfD7X!K46Qb%P|P}|iv%tdV=L@O<%!9+WPJDV(ybF+VHCK9(Kpxd z5QD^mvYw86MH#k^39EX`MLlX{7;lx$!Bz3GeucEQsU)L9psup6b-WcLd{Af)Vo8@q ze*hc7jX&RVae`$;+)i+rVK3jvJ8xQJ>W|!hBZDc|DETNG%5718L(QjbxE^r|AP`_8 zCnY9XYcRxbDRe*|*lt#7IZI)K+9WcPeP19VD^iX@e6O`l;-Rvgw;0^?ijQV+uOYfI z=>w*Y@=1L?%@R5)>W%qbLZD=i=tF^z2$!;mS6sJ9Kx@GI7z_ccvqO5NF`5(R)DPaG z1}$Z0Z!cU>ml=Y2P%VB7ucf(=q>DQVUgVM`f}K_s5@1a|%a{O9%|w zd9hb2yUZccmO!C%#g?$clhd4Us+gpTb7H+*!M>rUr_bAd`^S3qKmBHn6?-vGqf1!U zHI*& zT8D*_iQq5;12UWSvb0tP`0DAg`OgfEIQ7W6Z8{LF&F<>?28GOzCOuYUOe>*yjkymI z1!rRpe*7M?Y$4q5R>iok%zr)4@30Iq-1XNm$V}&)fRoqHHv{d5P?!k><$VSOs7TBR zaDU=4Hh0q+=dHGB6{OrtU-tsN8aOUD`4oLnTho=C-&JS(~6WUG_*J0I$0 z64}UM8@OgG!`jP>sukXd+h95XU%W2sF%@p5uaTUyMgy!`(i1iFBGc)9&Z*`;6a?QN z15Up!s%jN>-QJLs*>-X?k}GI#;R`93_sO`L_SwJ~G=38_LhzI+9M=h4np;7n2r|@A z8EQM;IGkv6S)8Qbv{^X_{g{Pn`@&u06@(wZYJ(Uzi`|qe_d~6HsGtLf$>+=U>I?A* zw)3|0O3Sq~?q>NyQ=NUz4b?yFR(DWn6%VZK8o1|gA&9g+Q^s|Ml!onS48B&S0yQq+ zDQ>sQTgHEoxiz+uspU#L#sm21cIFam{Ma84fKiS~cU#)=u&jD+rdt`zeSAHvo^*ya zYOL9hUD>_WkR!x?rLD(_b<(~-6XmI})_jZ0Z4Hxt`D6XrQgeQt4;^y>=cwQBx zA|FWWW+8-dxDwJ3k}ydDAmORk3>-rm4=G|91`4K>73CaDm_8LC2~gxHyra%?wKQa= z19=X^wBp=wvQX#~l)??>b5e9bNNC1Qx*P|I*DHAU6ff1=FoiS#L~?-qBq9J_CPUm~ z4P}4IX-@HIF%0+xCqM-jy!e2{4W^J#)@Bc>vz%FZ^>9aFY&ixcX5q%rf`al)!dytT zmJ3Zr!5G=CE0>nes5sex%qqQ%VF_C9Y-tQEq?{*M*fO@S2K+T?Ilw-xkN73~k0m(S zP>=n}$ITx1WbgFTPD`6K^8}k3iyIb6$URZd5?@H8Em2Cv4}eCi?i#2Q4Pa}{M#_T- zk`U6c)}%nTGOG@mI3H>G?~>uEw=4zOc~a~>})0D{{`L<+#ZtggoKQOfs1~36hkwK2i7k($4k9A0d!^s z?+p!&qAZf)9`p(n^4evp47tCx>p80wvlgF#}GJ`Vu?6Xmc4)7Ze`M(xoViijxR_-!=W*KaUm%?m7 z$>GZA&h@RduoC@F%z7Es-d68{b!1Prtee2svyQFt`s91e(P#H8->s~k!jqvPVH9^V zMFooxy}^{2!17RrcTpk&g%z`W>Q6F~9^9Uf}c#Jpb7J9y5ir#F(_{3>%d@1*sXd z6y(6_hJq3wqWc0oO|=v*cRQr)PD`qhP?@hw>IQ_ryuA!Hu7@uMS|fu<4RHT_s14Yq zx$3BzdjlA0e?*j3H^0d8jG1^?=W>!qjH#^PlrgmtLQj22Z8n0SHud--0?C`f?Q#TJ zr7cz=qOf}N(|v0h0TBn7`E1>e7}q%SL>Y0TTwr93ZC#wof+{5A0F=Yf7G2;iM*3Js z`W{&yPl2fPx>wuC=?$0CF3DLipepv*X_e6xGaJ40x|HWCS1>;tHxV+&lKDP_|uiFz&!_~sxuiRU6qV>R|76-pSCm*-f~L= zX~~{}bJM?qr+(nf7|HG707epFiXfufGKlD?fwH{Rdl4^-aJC>Vyqxg)0C+ok8Re>9 z+BeZ`gst$_Ndt+PF}b>(a)$Hc!&U@y@eOMkjgl%{>8rap@h#ax7ZIT% z$ROrqy_pG;1pk8?^EO}d2S-_1KwT7}0ju?jqoC*FN(-jWHhl0IXN4Y+!j~W5ao_OwaC@>UkzKsRy)rb+ zt)kp{&gS7R%nalB5Keo)hPRNK7KZ5{K|HMZCRW})^tWIC0H*{8fANWmLpH2~(LJ4j zPi(tDsUqve-2$KMc8;evKiG4XNAKr1{W1ke>J{KXuvAze1>up-vcBSkVza*%{dZC) zAD-dGHM^%>tgt5B9aksj1pA?yP{H(R?dJrW0Y40ShpuMwbvS5Zx9~k+hwc&4^8^o{ z`E9m9RbVw`(;`2SaB`{#C)+@p7<2>a2C$`~6)2wGiz7#76=mUbC; zVuX->NC)m|6t(gdbk4j+P;>09k3pm9Ox&gazWb6 z8mx7Kq37QhUmlk5KX{W9=@te~nVZLVu#2E0h|g@d@&*hqguQyU8&+zz;mSwptCBl_ zquv;gMSN)EMO3sP8YBgIak&A4G*YSTL= zKght=SZmFZvei{#b9L3y6*#=Y#(f7axQZxXyEOJVJY1NJEhJQX#ar3)@r|?9oeu)4 z5iNx}h=++-nCq~?*unFeQq%gbdJi*5;W8N7V5F>t3Ns30mADf`#lmfpL=@>3f`+kF zi8#HnQC-xFJ^_$1s+EccG*vR19)T>&RA+V&Gq4U7>g6yBTzSkXBKH9~I$$r3!dDv< zJgprF`_$tz+u`MJ5XOC}8;!J;#Eb3i{HZ@MiET)0B$~6xMRI%TIoo~NHv(IgsOb&8 ziS1PjhI`!Wqe09Dd<`>zqT2n@t&beJs3sB+Hf-xC+ubGnShRw}S9_C;6l{M7&z#dn zgNtRr4T6I0!<1BZ6Dle2roW#gAO^GQ4=dn81w%5|}8buq3WdKf~K@H&ifXaAGWg z6MH+Qg|IUSJ;j5I7WBmp>NuC^6C-hD%rhJ|JkC4>7sS{qE5T?qWIy#=Pz;>C<)Ok# zwx%&tHL0A-)l|k4=&9i;gmW^^!eKuiF8CSShqLAgM!)z!)GJtEXZ<}@S8P7Gu1cGQ z`VkOfx%|EYD-)MUIToAs>2At7I>d=w4hxp72d#2WGOCqGrL|tz3;#EODnw|!TAQCFNh}r34#WJ8DTi3 zqcBHn_d+vhhb^9{CZfG9!k9+|Q8BpSPU2mTpWNi*hy{76?GLsH~;y^#L%r>Hs)gZ2%6=9TgRZ=qo1j(?xkAW*^^P+o9YxP$Vso3h|x|osX-v- zh@E@p{MiqAi5j!Lh4Plm>owS&&aAV{_mohPJ~;ic?ll3wnv3(Svn&5=hjqT)Q?{Sx zt1mrOvb?xMm2v#X8mq3~LZwKzYofCD>{SO;pihNGPs&dq?(kM)+fYH=8T`N?TMAD` zXr^rr(I7Ex9TeEybvBVQ902+Kp48)s4ZcH8%lz(k4te7Ig-K7Ync7#9T&8?nFUOTt z`+|N8qcB)b9@edt$C`G@Tc`@q9MkQ3x3SP^FlKeK_if=BW-l_;K3fr~q~L``x)B@f zG>FDoIl=j2L4X!|#$i*5!lPA`*ZvOK?~iLJP=In<<%r%??+(<|vfuHOjkdm&c9o7c z=_yZRN9A_BBRqu;bC?=3ESd}fL2CuV|BZ?wg!%D40%Znb5+SHD%yRd7Mp}iX#+a3f zwx?|jHa6t)Z)5OVM7&~qyZpoe=x`mB#P@A)EmE>*N3_RxO`LWn^$4OdJ>b)XJT9jG}WHIJS+J?I1}Y!up$&zM)&Kq=#*Fs#m9ai*is z>kXVtz-=^Pv=kbd)8%^o6>7-5?I9~XzxYsUf(Fm^dJU=FPlK9(UM*6Ahi1OsTIDxg zM0BA?t2?ge8`#Fnwoz$_c%txr?d-O-#UU)kQX_gZHYO-KcxJhY<=YUw>uS*8Ny~Dq*I($79Dg zQ1|!A$9p6>Hs(A;P%9pt5U4*42|vgaxFQO-;^=OhU`!(=t%!6|h$lqKkA+)7k|!-w zWH~Z~MYzCnu~5muxVFd&U;+8ka>OW>y@|2>`6mSMb?>Oqny#;43nb&+)?Wj0XT982 z7j$;01JX_r!UqL3ZP1~eQf^q7{OWdrX?O6F^bc@aZu-sTy~T=S@ptnyBJ$Mo?#S~X zn3Ud~V-c_d|IEzRZw}DtMC_041a_voWlv$mKcDU(J{x?&s!e0GhF0D?3bxo=oOoRa zsSN`K+nGt2cS+M2Z8g?c#qXV4Yu5?^@tt{7u!UM@qoE4>Q!sVJ#Ym%vv-KnYCyfvTM;WFj8apw6ITkrE`*TIm=U!>RK_iAap#ih`kuH{~eBn9j=>8anT0 zOM5dEqiHf_+8$rQqtNSTcpN8GJ!mIuJnja9>oKlY*%^vg5xY1OfqTPCN`BXE|h-?yz92zglc4n2gpcNs`N=)F6@rxoJ?W#?y@ivE%2O7?^4Y1+g%NeF zJh|#*mau9(ArBaX4G`DFV9uK!4ty6+q<^bN2a>ZxC!e4%>m&~$P}L+Ai@`Z^B~-bD znT`vqne9MP{yqb8%`Ng8WIIm3qO6vy;G}yY9~Ll6&yV&J0F%br0BythkMRvL z`@r=m_P}9Usip05WJ?UeyFO_j5El$;?4gFX%W(~{S^>5wUxKN0X=D6$MlM%i-SqwH z{1GH^mtCc)V4>uSw~HVB-TC$j)5385URb5(Hq2^kFygY-jiL{S)mXzVr~_ArzqI}b zr@ZUtPfyFA7Dc6!R6&VH{aqDfcz13K(_}OI8b^3$+rTTZ+z+gGLp*V;z&tRy-8xhqC~(_LSagF9op6K9TbS?3`N>~N7nSn2H4HM&6m$q`0pcl zO_2WjGnlm~j8q34oey^&U4A8{!s{cS&FM?M(cS!vj*Pc8VK--iXv(cQhsve4W&)!Z z)=dpZXC#hK{p0%Ecr3>f%jE{w;sd4xX9QKL=>ndQbF6l?2M)t!)rZi;qgXWxMC+mD zErADAiv;!th${Ge6m(4U%C26aQPs8Gxi^Hv!p0kk@7~zuJ)sM(;chjvwDF+2e8Kv{ zN~X91WOpZ(2BMnO6O>A@8_-{Vk@0h~Ss?NQh~6X2`rq>%YzOFvl~jxER&CY6`!-e) z;Fz5lL4`%30Xnt0oO2z{OrBT1BQYmBW+5OtX1QtTa8q;Z3rE^f{=VopSd>|+uE5=|p&aj$)oUb6!Poy^FpT#6)pQUujn$zq5-{QZa@4{ru+| z;s>ZV-~#3(Ad;?q+R_~NKb~OwC-Aq=ODMdWbj&^btTlEF=|kwVg$`2$+zQDM;6*rU z`8!lfbk8p*1k~D>P816hLN@;pgETQf1MKZ$2kD16FG4G3U3D{HX1}z9ktfQ@sMv~| z{RWrUpTc7FTd?0cM9#fQfs-urDsZwG6I4m`E&b}3qFrOj*K(0M8lz)t+5niECFUhC zbXy96s7hWq6@@+5Oyz?-Ix~lYnMs%C1d{lmGzM;}-jrfKT*`d|${$}-D}Z)0swVRW zN-85VlJQV*1BL*WEWN|VN%z13j*I{=2doiS29=Hse-bcuq_;=~L=q&wRU+a+N60Cgbt#OY)`%PxIpXRee2PsxbP;FYPN7)Z890VV62}PjPx(=q; zF}3l`PW2~K!1^e=qdAnJ{N`%9pb`08I_5Dm--|1s(bi1w*BI-kkpm;mx}3wVWWekO z^c~c=y%D9dSg1Hu2J>-o)1AEPhFzeK@k<3Ir6JE z1ii2X(DU-nIwC`+a3T`m&0r>h6N+HrxZ!()D;dAfv4o$!v86!LLu3G!;pZ$#*$c5& zjMyNDEto@IWF71s3F}0xvD5~0IUru=r#cxzsRbrDc<^DGjsY46Y|oDdT$7ZwXl}b3 zj_~On`ZpKcm?*7?&e*NRlUOizip|iSalV1z2cMh*JGxWIxYSn;+YL>o1v=mj(*WoA zOgtVHaucr5rM)=Xrg;j@hiuG3lcL{JfPgqaD}Fy;}!c*G&IJO&1dKG~QC z_E}=_s{6nI3h%%Vw6G5(yFOe*u*%SGat|A*_qr}ub~^2@l%6%g?qntw0DWXkd4Qje z=s|k?g9OwY>eXK9@lX34-ScLf)P+~s4q}yTY4~UD{7l65G>YK<&aXf#El_>lq^($i z6NaD;H=w8VhGqiC#gGQi?iZ$s@h;gwogw4Sb7*Q&6IemY66}ZYoDn4$X?+obH|y_k zt(tC1jva}mfUYO*hv0;U0B;%W+5BMvk&`XfWQ=;hGIzM;+oc)bymCFu72C8(sWefF zj%}}ukk{)CX1I9$f2cK@qCL2v$+8yI1SoZv8ky9O$UV2E9M^ zPf!!}>ZylJ7E!1>GAXMaP<|VdHJIfU0tVY?*ZGwNHE{i(69ckvxmm!ej?G~%DiN3j zh#fue*6=>EFZ*vjpor;g?!NmV5p4qT`+yRTfJ2peB4jD>5WhC6@2tU)!j26_s%SGK zV;RDy{ZcXdtu1>(js?NJ=^-|@+%gX@c3(`>Mu8}(&?0Q6R@$Bznn56{ha4S@mb(+B z`3lx`a&@B9;pE<~!pS{K$LIGf?{8`J!3ifuaN#V3T>~3#1hS9t?#LZp2p5UMD)kil z#RseLR)%$NeAGZE5MqA3uTOUndP$-$YGaI1UaxoXE(U}xcoK=uxel)RLIBpKC1P=+ z_0`k-7Fv64H$*apt&wE6e}-MJZNwc$fLZhNo9%k}yzAKz1}R8TeCpxl88{$dC|rn0 zwCd~(^o}OA`15S|du{FFJ^8r)m zl8F%NSeFEIyqy1pJ3CPrE2?u29_C6biIZrL#;I4S&rBton+0(G3qx^ zYt}hKI-w%O-&IjrZ~73Z5=~U=HBm-YP+`|r$1<>cR@*jige^FR_Qom>(>=_$ui(N4 zZhrD|09T@yH~+ya8FcZWwxvioeM=E=$waFCCbOu*g~v=`S5Ozdpn%>`MKw{?Pf3#v zaRYJ;pb{A~)lCN{B(P|#u?kCv><51)LP_TC#Lz-uE$0|#OIjz%SL0eszDmrVm%>&p zgV@bD`No{XaF4bO;_IjhwqVYTJscFrohf6?vCEJ|meR|0?h#dijK^Cf4gUN#JM?D( zMU!@_HsZ1*`@v`qrJ4Yp+_g-g3{~EA1HrkBH8;5mm#rXIWO4fyv-T;P+(GIPRPpXN z@bCdQL9=1lYzga+0$GKlSi!`TBsykycu5Mqwr7v4&*5E)%1Ckhe+4mQ==goV`m%cv z#+Jkiw?&t?h|fNvCy#!7x?zzV-03lWZ-5wdtuKDSg~+gvrl&3#D(j{a23|kAr8GTt zbwVoE1Ke@4SET&OX|g|SE4$<-Wm5>sgL1?ScLo{8RB|CmI0`;d5GlH{j?kc-n#evE zHH8MHAfccVXTqpq!rfweMI|Z`p^}*ul+6HDLUhI?G`|8-?cYMS0(cKx<)_0rBcBEu z2tzN!K9q=4qs&&LRnOfOM)KSg7FEb7GtQ2MA$a>+rl_SO2DjU#ytr%+w_sDa!Q7j$ zDH?qF)7i~H2IUvjHw#h+7Si)wqXP3d0I5^OLa}EQW4?_o*~{*QN)^UcMAm+&sBzk0 zz^u&Xs!5elc{?0&nuLO3ze1{TN>tZ@p54sJmHN=Ho!;@@LMhC}_5ze$@Jg>@A8TVqb(rbj)Hlr|_q0 z6_&RH!fj0w_{T8u*>HJASinBT3}DU`tk(d2K@le?jSlxcd1b25%1rQV(w<|-lMTte zkyoF~qCOHyBJ+tpOXmT1Iy(jk7M32Scf z2CVcnK!A-DFdZFW!G!Ve#Mx*st(4H%dbG&IeEBvtO;~rBqt!rtcl5mN;~^}L0PT~W zDr{tlmZU>W_0aZxcLX6^^ynkjH&Cwx>ySY~wSvkqO=q$1A!@n(^9eIR!{ekxPJF90 z;(l+=7Tfpz{qEBOF02j12X>e#5dXA>YG2oDXlA2>r5=oV&mPqgckSO#QIB9TmV1bG z!I9`&xb}g!npg{qc!poNm&=jLol5k_b|GKAUi%(|P6LS5T1Ds1Ap^M$N9-DgP=Z|r z7$P#hfuqn6s|G3nC!xr#0&p50JJkS&h&=Nfx;9KR@lVF95b_A${>_A${_|RRn{oOp{!8`p{&sep{-F4F+{1hMjejA8pSYytLLBu zZ25{NqtHD$$G7s25DJZ^htLmn?IN)R8n*r^CLy|>uI8)lRlix>do&cX*Bo_DFGW|# z2!o&u+{wb^EDBZxPh2xS;QlWi?fkZxKRqmNvGVB-0@arCBdR#<{vEtDYZ*>M`CNQv zDO@45(Hu@&hb27!+(KsVAC$p#zJ$_6_6n#x5fP1!zyeg-FyFw;*zA1%tAoHn2zU~>2zV10t3*q{@XPESL&w%uGAAu_Co&z-y zURn1JQ+eHYle^9QyFa1vHEoiYoY9Cnc1aG_5OYQ(k0qK@W`%?!z+-Dzy_#>~Qe;{v zN5mpiD+b;Hr7FSto9a^3FXKZ2V3dmr6|D2~Rn0}eP*p=5qy9+~A7 zg}Us?Sp3nR&Q-{3N21Iprn|)cDELpgrTCkx5*t4clGE*hu1pv_BozcL&=M0DGe%j_ zs&Q&BgbHy6iMxiBhF9w!iI^c}tdcHDofk6&*-;SOt0$;-Taa5Rw&+XM26|B9XjNUW zzrYPazoNyeqKW7P!0=S;jkL_cX=l%AITa;ImShgFaet&`BF!mI^BeddUY62%IZHr> zx%nc*3b7|v4>PyZI-7U>DSd$>EMM)h+UZc^a-S3;V|})Drngdhp-l*m(7(X>-WD&1pfD%NDni#xk5 z!3{2~MdsA0QH@=5kS@yPcZB=uX|Y-XEq~7!yYK{5IuJaw^_i!5i;dQ3S)z~Un|S5j ztvZ(_QHz+FGgKt@fcwVZ$VtfnD&qBB%tWXgw^M;~5ZU5JUeC*nWlTj26kgol!!@hg zkUE6-w;Sm+9|lIH4e06;**x(?zrs>1I_(3u9uLnrDNh9EO$Tc2M2zd#zHSHh+SS7x zcBFfqLQ=A?H|s4VKn#F(WKmwjV<4F4@^SgR1r9xL3!4YZ9NQ}HsUn3J!mz=sk&A({s7qyhcv&iB!HZo*4Qm;tO}U2- zH@tUuaPK#C6D~W7t>b0^&rQzgj0iSRwfBASDU^{q4OGS33CTp;-Jwd;C`<}9q(=fZ zHirjZWm&tm=TDhnm!R~(Dm^1{l_`R3PtXE^BAm5^GpTe#F+}uoZ^XP_oqhg@s_zta z3VJ>E8l_i!ZaJv){m)TR=0ZnqYT&{Z?2(XMXx~5>W{2R!&`=NDRe3yQ6XKPZl69`n z0&V@JR^?tg3O`^sU`19|)(v?}#||*6QDl{ZnKbg%!(#Q**#NXdOG6doElHRU<#KQW zei_xa@~34-jPd2;&TrM!*7^Qe%e=J@&{-;Rxm%k|nWB-Tp20TYrg;z43cY0TGpxyi z1cO>EKvYejiA>J-A<3|A%b|KIkEWa5FP2LRbKWiBmS<(z&?qJm)Z0Po@!3mpD-_!x zBL<0yVt?sGE=HIHWO_<&86|m5uljHBxKN5E%%(dNpa&q`#OVV+Jc&>>nj%xL!N!f{ zQPLd#LBg7`lo@3xtOFYJW}W*QU?Tvxi0`KX#8IRkMec`Dp$@G+-*ZrSBWP)8U+&pw z<@nC&+``A_{f~aVsJv*$qEIn;T5lIxTCi?@H4X|uO(^ z!)~C{ymy~jU;tfhA}mZDr_;tV9iae8K$JWL-}Wm2MPKDZSLMz>MKxzkLN#jb2Arv54BItHcpGi#hU{$gT* z+x$2;Y+I{9sk*6nagNUGfPck@=&T;~3J4>)wkxZr!Y-hWZ3KPUwuDB3?ac+NN6qqJ zYlWi}B`57oQGl=|a)wqHWDA0F-yPnOvLmLxV_l#zBX7r2rh?qe>-BoMTiD{j!l?>T zJJ-0F(Q^XD1mOWshs4@KbOz(jjc~O(v)-AhMom5&M^17;X{|hk-mvTC8q`-lOs{hBx-34L8*iiTnlKDdVD`wS9fzlPwvUta5)Q3MyO8 zl(j+U7Ay)Cl#N6EW5oOI1|O(Gu0;mB&{X=ekYl7y*^4ljsqM}%@D!-Ef#F*8356jg zoMhrCL1O({m-~`_q-bO8#tE0VAXE zhG!+=da;94HJ1!xk~dbf(JvNs+T(PGw{`V=bL*2HxJPYp);5-%IrZn=!y2VS&6RGU zl8cQ6l{&V*Q^r`L|YAXNUSj)Vz zIzqm(t_I?{&22f6JT^{xDtR~Dd-O)Vd+`s^P-Xz_BUqt~iu7K7>o?2!Q%F*0wE|L` z1dpW3?aCcd{!?f`b@9*XHD7zz)9+k*k1Yt4u3cF(J4UQ-%g*LRE!~EJQ!MDB;POkhU`7eFACSadog%fs-M?!xzEHyd1thw4Nb0(m+xgmXA;ebqz4 z#~qb9x8z!urv+b=5yTjds!X~=^`Z=7W^G0k6|kUDNp9T$8n%mp#!8nI+<*?3y$xwZ z7b{^8uA^?kAf*y^#q-M${u%;!ZO@M@UyZIsz!i&tZ<4GCC%_cC+Z|t-5;JF!{@RwjN&#XI)+-}z?eYmH}$phN-+nr+&l}YJ3 zdQJf2xsU^{&WTMyIB{UXjy%>*2lhu>CUfdabT|S&EVft}1M`pkD#SI=PTwB*%7k^N zf`4SWR=8+mjF7R&6J6}zsiFOb_KP|#4{=Jlhgf0~ z>ahI$IA8V4!F*7ER}K<#!iK7e{{iqTgp)Gzga^^7NE}XzImudtB^>LkC0>>FZnK7a zc2ypZOO$o<5QbBhw!KGkuwKf8nBsY4#wR!r*g-+&utV-m{mapp$+p)}uoyA~8Q^R= znOHN4pVD0lcTwwT;HX@L&@T$L8pE&XP#GFVwIccP0dXHRir>OI(8(T&Od-kLg2h9& z*AMIUw%=HzE6^s{QtH>6pHA|(PzLo0P8`Fk_N-P%_0LmN<_hPo7Q1~j-_7AZ%(q9U26grfqfevPREEP*?~ps!$#IM@zN=j zRUj`^L`}#$OczD+&FfknJ`xW4WgCVkyAAbs6Opvt=EKn;Xf*1f}2UiXJ6S_cNAM&TjQmkD<{ zx?>BgRcPH4qe33#NbxdbX`ln#9ykr;<;?T6cR|{W^tlJ zoLJql#$hTm_z)NLVZrG%QpDNihE>K|yO3R@oZ?^OFC7EPs_|l3vM1s)t@~Z61tL{T zWIv1wbq$wntF$zDFRRl7*Xi7iI+tO5)%hYb+7&hPOYhKu z=HPdv6QKR zl8;n6z{k^Esy!Y5#$<^2LXwO-nc?P2w+BuN1{UeANq6ARibI-K!(`KHm~2`NlTC-i zWE@0umpP2K<8T6hNB0 zEPyn3SpqfCt-8wsljbf9AkAGCK$^QOfm#UH++~4DbC(5><}Py})m@fA4TP)ia==v9 zD8pg0DFe~hJ@f9v`*Bi_b3FRGk9hQT&tO!}L>PVDM;LwGM;LwGM;LwGGnfXN^>rWd zRMtHM($_r$($_r)YM{Ha?inV1-7_G4-7_G4-E*K8!u55}FzM@_0qN^L0#(*M2WlX^ zvhE$G^1AQ#EATtr`x*~gPbzEn##$cSfrB1Xn~wYIFD)aFR6+cwh$yr4aBmfbp#Nlpo}>*yM#JTXM=t7R8vUPM>RmnGof{S;Z1YN72+5 z-hi3ziL*@L!7g^7tg2?g!Fo{!VJ{KvS6~qcS3S?e$2zA6txpcLt5)wpJ5u<5phD=t zl$RDlpW54+FD!&U0!x`A`^BAM8dYauKa2`>2Z|>Hy;|gR`b%TN)5DkMtBvLGy_M%> z+({Ksth%4$Fe%g=;7qDY;{ot1l>hRa#_2E2X$0YZN!Yugd6{d??|p#fftmm1_dc>> z(GYsZ#AegE)6Ea-JE&I7Or@;FDO7W{P$L^c9D8JoB(|NA!lK(O{k94gLtQGE!=d*WM-TGas3TmIoZNJ8%RzD{!TuhhCkUf%64Xc zcNd`aMj1^?{IS^W)$q;w`)a?2oB5ZK4Nr*FKc7Z6vm^Wfx@crWGx^&8gsV6> z-L~l|+;*TJsw_2UPGE4+ZSB>FJ8gdfJEyikjKZZV7?NPPO@spVZuM>b6$Vt;?NfTivhAs}({b?zKhVVNifWWBrw6+It+?;x^OW;<4X^ z)$EH!upoC^o6;VboSln(F0miPx9Jfm%6t|+%vbRI;pTe%_k4HzKoi&{a#-?TlRB}a%O=_!NKE%Tep-Lm;@(WSbL$$wmZ@9I=XgMNU z@SXU+#5thMADw7SWXPt7?0LHbCej8$roK6{Ke3yyntYi80$!X2s>gg(+fJbKtLGcE z=&Nro+*J2eO&NeQyQk zm|(;kYrObQX|;PhJZOrPHV@Dlvashr7LU)5K&!3wvvpFXw(79e)eeMkz9IQ?r7o?x ztTsEsX2_1~hxzUUNYpEMNpriv2k^=*O=lOfO$wy>pM3VTUwj-|VI|gdGxU@G212Z_ zGG7LZ0_T*Y$MtIskrH2hb0upI3#d;Nhqa% zbr8JBXI4yU9L`i4y3Sjj@W!|GL~AP~RWl&cMV@E+NZU+uKw}r4uz8vKODXVHS*9{F zz*4BEhFF+m6+m*&e_wogSi=ACJ)bs?m?L1s8IQyLC#iqJlHt6Gf=Nc{xy^k6V{BGe3);(_8T(i2bFp+?^&E1rn7-a+m2f{6)4hqg651jA(Yv5mZ3PK z^c>ckehK9mz{A$(pfSkFreZ`qm9=twwM)(MH5-Wsq7^m-go_ppJzrA{|1hVY`X$5* zK%Um?&D~-J0Y@Gj;EZ;iS@DrGUBDuwEF;_;|21De_xM`&-y86lz>jz2orMn?9eG<{ zY0(Obk6{+1FzeMm4@%Mw<_nBnut*X40s%9>hdEibJ8v?S1}-EbpQ6Ey*BA&kubttc z@(3$QT3TYAEHY=@EK&@D?cvdkn0C2HcpUgT+qO5eVE<;x0~?0+GwH%Exr8D6ra?#r9Kw`@GqLrm&Awa|Rue7z}XM%9>$Z6y6f$p~nV7qn{D3IJCF2-bMpFb2@y?aa5}@v501Q*pHSb{)BF(<*H*jV7vL0aZXbSni#(wn zm+3gc*sF_H`a3XH9-r1Lp#1g2VtEHcI2hsMa5qyNIWCO!7xNijF!rn%LflF#Y;x8` z^E@SsjhXeNwLu(4tg1GgtrY4$4_Q6dW<-Z*4@$@3Zl)M=GOT)j?WYUrqtujw3^b!X z_Gsgn1K#4aSxbB%$tQ7n zIxs#v2dVkP%^n3ex)bhsmA!GG|3r_JpoH0qyfs`kK6VorDqM3|f9yAq`E$3peO}Hf zt4eqoxe+a=Ewi72FvhIZY2oOqGm$&$3R^pT$@U#4s;n>q4&eegaiXj$>k&j^u59^; z>Utq;)EdvNIMyn*M3&{M%RdSpF{eqg7O>pYl_5)Uj>fu#1;+^2QVp%J=NaIMSdl1b z$w-O-X>3pd3KCoGFj=Q2N0v)Q0qAu5eg1^UCuy`a$7jsNvWF~!9R?B37TY&J;WgLA zEq4wI9f(%IB|MV}ztKC))nS?rf(@G;92q(;+qskiz?Djg1cAf&H;Ev4vnI-x5F&CxV(@va?+|#rBB}cZ)u_m(Qk>n(PfBpLaycED9t5}kf zo;kgnL`8xi2?8L93)leFJ{rJQdcm3#983fpZr7^?pC}Z}lkaD}0Pv^}g|KfQsy7QH z*KQWl-sw7~F53@VG}-fjizdPDv}h7Q(W0GD0-x&@$aV*^bDf7Qo$GS2HS;J8r!d#E zXqAllpXb>fo|fjf`L#lAM?UCzf|F2&ESehrU`wZzVcnZ$@xy;C?&*xIKjLecI3 z;RfFWMCm-G)%VC}8pvZNn+NMpe{*+<%C4F8>Mg-Sn1f5OP!`=hwiLc)A5g99i9NI( z?V+*S_TuQ|oA*TswTZQ-M}8>87Tx2%{vfsCd}}kh;mmYz;CAm_^L@btVzFfSEm-D0 zFpdaDHcvwDITr3eRjyA&<=JM@emSuT)Ie@=YlW z#5!ukQZmb20?BScqO74Lsz8Dr?ec&GX>+7QK>}^0^EpFIrj6#+VM-4Ueh(6*190lq`4g7|>jnc^a z)1Lg8*R9-LO~X3H)#~wS`_i#+(N-qGRF#c~rtSKjtB1J^O!9O`bF_(JR$F?nz!L)= z>ud6m?!bg&QyfLiYj-DfB8wk@+5|R0ghlAtz!b0u@=IfBLti`>rh!Wh%jLg z6dNS2ZvKt4D%UhWN{4o-N6CWF+&$k+T)BccEov=P!wi)b?t~W>q=giqAmo1m3Q7ye z&Wotp8jb8Ru*WUm+;6F3e*T0+AFa77cM?-tpa;|-)vx_!w!oZi_^k2dy!t{C!Htnp z|Mmf81%72HCt@$xaeUY=P`Znc*qd-663@B2diaZ(7lj3bcy5@w%awHRIIIQTql21W z2Y;0G8R>4@xfkg}mjS2`QMwVyS+4Ao6J8mjAWs?YCuB{oY09>i#s=9PK!JbFHbgi& z%qd)b&N#{p=`8&IHzXtUiA3{Aa?GuJ=?BX++U?2vJr2svwml+G`PqU{laeApjd5*+ zWoY6FO3_O5RWSVE4x9WMxNGujNFLexYU!@|SupIt-jiPw=!m`vbi~&LI*MwKxpcju z{7FO-bfcTxq&Lot=NqO--%e0wz`HsEq<UV=O)PL0~3F?-^7O5TYP$K66%Z31zw<*|B(9IcuIs|HTH2Drg1G1l4 zY&{ACkt$BD!fMB0Mu?ZFe_Y*nHL~@0ywxXQo1#CWhvl7>=yZeZG!6wU4f4y7O$lzJ zelt?be7bzT`%=qgOOsIbjiT_pT0uTZPJ|LrqT}|NHJyDT)`3YP65Yvuu?p@mx4%Y< zUeRTa2!(D(FrGbtUj3|;>J}EL;#jiK!`bs*eVfe}%rXQLp-P$k#KD*D&FPGO4Vpz6w3_C} zNVvtfZI3}p0vmI`x_#dKHiJ{t9T9yKGH8z9(I?wGGL42&&bj;L3eM@nJDU?wK)oPp z@;H(nZI>sg(QOgd-!CHi>iB8(^!!9Y_3vOX+&si7=MpFOoX!d7=1VFKHW6BH#YvxU~=(($|@iv`Npr<1c;adi4Vw0m1`aRfKQkP^UEB-3q`NCxRS zTato`b5jQJCYOwg_*+}+$Tp95+1Xc9Nakc#s%`6?Ak`?Xnv0gm@Ae2AQr0}wP+Y5J zqzmU;dacy1LkuT*zsWVqfDqbX&@)>glu{UfVlRV|;lx`2MKvA_WLgV8C zRSD?vK+tYHuFV5V12?TZp;$Q=gW(q|M&B~}bSpzQE}mI4m=Fvx&>rb#`Coi1QEu(F ziQj*v-nvhzD@prPP$t@+!a3BRETOpHQsmM86c~8>Q#`%^7>}>0%tA6p4=}|#T}GTe z_w^hv*G~L;G3%}6tSGoh#*I|Um{LZHDAoPeNmtB zG7JPEhwm_nI9eHRt-zWk z-5uUI_(h6~pt$4Ea9G#z%)Zr8qP+&bdxOKH8q;R;Au;fL`SiR6W!894A?2UbZY2oQ z*o0sfk0b>ffv7p7?2Iq(@EC|h1PfLMt*98&Zvu}?3J!gGu~lC#?x#=nEer)NGTBbD zJq?#0xOKwbJg-Te7ZYynOc9qZQq$Z{pI8-e^$bG^d#BlXBB2ZC8;-II+fJzqjsv%w z=I%Oozredj`FoLVP~qykb-AB^U#;i=4;uz&A+X(gB7(PEV;7^tmx}8(@+GY|NU+>m zc2lfRI=E(wBW9_Mw$q=qBt;Vsio{Vhq`y4;)k!n(r+WLmUiyT_jwU6UGaaW!9}Fai z!enzhd#d+Dp$v#b!JId%z+20A!P3Pa(Ay4rN|GE7Wyw1`t#43MeM_$f>;6ewedwZe z4gc$i%!PbzVe+_MeL<-3=F{rCHGYu0fY3mEpNf2r_;}N;%r>P?n^fZ-hT~zHQ%;9} zg#+Z%1u)-hDzG)Y-}gze5&zAcQr43jB|7b?v|KZ^qx2#FoY&u)<6D5cjc5THo=S@)h@d3QG-w;-HX2zap`g z@$rgg$0fp@osgjk&J=L+Go;u0t9x!H6VQitC-;l_Q{v8?-sV&a=0*Z*D!__#i$QO z7zZJa<`@J?NN>Qolg+6lNoaC)A9}Ka(%6=)Sl2^wVjuMNnXS~zWLQ~p?)WFo08%Ej zlrPLpOCr~}WsgT!&R=Eruk+WdLhpMGixkJia@F}t1C~J zvnQAvw^#T60MiO0WEk;AZDwvxHWWWiwnW&N-@^GWp-3_>WOr^MmQ3ZuCzwjTs1O9j zffZp!_I%^u(RCs|tvoXg0fufXj_C!)2VB?(q>NUp`&VPp|81iflSHug%Cv5*p_o&u z9r9(pddBOGi~1PQ+i_tlL%jAV*mX46304jnDTSid(RLl{h55F}v=n$?Hs9y85K=6e;nR1PA!0j8`^~yJ8dREWV_Bg6;J%32|iqu~V?il9q0XP^O`S$*Fi zYq0kXe2NU~2G%%f7NcOG$Wo4tT>*^1v+LPoh%Xd)6 z#UoIB`S%@2AN&M&^7RYletHCFUT=^(MjS2IlF#5jks9h2CPG%XNeH?#Xf=+|k~PP; zrBpY3OL`3VFbUknW{TV^PvTuW5Bd6mf*RpAuatEUnUx-g?X+H!j{XgZr`q!CgU90P z{vIom*gQ7Y_*R6gSg*VJoxE8%95{#XwDCM{A1{X4v>@B!`}v(sKqPf?KPkE$uoz+K z)tVJ^iO?3)NVXLs)VHOZ`Ni_~ZGCIQF*m%md}L1K@BA|#aJ4Ol)K;Q-$p;eK&3-Gc zoxCMzVBSFjz}m45erf6M>LB&9gBxYU^biok;Q)~BOHiCzMRswrGrM5NJ?o{_Vsh}} zf&tnCZ11!&^wi?Nw@=rIJd&*PBqOS>mW!9GCBpw}+;5X-jhsUqS0g3(dc}JlxN#d3 zx;1z8XyaDVZG&I(y)<=>I!QHGZ6;qQoUK?vXyer(P{Wqx!k*Na9QF3z*84~vcZ!O0 zm#5@+veU2u2ChU2M!@U>{n>xH?LZ%prBP--+O0IQG?)jL#m2))VMDG40l;0_Uen%F z_Bsq;%e&Dv4x{1Ts zuph$Ubaj7OFTbD$YizDxl2@3G+MK=vU?h5Mpc0V#rG=;c(*+>UPc1v;oIw zZvac7O}p(G?bUs56M8NH4y}}d*<*ahK4LHiQgYj1Yw$O1WohX0Idk9&9j`oIkMy?I zQ|8jOH2~e1Up;=-lAz77EzaPO0*xe0F|F1p+(%dm&QR3rAf`WDIYSMl9^sd zwwf0e07dR3XM|YD7sM4II!IWhiYcFxe>sREOvH;3}esq zhA4wEjuCVor2d-IF(zdzvwgJKqiR-42hI)3Q)HKLx2_>DwPRGu1x0lb+{og3ks0R1 zwuiHVo1kQ_nLel~+>Fq_Th*A~a;RfXv?RxbNk^80F>h}}Q{x;o&Ri6r%;o|Pq_FvKfpWY=a zTemRU-a;z@dd0`Tf~ZAWmAIo2^SKf2nl!ZJmZgyy>5gn7w2R`ohKq~qT$1DYChF8X z5ZzR#P`>;Q_-DE9ac~k)W?fSs7HI`+GnpPP1DZ4% zibE&O*5#BN#sbSCtTUq*+rcvZ$#n@A*OZ(VlL11dFG(Av*B$F3)|8;@KTQTn z;t{fr8@;b(C!fmGL-r_}=}sx#Gu_gvX&DFkzLVgyUD$(wichH0$BtW8LrlL^rST{( zF`w>kr!na(GoS9v=@D9U=#_d-!|kh3pB}ScJ?`WtbW!=lvV(77^%{jV`w_lDiGn3{ z=v1!L2*W*&Z*%>_6g{D*2eFmTh=lB`T7eqT6*$qO{Psjqq)~)Kgjvv13j(*0Y?>=m z%4I<*XSP1t8wH*9H*mYA7uks|mzunANC@eno05Ph4BsN*ui^f7Mr8p7DVT~yfqUh~ ztwynIc9K1nEyz5u5I&~5KV8Y~wAg(mjc2xZ95p|5bbXi7nEBTh^%9e9GBVX?dxgq3 zsg63EB)g|>UeO3mlPnUVNe&5hZ_^{NL63K_bA2s;(Oub`Z}+!tsE?ZlQc&(MtnNll z$FpZ-p$&?zr1YrenQz&sf0762))hSpzjC1InAzgUQ}!E|+OY1%lYCPz8fPig@)lQ! zs5RLMsdX^Zcnv)U;iVS2GCV`NfnHINS5QiJMr}ukN#r`!raXqMO?9ju z!XBD!ZK-2Da8rn;u5YHTr5STea>@Dk&Aa^r6Wvd#yD+(vkKu4213e8Bc${ova*+v* z5)-#?(0rZu;=g6qOLXgJ=PBemof}gfI$3U_LnjMMv}ao;cFyN%kv4?HtatW}Y!6+H z67I328-Z?;o&%P3iP*OI{_(vrG04~;${@0RgY**K30*k`3V8lTfYaH;xkyOzT3}AR zLN6hxHyqWqQNuH^MT0bKt)+`m&3IXVN66Q51A7pK8VI|n!~yPSsH06KNAFg-H5eJM zbiSW`Md_opyF6b+uP3d|FlLLVbo&l9D15GRvm<6qs>&y0ofTU=y2tcK>M63RoinLe#^()Kf33rq&l~r5%5w8 zD-1PdyPos$0b8+xOSy%#2)+-BIRq3lx}PsV0H7T5T;Ymy%H|@knu7YA_c>m*aI>RH zX19*BoAMEO$0L#AN3O8)rwsM6%O|%JtB1I%HiGTNBcCyv(e;WBDaAV{^2kElIe~r) zH+*RY64SJf-?Po;JF)h*3Tse6f&P8c|WeP?okYeM05n+gJ|2nX2q{KidCE_ zS9fe+ZgK|CUu^Z@qlbMt<}|`lUI`5wi}n|2@vk+Nh`dAD!^}#+WRC}H+Av3c31P#= zB5Kmd(CllaYMCPxIJvlSDa=ke4akZ3SUeZ^z4911jC0T_PYX8*xn$h@6SE`dJvy=; zH2B6n;;~#vmY2aT&cW`LrDJ#+mRpfPg}gmzj}vA}NtMy{xH!MrTbbdMSt-pr35G$($~rw5%3!sd8RFaEC@B2$H7<@`@A>msPH z>^5sImR7%=I|qddH|M9Ev(W`ba#dcQ4(iwmN0uYMBT@c>lI6p$hqo=CpuRzx=9eA0 z97J1JM1lGz9eN;XgWcx^a?Fh+l^joBP#l~B1fOnJc-c4S1dp1bwxs{DWUKHz3_yxy z#jvesCqR?@Xn;#}1j&qUpF6ng-Fk+%FRoIMjj)#s(ervOn+^%$*ZuG&9~A23!@Miq zXWyoyq#_a&!e8t4{c8Ofz>&L)4po=!QPYP~&h)M+)ilBG7BoEL?JU|TXVJz(iQ0X! zm4y$~msPa|by&I4eyx-f&ggXgkJ&AmQ1nPFhaTu5s=6M;O;kdx8ktO0rR7CFtI3Um z7{9FVw@3?|y9b=#gT0eR@*3VEUtiZC$U3L++QOAqwsO&sJlHb@_SHSzQF8*O(M{ne zoDo-56($7fMwex{uhT_8)7~@-z&Ro_%_{2`==9>{T{loXPkkX@<_s_#C&ZSLheoCW z@{#d_-Rl=ZJ$tV}idb&OpfZf}%r*fsnFeC7$bB)3v}#8RUk>+UYnprw#{%memTNe+ z4TBe1rX8nqnXnpT3wnISUtDpP?1Ah~P9+EC z{5sdjNVZxd0u*Xky$-o+xcZJnzJA)UlbrpzoRg3zZOcQ;FM&!(C>L6&>$X%4+fbTSm8xgr0z*nN zVQ{g`_IA1c<)AQTTBD2PF=K*b#rNC#9wmfrkvM0Fd^6kDUsmfEWnwv_#{<|~NnNs4 zbY678gGsdT#&)+isTSIpo@${?;&^#&@CZj%+U%tZS4UHeQU;tb)Axb%*x3zB!(;CY zhqt;bXPT1%+M=EcJxX^XA08V8%T#sh0GJc8UU40xG$do#9%7?_Bc0tT3(Wj7y~(~! zqy+}Tfn#iG^!qA5G&f0)tR|@Nt0EEqt0t}RYbq`#^)V!{OnnS#Q{#`8Xu_{4GD&@G z4<>rH2lFJwtL))%ux20!Ay<8awk6Yl@kQ_1p@*}|`Rx#gSqhTS@fa5+Y7-2g`QAb? z^xdf_L(iCrUWNt*SDN7+hHbJjE)d5{%FZmMmWQd&Is{bLA@`lU z4+^e-gpRk!`7C-Goure$heV6qa_fgYOi6&8MZ&|%U-vaaTsfq%=I1uTzWGRf+7HC$ zQ^$Vn8cXHWw@N8t{#!`_!dkKg%U4(*08?y-35DI+XO|<(0EGDB2cv{Vb%3) z4bn0rpTVffL{F+$i{~5&wno@gbI=kY^&Y2g5Rw*_mguV0h8$8@u`(I6Y|b(+jpUIE_}J70E9z?jPhIkD5iR z$N6SP=Cil+*E`1-AQxe7j>_#SGS}a`xzCnz1NawwOv83~& zZjl;z!qq>XCx@|Pa>y#QQaLpvNU3%aEU*2BXtL;g#YSXW8hWC*Ae!Oiyxq~D8jry+ zA{^LH#uFIq&UpQ@L}T0O!Lp6{HirE9kO`nCxqBA~v*ou=brP*GNLO19J6j>SDXY>N zJ-)&l**8z+r4X_#m+KTc8pb07iLgwzXI_GUdtP-?%WWSiVV zj&<}omeqmLm_hS!!8d=@^%D`PXDW&9%&njGmPLPTB<&(n!hy&MSdziw>5S8!Q&T@3 z(Kt091a(vEG&p{Exq239Zw0hyy8KXr`^73Tux@G?>}%u${1V)b|Jx@{u8X7d91B9;@`*mT#VlyY`=YUy-r zRgco1)w1hAq)edp4x98v`r$)?t}1<#gx?>}H8lfT9J&y+HI|`J;`xzdqa79w0PED) z*1VA(o&6$9y2ry-epqoSRSVlWYGLo}pyE=e2F)+C2}5@EO%Avr+Ckc^!E4Jy_VAL|ArS(|GO!F-9(!76hs8h1>1`v#1H8JPc}s0mi89 zY^ca==+5vgVp@aLuNeAUbh%d&&);QJF#SEd3IIn9)iVtRCQPDjD3 zn$DZIOBbel3SEevZ%C=|?&V2EfL;(?J85x`5U~E#5j+;@x?zR9C#3L^rtJo&`vXNL zOEoC!1Xo_x5^ayrK{?pyl{D}l|x=VG$eF$4| zALr{%)19@V^WY(j!p`JF;T`?+w;791Q+xuRBuhkL<1vvvg*1*l$e2D5{4Bn<){lQX zI{-w(`~psVw_k(gJxcouYH~ZJ^QYq{-BqukH}Yelx7~f%NcHheoT2dQOr_bgJfS1l zFW+aNa+%_2R_EzdK(ZTpm{*b{Ry#=o`EaPu3h#k6gZ-=PSoHAv-mfhQeFW%qny@P~c)(@%-{pyrwk~}zrRD3`U*UhR z7jTx{T*3#|+cV$RPl%qd&bI2LbO|L~hpAE%>b%Tv7GMmWVu@d0$+C9gF6JGxVmC_K z0XZ=_6@?-P@-?dkS2-`Kx{&AWz|4;idRl4EyKgY@z%L&s z*lCj=MZ}~QJ!*k`Sd{e!EW?9r;CL6kS)n|G?qRhVW%lqjw;jikgIl*l2dH^yRcA9t z>GU>BUW~6%V&tnvBGaWBp^L1r6nt!SF(tt$P*@i;<(KIOy%bwWO^)^gm#3(^KkbPg z90L?JS9dA3cJ8uM+P=qHuZX(v0YBBJF_LB!VmXIGyKuy`xD>^o8!+wJe=9Ymklii$)bih_OJdM?erlkXO@pl&4C^_Yy&j$hN!NC_21 z+|%)A{Ffpq3;o2-umOoc?sy1XQH*>80|E@&J)Dsg4%2=jH7KAHj$9YKerWKiV%;_(`{<*-6+|C3 z@#~K;xNVSg0%g$YBqiWH|HqOf$EThuV zKLpuy00UhhBd!MagHNY9<y3*%!ngz5E8kM5?A3?tLC7V<-4= zHisiQS!k-!GlCt}brsx=L=uXx-8AcIb z<5e9I-NB44o}uYn=5~qNy6nxAKI!Rd-HO!Itt$uFqm5pUA#|WqolxAXo3IVIdP2}P zds}yP8@a>&5qYnnoQ9rVeVhZpYt-FEP6E^|0B_eX9MOba2YM~MqaQb3Yw4m>gdm0-{iuu0~z@D><#t^+0I_S@X-^BM1EXHuJl+< zJIo4;E5b!(XXGh0)X1AuD?=npzo^)Nq=FDdx^jgt2Cj7l1>c}FN8~}GSFC{|CZ|Eb zY&(6nMHbyzvK%o7C@-*e56?Yl_TgbUvuOFA!3C$NXEm}^{3onYWQM|VPZ*-~XdGty z7RT_B!g>%Ohcg3T#Aju}i8hB*-F>Q`@KT6QsOkZC8mq;Q`LDd#Nh+*3^Um{{e9=CE zA=PZ?T;c)1`;J;=B*O6+*JQ`};$BkdS5}ozTR$OZ!aJW->~$xo*U|)A)G5*~6u?NW z*59;lp}rNWM5<3xJstbKwW|`fahnu1;)r1Rh$Q#6=+n^``S<&mfoR|OOlz`y9)0qwtIT4cv}jf>36@zCUS-|FABr)RfK;6y6l zUNk^u9+3b77grZ+k?L~Hx+i6^w)~C_3aARp-8xqe(5W!*FzA#sf}Cos-l$(#+o)Iv z9M`sEVfsuGG324`%Y*cD&I#lPRR$9x8>32=CMoPC`;FV;O0q zB@;e?{Mh79z9(tjw1ChuBuWOfz_1l}iIHWw##SNRQX*|jX8$m)jwIDw$G|oQLEsxw z48cYiN@*GoY_B?9{3=Zt2_td~bZ{ToQ0mN!`ze%2@)(haH11?hzs)!En>kVsB@bxy zG}+g@1%8-yI~uKmMc-=q>UFbwLbkH$a*2Z-Ck4=bribZ?|(w~dvmd#KW9^BBd_WQcJ; zLkU)NLGbvzb)6gT4&g&J0GvBoNB3%c{eauR9fhiTCkiW4T3q{Pjwii{bu<)_2c)m} z9qk(bqtUUi%GTf9+SohVxl0tBeTu-UJ69g8sq7`$E}y&?bo8N^Oux#LyOPD@{3ceq z_jrtT3_DU;vn^97Tn>}!+qdLqyk(*yR)W+YJ}#H}bso)g7!ca4X-1Uv2fogMDkBn< zXCZ29ItV|4tBExF$RUN-k-N1X%j*i{QWg>jL|}Xy|0<*==Cz4V0E#vv=&1gI`^J1h zniKBgcN?296llLfBpFo^$gfo21xU}exI}A&Vfx|Tduu}YxHmey{^v~dR^-R%;DrW> zWnO59+E6_F=Cnm<(X|_0@u(G(OSVh$RCMiJvV*0A@zKAZZ|l#u5B2R=XQN%bxYrl0 zCn{+kDFCsGEA`r_X+(zcS50HlSH$eoi__J;mQViTfz@vwM9eYI!hU1VTd|%IT(0wD zPk1|vlZhG^Uw!oQ67G^F%$1O-5Fj9e?S2}fH z@!Vk4`r3x)2m;TwW;ajgHj5`>dTs#|1dT?|{|#AI$L*zXZfsZ$xs_-BRr~$y=?Pbd zDK1HP`vC9`7{Vsn(F$UKt52A zE*Ed*c`}KK&@GNA999F)ljvwmcIz7T%+CcY;nxo1x@TFw-HqGy?LHSB0yDDVl76wo z0Z+}xjBRtjEp~Ck#LJFDb#!aDCS~L5-3orTr?(7E52qopGDKUC*B=dD(CP zoPF00>T>VS17Y?LPki3*;>9u~?^SHJY}3Z`<+s(>`Yj$zZny9+ln+u}^n|L)%R7qA ztzjLwU>M|c#`Vh?jVen{W=!p^NQqn=@|{p#iST49fv;^0LUQ~(Ph$D_Zoc05#dGv6 zNVRj$>~Ud_A6DOH>vSN>SPB<=Ngz;s{>0VvdA!cBiy9-T_Yw&n!G+wrf-vvB$OKDCHp?&o^%B zPD7JtDBEpxMC8Kl?6X);*vi;}lAU!q9@oU~~5eyqqdz zrDv*l#mvi*Ex1+S4Xm0?wfg5c;sdfQc?fwabXoll{t?$ zFpto=eGQ?$LT^Zpb@a7<@vacjtcM}pu4OW;f4RWxJYvHnT}#{00-kMXT?TUv;ZvHCwK>2dHLfAO@Gsy zroNex^(U}_EjaVwiJgsvVW3A>>R4UtKcE5Le1{Og3V~5 z_B+Qm>USV>+4u*VF+E*!s6PPes?HF4P3#YOP_duR=*aW-AFx|5;rWh6biA(aDS8AK z5k7G$TZhzvtIxk(UcG*G`T6sQ&*swbS)X#ooa@zxX->~c<5HbxaUqB69I*D{vJadO zQJKM`9~of+dlO51$=TdV09ZF*<+2~UYwBcV-k~z6N2IRd&yccZpZ+^28 zq^jR!a_WBn^vAW#K7Z=`u-F{w=5>VxH`qhwykbhBDWb9Lq^2_r>62NAmbReVTl?Bg zc@S;$$;Yz~Q~TFXcOq`Is_e@$QzH52<35}WHL~j#)5UV*sp21aptgfBnKW$a6wWNS zcva(oCiwM!rBS@ok)k>0*UnD#$aX=V(Ty0V6pfrM>^#)l%~FnX$7j7xLK2H*j=h@T z!|CX;=jIvw(tofwb1`T$Gwt@zzK9rS@&m4LWErd}2iGRnK`yJ&qfa2{-FC!2k^)(eJgrpugiWb@G*m5;oiI#ULRxLi+q$p?pi)|l2`X?q1{&NpP{;R(E zW4>kL{P@SMs$wn?FsHVFsT}y@H@mjZ7NDA+P;}765}K8j4_>aP+E%u$ZO9r`6tySx z7HqU#38%BsL=oJ-o*^i-&3uWfE|G44cY@sV?(jeRqjB8B{@Re=r7MoGq+I70xJ)9^ z-E>9wP;n(1yJy15g7w8W5T+>gxW!8&Z~gq!HICKwX9QEpya#=t$!1X*`&fi(ktBA& zwKgR6&S-=9o`W_f{Hqxl1Q$jSXHj_<#2L)L>`Mo>t*S)jOijCm*UKD@cHos9ua)U&y+= zCn$fP+ZT+x`t1n@~a{zD_suKFS9cZj97{A?hTQ(Xf(ZDff2FB4^uF)xxfU>kw1x0(kI$m z3uPPQj^_B)Jx*N>jc~cSN4e>^kF#<{+=EO7BMz>xRgbHA?eS_q_=;Ls&q#|0?mMZ`>#PHC^~VFdiylP z>r)$dRJBxX?yirVl0OcZJb2EY79~dWe6J;abUiT+BMpV?{PWvKatUs&zF3_+X>v5 zO4InHm3yE?ZyuD>O&yn=Fq-R9raQr)S_$kPsL=5=$=$o5DTV7P8E@{eLKBc^Mk?)E)1)+je&vxavCyMK$nhIflWEmy{wSYm~`V;7V zdLrMi62dg0e=8|$jfHJapXgV_=>H|C^(b*xt%<3tD%( z&C@41X0%xb?{qQ0plBBNpm<2A$DB*k+a<8!Gk$l*4wPw6qkFgC;&Y6CsNYVm!Y3!Ii3j&HoT&aw#7G20f4GSH}x8EtW@FB->obOw@+L& z9&zknw)%EzmXuXa{dik&HR#`&e|XLR!}JRGfOmP#Q1BOm*2a$zEhAM+w&lAk#XrkR^Zob0T;3gW{5L;vxZpXYwR0#u z@KDN+52Z~l$%P1{uuLqnKNoZyhdp@FDjs_sAvc%Z!ShNj@&%qM$upP|{F8SuR6d{F(9(TJ7cv%VhZChOcJySMT;y6^*q1YA1fBCwJo_Nu zGW-suI@~exu`9j!4zI6VVL=|*d_Q*U^iuKtGi4b=0Ev{2eXGThPGnkTY>8W3H-6;3 zoyj_rK;j=`CK76>#E-J&sV~(L-QTX33n`nF2G@_C z)nLleD^OkXgJxZu)C8IDkFgFhEJF2a3@h-QGs ztq1WviN+e|Mh->6PhD;}8cssp@eeg;;gKeG+)0>#WyDJ?`w|MUQSAxitRs%bH!nv$ z+U?O>YOil9X4ty1mkbodv?I-y3&MbD#;{sQYgqlBJc&u_F?J^*4JUE4KLow^4zk|` zHUgg@>2{crhz}F4R91-ZN96T?3LeEH3Q$+HEOS%`ZIZZK?L)K@+#!}hP00cjRNCC) zN$2R|ac3~IbG8eu!0!ZW;LW2P$*TX_;n%dy40?z&T)!QJBg%5=LQ81vvKNYum7TPm zzPd#(hx|eN_7@b^5p7VVS8W`6owKnqV02k<0h!j|U((gqRd@FzF}!|=I>_SWJwv(| z$(-NdWo5~6pwC-8O_%M{t$dTw#!>i^>Zd=y)Gk1YuFTb^}6)uuf-#y zQ=U~`5)3UNF87mU@>u2;cfS#eXl1`4Vk)sKAMR;Om|~2weYXi{KLk=Q$4*{=VYZa1 zQ>Pqv@XLf7{{a97y~VANy+Q1QB6F_b2CrD-0q~X7X;D^B-HoKi6dG48@yZc?G*sUR z%g$L6*;_`Fgn|o&3J>UxWcXAZU@m8y?=z&S-#%QBRTrMK>bd;@1Hc=TA;ay`fwl+w z)G7dMlbqHlV!gh&p-b7P8)vlfjH;z5vLvWDP^AYi$?b36Q4B z%qBOd`UFPhTa-T(hUCNU0#Y-Ovoq?}e5z3neJR~`$|u+$oUrRPN|`a!**(&Wpnf`7 zC7#?Z4Ie2D;()uqGYJ>bR-S^pW^6__l>%0r{DS1pc6HNqv)j(ZFxdL}3Hj}iu`iCO zOS7};$WjSQJp2`jRq(J)5^w%Vu`>l)kDIsP32#uoo3_I|hxHBPDy?-sd7KBW)yjsp zl?jqGkpalqn06|&8U%4{*UY1sh8g!yZS4SL1{h3p_=IIU#Nq^CSyd>FMtZ5~-WEIe zN#{%FiRdGIY#cG&1%kFJ-+IE2(p#S=U5*pcJ~;%roH6|O(YINvq|NmFbJ`>NAnOv_ zmG&d(Ry0pB{rO5mmo5eU+CC^v$2$_}TBoTX+PcA`%21w6%&Vnv9>{JAqS zHBIZd$&cm?Y3SfoYo9WIN3xwoZCnD8smr|sYJ#g+6W_$Io)j7?148?NMpUB~Nxs1K z!NK*M?5R?SsM)3_lu~7i7cV}}eF&N{a%;Jj<3;LTJ$D%TppwIb-5oXamhGXkwug%) zB01*YP(RX#hMy&0`;f3Zdxv7HK}QF%gt)w0%)a=i0=o`p%jZXz4r_zFUzCySg8gKV0hPUBd^8|k6?iyN;$?C-%la!$ftWym^5K31;uBYe%^S{3Dh4PeIJsACUFxr}fC;toTGYF!vINRi3{%|}>(hm4{W_nxf`lhT_wWVop3 z!FN`}&yZJ0XJXG@SIHf^fPj6uA`qUn+J0d_(B^ve1=dq2RLDtXNlUjOQ~amd-F)@i zdiDH-AS~Hv$O487g=I+xU%(RS?k2wT@rz}-CA;DhHhPcS%E!Lw4GEOtoEttR2q^-P zlXR`^PE`{kv4xpBlOjJ%*3whZAi(rt>zQjp3SS}WK(#DwMYLan&d6@^o%nCesXFAq z*!LMM3R*qG>?}36Z^r_^A#K}!HtMm0I)g1qhJL-BdUw$3Dp6#w-ku>`u!-0iVV_RVZP7{9niyfYjlN7w-iif!S%y^8e0XNROq_KJF~MMNbA4oks{ zZ_d5wAd{0d6md2{swiRQ(8t;KAwIwPZl}H*V~iReEjd=uH!%D1aYugKbPmb>X)+s* z?obIzZjLzPrb)S{eaf6@Mn1s{zxCEN#Y>pZY?G_nb3A*bJBQ7=|sklPPb+hmQg zr#IaY;y!8^NYIGH0+j#3WTx`TI}Nm0|9nE{?$0IFjcQzE63t+PYQ8hN;T_}gLO*N; z^r|C%vAbT^^WPk@t7ShDE8DGy`QbW)@w42BFiTIRWBc6om{;qqDMfU*UQ(~OyQY@SKykPEt9;y`eFIli z*U%R0ew?*`0UZpf^igY>ukhjgxfP5&9}*jFj5D&*@$K+&O!d@_Q^9^B_RlM>sHEcOE_N&6Jso zBN+%DF7U+Lnw$%5&9b|axdpqLgEA)eZCL`XpP?J{Kgd5yD&U#6lssxe4CMuO6{%R8 z7^>CiiSJxLAO*=1x%5?s^B~M4drzPI42M0XXm%XXsGr{Pyx5JpwWV&9i7z336^On= zb2k0wZ_KGN5?3r~SHk5L3hfLE5F*b9x;ZunRgH-06!mafP&byi(8qsEj)A48!C>7Mo~MP;s8#aD z`S6G9VSHiQ6IfU~C))iC=}*?(4>A2;GKjUJtAxKTOZ`DMGnmqU!B|7=;^gcf(qy~G zaeE>%m6TX>2?QrK(Vuh-hRlYY$HrWYi~p*VOv$Oj{C}VnO#fZeR{L4>#*s+>)pn2$ z8}1BY?V?(6GE0^Gi1eR4&O5@B6;gaFy;7Y76_9j`5yJs@xu za&mawL#l17{Pa|0v%0;Gfji(_lQ*p*#Gp>dt5y3Ush4z!_(PD3TjyQC1fBQblwhmD zQguF-+kxsybFdZp*bfHj#l3OHqOi*>(ss_)1*d;i!?Cltq?C=wF@>K&CU=zOIy{C) zO^Rm}bEMS0@Q@l=btH7jtVWl>BD0Val`CN=RZb?_{FE5CNFSBA%PbB>ko4i`5HOi_ zjHszi2Sr%)Ldot%)H6k@k(sNB$F!iyK8i}u&5UCfh$J0eOc$B2W5Lg;iLHt^}n+xG>?0(f0#tk_-@JG&S!X( zdA<4(^C>$@+=?QGxJ+um8#0S^XMfL~jw!h-B4d+msJR9A%`YBVB$~1FgU>p}=ekto z@1B=%IbSVJh01dQIg(Q8i9k+KbZ90Xun9-|`0m>raSs!e%3$0rfi&-TI>HVR;ZC_g zLT*=GcLIxumWAbA!)ZFme1Tf|&;wV8E)LVzpQmqx^LY7SQtRQVmUk^Bd2>qCNcM(6 z8f|*dm9$HC4kKHF$go8A-$v#a8eLlea~+76P}009k~6}1NGU#*TG^h687cn*I*%}b zaRR#I7*ccm5|fGmojgC?k=vuVB(q5_gL%*eCvy>)*w;8LBX4~BZd@JH(kZQPD*#dTUJ$=Msh(4m)E z570dn*Bk)7jpKhm&X;hdN0l=0b^D*ty%JYQ!&1Vgh2BDBqVll1L)i5y>locvBh!+o z%=>CNf1JTWU`F=LuA)%S>g^pI%;jL4pH;dP9vMECQXySwJd_k*e` z%2{%~dWUL)3&as_sj473&Ixip?2MJo*>d-T(v?9HZJLuSbB$-;>a*a({YzphBw{4} zdPADJ3Ntt;qF(P&T6I>$R!#XnTb~a?C{$l9e_ZK=(mL;|l;1Jx6I`!sz0u%OL)G{s z3)c?wr|3e(`%jU$}hJ}H8?>7xbJ7bpW}NXxFp_n zv4+p{1@ip6*dYWPz(8;iG0_@gfRsq|4I7(2Z>=816AFMc9DH}kQal_QYt3{Ij(Sq^ z9DI~u&E?g}D|aFl(CZYr7W0l?K!F$-BY%U}auomSy3AKqz1*M}-xTT>QUkqOP*F%c zO35P|iz6YW^U$MN?gr!MVdp4PIwjv=UT>AJU^eVi?86tv+# zrii24=xamr8q?96WkRGo#Pe-y8S@c1})aQ z^~{h}wOU|A*9;rqc}{_gTfmjMdLs3EwrD+v3pS_kz*ahTV$iYg&J`EWbq zf!lp|+tM{-&RnJfsJmL56N=A90z_~%Bp?Hu(<{}vZ{b`Y`fy1d^3brml)TQBI=Y`D zz40CDo2{Hyv+E&=3|d{ID&MLeg%PC_sE*j%)$KD?&EnnkkDgj!bqW1EjCi|`nQSPf zfgQzX9^6u18Mq&Fub<3|c)e(LEV zOBXKPJ1m*y^(l7R!dLfcmW%@R}`<<2?fehKSuuhCQH3TBQkH{m5dEe zk~u{QCgPX0B%l-W4S->)0}dr>R7of73DO9Gz=isd=TX%-@LX%++kww@!H9@1-*o(c z;O+(vp`K^-9`?CV2~upV_+X=V*nBDwd32P29_a8t3wgZyjiW6h|?V|8^sd0 zU_>+{wjS~Pq+QaDS!JH-z!mYBpeRn0gf-d)(=3F5XHN2+qZ+4u)HTQUuh|qOZMT@F zbMQ~5gW$OsxMJSMHP9WV8LD+z`$~alRcrQQ>6-F_G)-tL?--+C|Ww7U|zf7F^cL zFG##1B}Ox2_Az)r$2<1(Bja&7f1GO_I!wm!3m`qxEbk&jVt}(B9RL$rQPV#`G^AQY z3CM?nh!mrrK?1Cdc$M+zQJQ}X^dm)tKuQEtid3$C3iELF#X#P0(?C@*&XD)HD1PkK z=gD}B$ZPPccb_ldHR}G^JV$rX18FYg-6+I)pimSUNFEQ;nn1K_O(Kg)HAX~u4Qn%r zg3H;<>UrzR{ZvQfQ)7P;x1l_DExrKe$Bg-Gp3!x|2wcf&fN|l&!_D~Djij6cEb+&7 z=@lnu>n<<^?-vFvjwb9W-~^q8!$uD8tcu0O@vv(KO}s8aj3Iq*~t% zH~N^J-|`2O)gJHE2nH^@p3_D=_r0M-6u+ej&lRBZ`-ky8XK4k~nZaz|RMZcb{ zHx+CMAmzc?0;7ImFC3rJxxLMN^Ktd`{PezFJ}d1EuBL2Kw8H}rN|x^ZKqc|2n-3HN z$|LFTJ#NT^elG4f!7l7tw+5yh$yX>ignT-^zFu+XQ_SLGdB5s-W{D(aLaS@9#o6on z0kuou@Uz@v1e#6xfoy?`yY7xc>vGZ>%Op^zd$m?(cE>>J$$caq?^f%Y)TW%G3ANxv zdR7Za37Le0#IuU!{Z1eY^oX6{wprOh&<(G@b_L?y^NXm3TZ)t-79}n1S(Xv=LuKnd z+?KTU5QotrNaz$iqyBMqkDNl0!8k$a(IQ2+$3vjwuW{0)^B{yWCUZd~1P+04UN!Y) zRoOo#xSLCJLy8V#3QjS{xIU|o)a;G-Y@J+s$s@hc1&n%oq`TqeLp?2VCnzLFKb9kn z{$fTuSIq8^oP$(ZzZ^pH_cMz23?;8nY$(7z4=Rh3YgltXc=%+D)F{L?zJyGos18OW ze^K#c2Lxm3^h>rWl3qpB6#C?ua(jaUpBmCB(gAP?+3Vh);{nt8br$`Jw{tK;5mv+e~;ADD`6v0erDg$TKR@ zC7gWTq{a{$&}ez7?krydzp(Vcsg3cTI!18AzvT09$aPI${#W@T1;h>6SSb?Gr}q3` zb*Ig@`&XtNRZx)d(wk$>E?29sNb&owt{3m??ZfJBqxZ>|^6718WOa*vxJIO1>2ICR zh0))y3GnR4|M>Ou4UE@8*!4qKi7NV=p9gzIf7>&lakD~Fk^ZK~m$MsqJNHiT1PKu+ zhNicnX*r7ZcNu#xHs`C---Am-Z0AqK9oj6Yk9N(edvJIevZ)*puJR8QEZLZ=R}B~j zbu8$qnm_sk`C>&>WYN|D*DV__?jT&+6o0(SiB8TH8CBD>ISJ*^ig86y(n42M^l zOVkBkbz_vc=NKa<%ah1_T>1GpA^Abj+yL53m-O}`MPu;qlN9%s3KpI3n%7jkbsYtvh&9(4-f_jy4V&9s0oQ5U4Yh^4Cpg>0B&dV<%VJn%G?^wSZGwA|A~^*T4OTFn&AJwoL5IDuz@FveRt?X zt+B%T+O76vkNOpeJzYY}gg&=yxw-ph@QN1AWX>oJ4h6DByV%*?LxYF2Xr=t!EjSZZ zB(=O_Kus^s=}TmE8tCjIpEJEEa-M0|@07Yk(yidxhD z;l_zjtMHQ0(VU|`H1JUGRdoxhS9@EnVw(^C)#t;+XR-KXp=Wfmlw*f2Xd9A|IC^a2 z9p)1b)UrpQb@~)2b3}_sK{?2MA}Le1q9QkF)jpz4Y*=qNU96?i3!I9j8yzcFHu|g$ zFoUSfC1&LfGZi`1;6jhwu=OHXO|?<5V{cAe_l77V9y_dW*x4@Rw3gssDf^!}+qfbc zX2?S)XKg+GtdFT8hDJ!qc;?aQ)zcG_9x?mENL%G(E3)@FP4y6nvj$Nv^ zqdXY2OM4OWn?=M$3=$;=9l!}FXaF&shIduk%tcLX)E70tAYu&?E>cxjZ)Ri#IR(05 zXg`7BIFy$0>Bd5{t!9V(qQgDyYWOCy--66apmX$lRg_Lt*rg7dAYRd>u(prTp+^Xg zFVTtWK-!qQ`Q~xH*>ETVW%xh(Yz3R}+S%i%Cw)hq^4RuE?^jG@ zV7IgNS6dJjPsH@sjuRH`TS6}u;C8-gX^x!V5s7=ek9*EDY$u=bQWSKrpR_vBAd#{m z*Q8)S`xU`~086y-pR_Q|WlCI*hTiua3*2v2+cIcRa_r*o`=P3Z*`8=7ZUTEk^cDjZ z#nCp09D?g8!wVn#pG2pAPRa_>UuNAj$y+%gWyA-L8$QmT4U*fD$&fiZ)#niR74@$0 ziS%fB%Ec|p#862i*RZ4lbLOkhzggjZhSJyD+V7JePvipzrCX`mG4N`<`6|q#l^zTV5b@GCu1eTuvj+4_stI zpG1Pzok8nu*>M4wMKw>^du>fyM(v1HQZ_OF+!0{PrJ{L^yPuT2v7uG|jZFcwugP23 zn#7x(z1hij)tK1nE7ZNgqd55#fb`g%e*?=D_>J@6zlRGzV+aX9K3+uGhsKw4B(?*V z^a9Ok6*qX@CkENrN!<3@pn>~IMH709H;oybJEQC+FJoyF#8dn)VnmUu|g- z?JmV=C6ttbxaqTeNZfuN(!Sp3zUU`c4vjJFrRjeHL?x|`=FZ#p|S140wr(Z zv)_wFaP?$oBJ1LhOwo6*Htji&GB6F^`5$Lbcv0X!Q+U(EE#Hy$v4z9rfh`nrSg@r z9Xi#a4Oq$*nshXNb}vu@j7#L&^l&OPvKYkCy1vH+^Z_+&lv7qY0Bnz6T9t@DP!JPp zdl4Z|u5i)lAg6X8s-4B1#A-QL_Hc#M_u%}2s7BUR(VwS=5{l1M2MB$-VjLr_Auq|y zb^T+z4~97a8b9YgT9F9DfNegW26HamJn25DAA8%+D|VddX@!rn{gT;4D-bdtV3ST>+T_s}cN&@8(;I3B6iQp`;=b86JXP6-%>_blbP9XNp?Rw58l<9 z9_l|Si&(M4YoKuQCdTN#qj&l!%;)nHI82FoK48D|`9E>lG?Z=rXE2&UbjMzC+IqSEd(< zM8MbdLAu7->OD)pdw1Cn)A#V6z3~5(k6(RDpUCOg*M+WNo{twUzm_M}DXR|1d~max zt?%BUj@0IQJ^NO#H*qR}gCD#ShP@~87jo-8M;S_TF@^P$SAtb1*ybrI=akcf&lF|u zc|z`k76VNX)#&{Sb+m(SUwrlRBNmL|o5sj72a%6+>4r?{D&_ou1yBxCtQ+OovLC+X z?Om{Jz0A`Cj~5|y%pc--i^{k~+)MInyAXJ2VxnORprWrKTZw(i_b6M-P!>PmES{O> z_UTsU)LL-x9b|_Bx!@n0HAkGbb?Xwre0s&2UxN1x)5Pa3Nad;7>umCC-gp6TKt&!ZaYDtVX*d3^ zZaZ`siqX*aEwP|x=%fMLu+5ZXt*2WGET>%H@pvqVqYcZ{T>q^C`p2jitSYVn(AC*2eL7Mx}~ zTfcmqt!IxlmToh-zi(TwE%{c*X#dX|)#T^f7YZR3z3%3Bo!zEi>+kPolx&L}Al}cd zp~RJ>;lra)tBx?##q#!TeQO^dH#8nokvWmS^Ut~Y5xzunptfErgt*CoVO$)Ti^kxV zo31gNht+r2Ua~PYL1P|}u+O)WLbZ>HREC2s;7{_jn7uU8VZz0R#SK@FceZGfLBfp$ zHMs7qQ;AF+CSI9T?=vD4>NB~!lU0OtBN8a=)0IPlz}Oad#Jx{GtfE8@LZm6s>=J}@ z4-&i;!ii?HAF^4Swy;5*JE9Ylj@?CPKSX94+0L{8mpnj@?75b5Np ziw2?=Jjdzt{XNt#7McD{FuT&#eA9?yH$ZBs+c_aptwj| z{kEPxJjeNw~_v9Ot%iP&Gw(h5QilBY)a@^) zycpc>Z4FPl#YSKpKM`c|s~sT`%JZX*gvJ7AoPDEvu7A(s4yn|dN`z-%4oVB3#=cw~ z%k|gV*5T%*;U0D`0&IK04-33~YdkFcM69Tu;Ud0dBIA9xV= zCZb|6qPMsHWgsh9=1ffr-s1KfK${H?yF3N;K=wmEWP)o7t1#&u?%Y@8I&^UlMe5Z8 z)|tDP>j&hJov1tT0Y~d_;~$Cq2ANemrn<{lFkw5rm8~uyu48_|va-bTn8Tsm<}ZhX z-N9R2F_qplMd_8A?3b#jgS`boS?Y$wnZ{7{)7m0q0jR&8xP;gA_TenT4wcJ#_SGje zhUx$t--@GYb^qA1n_iqSg~-=J!#ah1ita|$DS7|Dd6+MdY2@(<0W!-ijB=LAD{EYn zfRY_Y-`M&GeCvV7EX?)NjMg+ZR7Y4fZp@%O`!rt8P|~Qv>1HQZ*`Fv5eoUJE#q#MH zN#7{NjNZ${{V`bETKg9n&~O+LtTscj*RWWvE|L6@Z;0mX&*l6csW%8g?{(K9J+y$W zj7<^YJjtaig&M^0)Zfh)Fjus&;};fb5xeCd|Q zkP~P!1WMsLWOssw>kh1cZ}WyiiTchoqzBoJ*foq;8hNjIP9$-9wxbMTtY(-Ya!> zEtQvSv1BUQ6W<=Ksq7n~PYA>in`^e%U_2ghs(|uqfB-PxWTIp4%Y2$a1jT zF&klT@Q_q}7KS|Q1YX`Z{HEb_elJU-$5uOK zK?3AB%^6_){UJKg2%i|JhfMD6$;%JL(VjN?(#BaME!sT@#QXT;T9ePx{ac5PiLm$_#ARg;5c8> zphh9ikd*{P4=aTu!^i`A=HzZY`|g9&cwg7?LijJ6U==Ml{DiDfWMXSnO!B0~d}`?Xm0?C(XM~_uk$m zdT>hE$?e)MTTqoaUp1-gzt{6G59(-Jeqk#hxr#`&y+sSAGMN}yoxZKU)@btXdFe$6;b7bTYPrpxxa?0M}z*s+|v9Og%8ZyKM_n8WY{bwy>C)Xb`}DD`NIi`u4ZcCUlK zIW33xnYHlKv*%&xA_B3)4w!-wd5mz0Le^w7V4#6{I;B<`6ZYToCRrUG+T9tj_%}}D zy;XV61h4;yI#SzhO?Ns~m}h@for0;5+#jlRG&n2|AbS)kg02`XudlF*`rS6?HtYX< z!-X#1&S#6&7usvm$K}deAK({$Ar=m|dD))JC&l5PPCFyy?^0Hk2?uQ4DLeveG}W%o7?M>}~1iWotMVjl>J;p7=_1Tm6j z<^2wYcYxz4H@X8x=yohX`{ogAcIB|bC1TG_DZCt(BbG6M=}S{NxQ@Gx2Eq+#6n18E zf`u1Hi3;TF#SXdjz3|HtwyJP;+iC;eOb}p(AP6$D*nl&B&Cw`GV7u>ZRNQG_qRXlN z$HEA$xlf*gdrZ!Qz?|XDRG8!iec*-$yEE=qHlK%jyVx1)_SxGRRFWi_(sl+J4o$=P zcZL<%)gU%&PADth@E>fkB$aFYqndp!{#w+`GXPEnhbX`LMA&A{I(N zO$A&se72A@+w8^XRi^v}xOGsK-;1|WEX9;pigAgBs1#P7m8G%kKV9Y6^}}i}>aJLo z&$EbtOD0(asDFkPr^~iYraLoi~!FwaBHcp=4Q#nPdObG`8C= zHgPC8$u;(OS+&T9G&tlpL6x|5eb-8#V)T}DWkHT^8b!2_(D%AnTmLC623WQqDO)@X zGIPwU_!q))kUGW}bQQ!3rI7B*dKe>xoLkz9+tu>=<*A;`slE5s^3gr5M3>fF?G`CU z0{0_wmQsv6ZWClkpFlpM%A|PEN4|*xVqEpoW0|uCqNsWrEfXJkbqfkrb?mIgHxw@6 zfTh)Pvt1+JzIKT?u#lnViM;3NuF`SR`sKK4D7Fi)kLWQ+Ef-j6f_+A&*yvD)M!|~r zv2N?BQgM!25;YvXeSUm=d9%jj6xF0~KAU{AVg7ZcTy_Uwp?79?EDCBN*O`O-KWv8CAI%%JO!2DmD1HgL5dsvyS|%pwk{Cv_3BTg z?xLSK2UYO;rI@eDB74rw*CRhpC&! zhCs>_MzgMDvT@Oyey1up0TX}l+~s=3RcLbC1bgcA*!o?zm?HR8MeF22(cB{wQi@Qi z3i_8I$^64}XG_gQj3EeaLgwVv<^>s#;Og@p*EGuM+bUOXEyDV^1S|v(?qF+`eVesn zcz~3O`ss;uxbZi87!PL7-`4lD=LJe*(QC2Ah%{KNzEQ)O(d7)T%n!bVc%#b}4$NZc z!)nP^s5l#U*HC(ziRTzIev8zsR8-62Z_e!@^T!Cc?jJAl%saLx0=G}kL*X95Ia@wI zx;kQ;i)CZtYrn0yD>C@x<$Q$yKmYXV`snlLYk3M2OIo2y6+BodTmEYlqlC+pKl-W4 z3`XaLKA~5k)stq4ZPW_4O+9S6gWbyWUI?r8E?3l#&Vvf3?_RJst2Hd-V!_bA+fSiu zwRPv_BqO`r?7sG??txxpy6d3t?ByXG$YJ82kbroFj@F7{ZU+eHctyDuSd7joelc&D|EdUs)p*ddx&BTc#* z$8e=4c(z^HM_Rc?37Sxs*>cuijjtalxeG<=c`I)E^z@I}-ueDMVd~5Q^M|_&&v0O} zTvT54+nGSJ8AL|pwzr)>r57ZRtcg1Y3{&diDNGLj!c5zM>YYu(V7n{^V&}5{Rxd0j z&J0nVKyimZ0@wbep3ucvizknLaiXepcXNFEP~U##^zW=5%08)`t4M#GKFnZaXsf|w%jo~W1|$Xmt5w_BKmQjq2VP z=#d`=CWbizxL{LeelOxJ$KHH<525z%8;U%TfzZ$k zpf{b4LMD3p^?wuXo}~x1MENu{W}stm!uH1ET<2Z?ACyh`}Kn4x(yg1uOsZBqmiZi4<(Iu0218Y zBkN4bOf^d_qOk#M<+MLpQ0>q|By{YKOAyCuA?Vlfv?%U3e|Iykz!hC;kxAF)gb<;e zhn|&JR8+=|9Y`bC2JC6u0m2!KfGB&gL{*9qX1uGRp+aSQPOt)1$XN$BSN8(&z&ldP z@KeH1in-*D+@u(Oo|h!gu7bP6$yNQkq~5OQws?SuzU{>{Yt=Bvub*$ICV2BEs%PIJ zS=(K;aO&t9nHlwv@riHlVqFWXxK-b*qwzJ~+6ZbYYyP%2SYVp+mNQ4fpvhL}vzk;<2i-2w3|~q znwxH7ymo{9h-V+B&UW27=DC}lCqnYWF~>GnIXs+Py}!rCoNqe4o9J1<`a1bU=WaKW zhG08s1H}&o6k#gd>>Gk#C9PoZII4J<`U0A&0^0t41q|RKUJ9r1bGY4pM>i*Kf`J^wZteTO96|Ltv9r*XqL*CcR z=ii})Ap$_p%cPo6yfpQ2fsOQ693ApUTudlI=;w2;E5}U~u}SvW-b>M|Re`QDHY*4_ zAEHLWhSbIT6&(^9(AE7=Ucu=e(F(M&7@b}tRqbkxQigtI=&==r8Z9n37mhOt?fwU!1b6iCcFK0r^>9u z1B}B?u2=8o9Q$K^CM8&LA#)`XO$x&^t5{6AQmc!m6SAVK>oK1GZ9kL@1rf;&>FUQ> zc6dDIH*xaaj;<9|xU@rZ*N+P%RC}b-d{UaX^BqLHnP{MPG?7ZLLIVB^${CH=S$Kjk z$!*suEQ(b|s%Epd37BRyN4^t+G$F{AC3*oL0g@~-1*-C(n)-eFLYn+QcE#N%XDmi5 zg0!J3u8&e_-jBkk`m4B?I50 z^<$S}#o#^(DzEJMzF4A~!2BC(+xikkw(w%JrkQe(+5YC}k&+6C{T&LyV$kfxZvA@; zT4rZZSb8$sKNQF0-5H9#*|Rd`^}}*heg44GIg4WNCKo{|*yGfvmCl=-Ut1JA_A{h zy-53ZeejI=pXb>f>V3>_3!v)OeXvj8Jl_<74Gk5<5U*>FpqMy6RI7`Cs;i?j$9g*2 zS;9QNoZZxmpxhc$bJeaX>;g-6QD*tYbm-!F<(*9Y&Q^<%vYZ@vX*J!+C6E&i{ z;sgN58prn`q9$hi&}(&ILaWDd(_@09>~VX0!?e7jr(#x&yZs*qft93hPN`+9)hcLT(xt_C_*YL+ov>V8blt z?>1!dA$0-H!d$ze*tBwbM@7$8FHtaKVSkN%X{SmqbYZ9JXbL{L+;UVtEHkqO9Y;NW z!XhoLio+T!Bs*4Gj%`Y^Fl6fSp#>6u^j0t>gDEnT|00H&8PahmM7b3oWn@?^csVG?H=Uv<_PIL7Zkbw z5q>7p5jcw(jI}ypM80JewLI`LP+;qU)_~&Pw5QFWB|L?Aq`jRyiU+> z1UmxRl_HA!C450jiK*Rn2YPA)DI<@T|4Ui7j%{dTqG+O+uzKJW(^emxJ+?{G`W}>` zyQbJ<%8OY$L^Thw?#6mhXSGNzX~`IV@a#vjLu1%+*8FHZ*auWE9W<#-ma9oMew;7o zk8@b}kmD68WGJ8U1475WcP9&&9dXwbyekk*zWJL_zt`VnA_TTt)83tprqbVDVV&0O z3Tdii_srSm0hQdoUavl^-XlftHQs!+$5BeLKESv+-IA$AXm*7|@v-UC5{JO*)E9>U zD$^WyB<+YTCT~H7$aWFQko!>KaJ*saRSNnGC&?9JFZ`WkOAMrA3wD++@fZh?FEPl;ZW1O2(=q$Q%9wcINyM6WC4oo_A1G&9 zSPhXhQRiqvf$p1-`Z&N#<33Q@M5A|_Rt_s~hK#(o#EA#nPv#_{?Iv}Spbjf{;vpuH zJQXE7 z`;0gV4iFo8JFctA-aA~tlW@u|(hJWy^H&sNjUPa8#%)sA;Cjq0vI6eb-6e(2r&o5tONmmYZL zWxO+_8$Xh~ z)B&lP4n3~g?}2i#cz$~CO2n52%`#B)i(P@}`IfBa0FJBYIdC2%o0 zdgq3n{{bWEJuD%!82FCVng-)%Z4JE@3NWN{5`NsS$?@`l`2+C)`!GXoJy&7Emi;*P z6$t)zY(hR-Yp_0CKEi0;rn+6!GZZ+QbAYgLtjlW(`Rs+|dTj7(NlCYYzmbnc zyZ-kv)Uf!LTK+ynOm$b^Ufh3JZ9hCOkch_DXtQ{AJlp>?uB+V2T*bIO&eYF7MjHO# zNZVRP{yPy-oX~I(XN^1(6tqW*%1=nrZw%$MenX{NxKQNDXB4-iI;5`=mw_6t&K zO}FYbhtJ?x>Vj*!%tFSf51RJ`-$`T^+!qZ57DA+OJ04t(XrtHU00{>{;m6xRgw=&Y#prD4tD@P z(BmndKZz;lR%NJ_r?BI7EML}U!1GuakR9H~y1*4aaOFW10?5CRCCUcAXyJ?79Svsl5^Hs z(@9j=1VIo4K@c=X&j~2qIPbs*NTJo8kIi0Ni(lgNXdrJX&(RjIrCpCItlY-wvUBCm z(S5_Q!D+D9UZVluYt#LHM{Saw0{4__rHoCOm~8LJAlt{`A2ylS%Rt@DjExd@ZV4wk zEZ7D23N^JE=#8;haj@mOh0G?S053W03hJ0!h|ZklesjUGm{af zoW9|ptewstjP>Z=Vf!*j^aL~s6Xu@@!J9}0lJSTlB#`FWBU6U9vz>H53U}&xQF`qT zxXy-{O?TP1EEI3((a&wCQPHbHd35tA4yDB#nOE!PE4^#C>A<*Vz=sj9sXjEO{yF=^ zq<0!xA8$#j%m(CYH6M_v;A}wDb=wXPRW*lp#kSdh-yYrd55g41b@f26Z^-*qm)8fk zGnty%|E{M1d1hmI^rhY`{wv-qeM>KZ(QCZjd!_CpD)&*BhIY}cDQ}&D=2YE+Zg#Y+ z#m;XFY5cUdfbeGHh>%C-S%k)tNSeDN#!?re06*M`65^*{TzR#ofdBak zmO{_1^2p7=<)2`i9FYo(7wqC*gc!BXo1tdgJgOKeq)qElcL0XF5SzU-jRSM}4Zxu4 zS(M(Scc>hDhK_`jivz?di_gznda$rsj@}#}Y`|=GNKfI&cdzs}e0ikD@#Q~n zM%@c;`EF4yo3GKUtwEPCAq@oH#G)r!G=6zBp2-MkhVrwcEIttSMD&7ir=brdRU?qD zIJ%~*gOu?9TfKa)*PHVAWwoJyp?9w6Eyj99Z`j>5;uCqV@b>%*y|hj*!7po3VtqEd zxs@;TYO~||NWZtoN1r_?Bxpc;W>k;S=#S-k3QY3@Gyuqr&Wwrdp_#FWM*{w%l{pE4 z;!P-IhYSvTxBRN6*V}W1sSHRd2NB=W>f&3I4+|S1BfMoJ8;OwLqW7AK$zwoXMZ}d7 z6I#m6o(ZihvC;bgLm94$n0&fhoTX>}#xxR>@N42KRo%&cDL z`H%_f8-P$YtY-~0I?O+CF$oiV026|@pc{hW5k*JwkI{os2He)g%wV|bcBd#8{xy`L59u{c&Qar==w%Kl*r!R}Ik67l!?V}!C zP_+UoOF++FM{F8_DnU1ao~L7lM#H1H*3aW0I>KhoRP10*NE9NQ2+xFzwx5zPH5g%K0nhG zfQt9I7eg*=)C0V7#Rp{BQHC=*CK|b-*?JV^_>39j+;YWHlR^kPJ>#Z=E|1kcH`FXF zeS;uY@&mbNe)#k#FtR-Sm{A=N)kI`CvIa?TG>z}mMsjSh!h<=ci5*Ws*v*i#n}``z z0A&yCm?}87V-n`@+7~x<9x!!rQB1X1T(f&{L&cPInlxPr_h7>GhmQHwFk*t@21bK0I;&J3{up(u2YF;(ZugH{OHMd*o_i zG;ZFaZ{e8`c)l~TJ>YJ5U;?*xJ^RehKUVczK3Xd)1alkY-?rk5f_cS?4+z6-Bn~5r zw8f}ejPC*8GbK`$BWCBHJdO!QCcQsA>ykVTc_R!e+ z5;?$r>93FL)dx)d8ukGm6N`OLg2-j1S^V-XGz$(@%zZP42L_hYu(Sh0*eaXf0xn-K z2N;h6q+4Sq{B%pqY=~zjlT@4soqc4$8nWF?!}>C%2W{cB*loYi0`0afw78}!z~)e8HtuuTM=&`CA=6Snecc=2F&#AfMng^ay;SLzlbKl z?0Jkd7ZT-cT4_L$W*WuF_#PQf*=r(;?mn|NuE;-s60yM3Re%eR(sa%W797ge7|H=5 zJnZJT$fPmkTu&IebB{V356)Hi1JA`zANz-;K zwW4|tbTORveROq&pP(K@N^re{m^>%A2;lHgrbrQdSoV4tVB1JkX1m6bu-Q}zg^&%l zpGhj+QNP9mJ@uqe@h_txqMVwHq&o|hJ(Vh%`6A{{l!cw}l_(@~ZzH5EbKHpHHaO)% z6u*tA^f82$TEa>ov(SZ8$Sg#`Brbl z2s&X}?*bToSB45N6)WkDE5jJ1!;?o`g6dk9X^=Ol?U{_IOdg%&y&&W}?7*g+**gp| zbn>3qC213{y4!scjO%}<`t0OR#us`q1jqBFQFnMW{NAIR$=!My9RUzDVTqjJqLB!K z24fWI#ZGu;3^J3BlkEtO&AE99=MkhC{fKD;rtxmtNSJLCdc>P$>6*a9-;pGf>h(?# zW}0=#*5E#r6GX~w5NDWK;Xk?mX!UlZL+DxUs11~(yUgQR7nLgyZmKmoWdB+>FVDZx zE&ipv$*(&oP!Em;dAZt9eOOu9G7M=eAZ84+v6!%&B(7`IOM>s!Xe99_RwL$Fw4Q+X zxm&S%AS0~DRZJH>*LiW$qtZIhq+Rqlc`fSH6S|Z=s9zd_UAOrNgKPTSthXbjW6UoT zL94$EQ9UJKu*;5*VD_9S#oOY;4$rOp#hIvsepjuB^DxnYeK1JxBW4Ec zjbNV-(SDd??(G~19(nWPY*|P6Z1cEYtiIhepPG+!Abs;#t!9g1MX|UOj&6kmlrF+? zpmOZtx@gg+MsSNBizjsHYFTqTAY+@)dv80fp-e}+9_>ku6`i&=n(q$`6!AX5K+9Xb zyYG2lyVtJ{$5@oP>$`&-^)I@0Lkpb_n4|UF8pLI1x}_ssgTQf4o3=w_aJwQF3}h*W z5L$HWSC$dkV_WfdBS#N;He`BBymodwnrXWjBZL^g2pQ%T6@QOC-lr);Q8Q=JVA6A2 zaRV>o=7+mjPM<;P8K)^KyF-bAHbfYH6m<+CwCJ934mlb5C-L<0mfgh(*NWOg3|!g| zb@i>Df4=*h%Kg5pxAecwT2xDN@q|+yT$lt=>1RM(OUdGlYyDVYI6LCI+0)x&M0%2a zarVb*@zAWFL}9#Z8V!1nWNNf1h%X})Dim|5f~nR(4iBdb${gO_Xn|SF#xw{wY^W!& z(?u#Wup_tWdbHWJ^1&W?_O8sx$9QucY}DLnBtf7}bstiMxzWM~C`+O7>NdD-5}}To1r6mz6w5A@mpOzzg;%>-!4UU_<_Q6g4BP6(|`D9rYw2_(;T{0P$!9R zC4LfX?eS($Pr&<})zhR2)H7l#DsxZbq)!mLM|qtQZHDW?M%8Bm)EbmYQL>tj7lFA+s#+SqSK8J3c{y&p{LU__6m2I8G+O9?WK>C87A1t z=%B=m{Zw$+!&@>Y1lZM#iMt5_VJRCX0z{K+OQ_r$QVH5r7(}GFi~eci?c7#TTSW! zCFfC3bSeKz9s6{BaC=GVwEw=Le$Ivzs05*r0vVFGD=M%>e<=^%y*xeryjU-`3wm|9 z3xE%i;0)4oItimFGjJ!R)J2oaF1XF0=>p1mnizeHxHUBcUvUa3IeQLJ zXY_MIbEC|tba9{!oWRq&gVvHr-);g>arPv}_Ig`w>-US*V)IycmSie4dSvb( z@4k_d2QuEfSnl?PvcQVV)$_~t{bETQlG*J3yIiKU1-{$WP-A+eZ*W)wd!4eaVfcQr z-fTZs+xy4G>g%7?@}-_#b2HzD#-w*7m^{4It^ZUeih0?hE{|^8UcUZ8{Y`f@`4?c_28hI&o3W7HQP5!y4pJbdGlDW%~>?H zk+b_|wXGJbO+P#3fK|A9mragq_7PU`ZJtt5jv*~U@PGYg|dsl6%toziX z&EmhcZn0Lixl<_663_0w{4Q*+ai}Qb#8<{H;`6geStbwmzIm?avII;m6UudiZNMMj zFY9Wpb7Zz88rSBsK|e~&_1tFlz_>C~jb8hCp_xye*?@fAi?Pm4dH$hZece93S3FJl{M5k_VVeg}}K- z`M7iUild8aU2prCh4Tq8&tyImb>&qV9c}XJx6yfBqgV?en@@#QQvD>j?) zhDmReN5Sp&B5g7=)>4fpBI< z*9)bP6Bq=do$dwvH)JS+4%#b=6t4;uEY71sz9VUYcN^`<@&{Sf3_X6!wRC;pLf=8e z*aQUFkxjrxrp`M&XP%6P!)iS&ch3eAwd3fFmD`a93>@<(AIdF)4%$nbw5S2L$)h`o#G&Kh$y z81g6m7nSA|Cf?R>mP=K7rOQMM97b@_H#MEh(4|+(BAH){Xunp`(r{=sNOk1Es8njw z1kbBXg5V*Q^`OK==`z#$%xV@DoJ&i2a}y29wlI#EaCEJBUayDfuls2QA7GW*Pwm(FMbWq zC0XV=oJHT6ZS8z?adBlX^SJ~Ljqh8pv2mtbv6G&oZ{qgzay8z!r&eAq#z=+LEX(AO zCgTnW+Aa)R7xqvS(wzyXzO!IDSEJ9SO6SO%F&1JbAhwv?u~1XIEV2+vfZ+`JWa%7C z$Sj-EXiSb-s2#S;&H@Vh@hlXkbDz&xoCWj5LVO3bG%jN-y|G!!;~HKwtMtQ`MP_bX z?OYcJ7tQkJX?3}JXnY%5&IKh#3vPCeT`L!Birt33+pS^5DlkTarAcl4je`+JFWs6u z^B-WiPsgXW8WDV8G&Rw}jm4g5sq4y?!TSK3C0hasSgDN`Qv+x@LO0 z%&_20C)nnW=}qD0%yI%4ZqkeqB!Z06IrEyTvu*5sq;~Fi>yL4x0mpb0wccj0PkhZgM7{eVjPa0CribDNVqbvOLX! zb?Kj=*-t_M9`c$^R0p@t=55u?UD=hTM%nMI6&N4Z2*bLVswNf?;AD@Z`AY4^NAYv( zF>lGs+bXZk{f#~>g52dfuSg6Z0q6ZIN#eCkD-H*9X4;oX(`C=+E}(l8Yng{7*0YI0 zP25crAYGQ_A6S=WADK)-03PyAt7)SI>l1sR_BUHm_Iqp>M{GxXcpN*HX2F1^s;316 z`m5QHlk4SzGG&G-;Z_oP^2e^xFrf`jw0gw1l$H1JZbTC3YRqZf2wSofEb=fS3$T>o zJT9Wi2?uadt;C$Tjew<~IRzc;l)-Sbos1V;o-hZ>$O;Z4HUpXzK9q|^j5~#kK#xCm z8-YtDfdd`u(U6_asPYgxHfTYPuNF_wOSm?z2S(jXT}#goNcIHrTd|&$x1VW0=Y7oR zA-c)TIAG5+P;<8%4r*8)qd5m^%c(-!Xr~g~T}jU?`Vrv<@OyW6isEYBd|lU@&D)A9 zI&t|j$l}$`0O08p5b;RZJqJ}{`=ls6z~HJQbjsX8gIXo_B@M$+AWxZy!;j6&M&8E| zg^$79L7@jX#A$n(LtWanmW<#T&JKvL$OA>Z4iB_EUF^Q+eeE9Y4#!XyuF^Wlx%%oN zXR4Wl9M#QY-wIRB&{SC{x|U3>LPCz1palcC^WuDcDNgf%S6l+4VuMtEW`1>x}5v*mU~TK*xH0 z;i+@-S_dkzmAf(n^Rx&z76*d0u9`KU&k;Iqc<4Ya__&XfT%Oy z(%Lfabh5AY$Xoh4j{=&21N-B2oa78YH3+aZboe*yjJ_C1=sw4DK*6&ppbbkzKren2 zZz6WAun3>7AZQLI;Gi^}=i?DdfULQ5L1G|*OOBQx6D$g7BdAw6kj258_!=Nw5xdM&dO>g!|=)8ztN?R}q22{W6Br;c=Pexn$o z9p0xHI-DbnXb0Vu6ln!9-jD5CqQSDW;_F{(FwxSIR9bI5(Lxl^u$Yjd1zoZfj4E0P z18ijoEJigtA+{LVPE2^w0^kjaE!u_ zk2zZ4mC9Jcj@%MU@|D&eSYDxby{5`67dArF$_5&bzB*%SsoYEcwHNzRanLnPMoB6K zXv!~F@jnx{cQ^y_&D7pg42qfYIH3gyUby#?=`F;^7Sh{dMiUa}ArpNEa}r|m7@^w9 zkm;}S>|O_TiYb|K8Zg?3vyKFw0`Op08I*Qnmi=OW!U@R(jlLf}`|ZO&JV zZDVw%>Pc$xBunqyei@Z$iYS(3flhE(QFIXw zD-!Y?R^QugeXOttb`?7scN~q1<#$+?+(!XpN?(yPUv;*?8s0a=KN!+T;@3cpn78co z1ia7PmaYd%45hp1ameG_=PnGc_Io?Lvp5QJI4LfI!kPvJQ)v=Z^5JqnCUCCc2n-os zFK61SY&E$Zl(;ifte>*1NCnE?IrzQ6V>HGf0{-3OQ5HA#KU=yl z{amlNKNIq@oB;95wiAlER@%G5Bz9_&ldGf^l!wM$8kuNQbpd-i6%8kWM>P*s5uYi_ z>4r#9Pd6A-$6NqRa<_`QfD@x3B@>UWrd&L(YBBLLXc`xyIPBE)s#?`lAO&~sZY>`X z#w+Fsf~QXg8ILHYBj5sacNnG|!S-+!&ghyk4bq1Odc;)L5ie|&I_*>{VOcJ0#0jcp zgW+k4g##X;N5yR1fP%2y&>#|9)xtvd3f>IEbi+G%IATIS3wULQ=eQN zVv>87U8kgyl+x2vz~ibW8;_}=T)YgL#)o+OvfVbTNy_SkNKsZN7*pF09RN&nkFq*| zjm42`K}#2-1|DBodHit~Z!UisG>r{$^tNf1bu~#_Js1h<>Oo^FoD+db?^akRvY}yY zjpYKeRhA9NHLzU392(bS*i&$d(=YY1+AhA=SIuIzy{fj4MKN2}PxWg1w%XLblm+7k zhdR4eA8VKCjnG=K2^nbX!7k-rXWzekx<0tQygt1B_s#8W zHXANDx}&DSmOL?3U#5o|q@-?zQ=EcKOL;gFo^~>>Q7KA1_Bk~?cu2wYB_0ejnaOD& zEv-a^9mdm}%&N%cyJ%ikTdH}e=Tpb=z_a`o_IZT9{o%-FC9V|~<_sk6BEdjnt`1?O z-lQvwYosDt=-Cz>y)N@`WeT!C<#5q@X?at{!N+R-tzL`NAB^w#@##tP`LwTZQ*p$NviO6ZA22>n%TGGBb;u_T;ATO-~^LSZQ1qefS!4v zx0*G&paV-uc2xmlyCVu5l(+hhGF3s3*7Z~Ky}lGX)K#^dX+@_JAv2UE07dnUfcx!h zre27-{;t|qx+vWX;bGZrhc6nc*R@zxTMFiF7TZNbj~d7z9y?8egB9-zb5MEiW*CWw zGfkS{hT#g45g2!9If1(cDR8eWENsIm#`QLFrlMOr-5{bEGvI;rOpjn>OtJa!=YT$K z(6bB&f=m}5PL~XLAh4i(vH9@lfbP&}&c(6h=Lhvwhux6jEC!dI0a!W!-bzJD48;^H zvNr&p$zkVcNeec4SWcf7tHslTUMtx)YpPrM=7IcO-$M(K^R#skW}1@_I!Dt? z46mt}d*B}7$GYVMbMgMUK^t_`^XNfj5hJ^-+=DJ{K)8-k5^P*4qu3_ms~Oo_kcz-K zsI;oMB(}N6*0Q$4&iX|CQM**4?BOUnsI}VBxCe6T`1yOieypo`sMLo(%3c4=E7IedB6ccRX+5HD%^Xz z2y@+u$fH$pC*qb)s9C}&GiQ^dB#sKCbX}5^JTuMJ@)XarW5*}q^Ln*;S=Vot%jTZ8 z%5zcPx{WXd9itl)nfVi zWqa{h-%|u~c71v~Bj4DlpZUrRamu3ZRYDQfj`zwJZZcna)cOs4yUdPW=E@=(Ub$mu zQ;zx`p^C?z4dXC9rEwU|@SRFSuf?kx>I?+giXFr zsJL%&eoxEXmR=cn{(1TEso8#dSuP0$`rBFE+3f1(_Ud;^^3&4$rg=^2DJ_F<8j;DR zt@RXki%;PKdR~-NR~#ONJ7A?_nPEfjr7`FN1YywtCUMc5EvfBE5QfLHn+bz_PMzi` zxXEbX#7{-ba!xszWsgsYQpgzQ!NKCM9>`Dx9Sp$49WFBOn-QOXtm?U{jqk9(9^pr% zGwdE<6e4d_Ij|sO&)9TW(jP!(*i_KgE{9-W4W+DH6V;2ibWNNryhe67g0LRq zF~`1IMIGN;t9w)3qwqz0wwG28>2(%>UQ5p*b_X?ql8o+s{Z+48Kc*tZ={^!+u2QqL7PM)`Y`pc8tW z>L3+#!96JFSIzUw^T&GiQk;nYl@+DhO*nr)>PLxR<^6cP)zyc=Lr9fc(&Fo5*VrO+ zSJoKFEb4+C&jN{ahBYF`7cZM_^OR6PMHAQKR2=;(!UKja3`L4h+2FLXvf(f@h7bBTr7=+3)qwEBUU6 z+vAhxA|wSmAA|_H(@!!x;D+|*mIMyhV_J#Hf--TX969+I(cx|ND~m~QM3Oemk+ zPv$kvJaG{I`R?!fehb+io(v4L4cFZ*<2zgd%pap&2c_Xgwn=&XrGBW__3ECEg~SE- zx$4^0R-7;04viM$#Rd7BgoK@$z*AAq>-+w2%gAnF4UwgznpxD7h&Zc!Cv@zfvu?m3 z@0M_iN7X{`oFJoR9#Mn@z!Tx_QVpgI@59i)2%+k6sd%rb8yX#@cVhAx;J)mNzlMt` zBWZejT1Lqh$Dy!^Yda7&zM)~I^-lL3%n#&(h)-ONeT%bq>*_~!x2$Kg=dB*3nqp!U zZ@3l*drrk|)G4?=?Je%v&`p^%*}Fc0lhJ{!RjK58VW{6&rbAOQrfP6F!QhU4oGGJJ zl#7+yd^2YF$QNeOOtG@F8P8S@Bf$HfV_OY_7_UACK)gjY0ixGA1He$^bZ3og*3DC_ zVVKmM^!S7PbJz$_90GR$ItCI3#kuuW{gulHGQpyNHr%>9P2BrvB;FQG>J!fxOlX4F zz>Y>N$?KcYS;Ly39`B=%doepGRpz7^494hGHQmY@<~m1ogS&`L(vtl&0wa^fl%u>k zh8cUxqCmFCNqMCRzP_#29~+8?42QV1Qg(;koI`hZ9xErwe!ncS((L!kQcR-#emO%M zY)Q4>GdrDjt9bCv_+h5oyF2eoF_GYZtnTGqlsVkR>82pf#v%=zbx+R$Exkv^H6I`O zDEz+TkfuMr3^RJzimL*S|ANeE-FNY4N7F5_v^GK_xvmTLYn6)DV8u(WFa= zHb6hQ(MN1|a!kPB0XL+~R2XC_b?5HmguNN}f#8;FXZ|AcI(_n>+noWg^P4kG?)1A# zFj%ntbhymMk+*vzjvC2>2C*31YZqQP#_FepHa$@-kklyZvn!7jC(Lxs!w5zOJP==2 zZ9rD@LIc+^iiS)@Q9_$#K>?p?*=3!*e_7p&EVSaJ&mt8+)$3ATDVCYi6eQ|@oGoO% zgsb=87orx+Vs?FWtCgwDfKEFcC%W?(aC*D)$XB~cF&zXxN(1hzP zT_%4|mB2QSbr*zCZqwuza5Z$BxaqPn5Ak-~7S5=hYGu4@nM0aP*K)FkFx%O!gdqcn z>GtLjGWgquwb);e_c=+S$LL|~cE)nsQdfgu!DAN@w$aAVUKzOSj8>5yivxc7a&+-jfe(YuL#Jz1|+Tebl}GV@gDlI5SRylvBTZvJM_b?6fclQUmX5bSKoS5Gg3}z zSm~h?+vP4=gbuGCt93n>Zx~ZG)0sGRKklBQc?|~erbpJ^73Dp>F23&is)y>Fn`JPl z5gw2}Nt4_k1mJlwz$}l%jZl+dY467!1F8~3;JPs zTosg8CQOiD9?YZzy^!6d-=`evO@Rjy#oBZnv}kH*dzvkziZ>goRnu#xvhC9_jn(6j zUf+TP2LE-ktZk3N_xo)d25P@6_UNYbu~wmpdhs)4FfTubuCKcs^TQv#;GlIyLz*<(`eVu6&u+Iit#`JgLEEgTn(^zqr+v~@D^pd z3^jhDyDQONTYBTN=X&FNQEJC~ek%GlVH}Iu=ZrdmSo>9p&#$NvecL-RHeEayO~GE& zZsNU?iH1-t0|)Z)q>DAZu6$1^V^lSZat3K(OnM(|hy26@tkdV~Os+nhc=psbg5mC| z4Fsd%fs=&^?fdj9bfsf2(=HGT^X<-$Z>qbydj9rhyKPpKPBhbt#p$J$-2Q9PVhsKm zKND$88t=JV+UL3CBSIcolqAq2X6EdT7)$i*gE&kNJ%rP{?Q#z8MdkYdzBK~_J9}>(MmMwSVApbk1Lr)w z#F6HvSr_u;e7x$4?RIyYL|j!FUcsA;tld*FkexyEscoj-QE^EJjnY)^-X+~naq*Vx zc8Uw1YyYN7WpuQ)L+#jKpW@xg>2hSck<2?OF1=v3vcpkK@@=P!7n(IJ!@hdEM+Jt2 z7+9y=zR+|b_p4ibfN#`n8~JIcw2!=8Jv5$ZJFBq18(0gZ`%3Hw0J=DNUr}Wgf|F%c z%mupd9%M}RAZ=Xr`o4MYliaKeeUD?lhczyt>+Z;mGIGV8*1<cI?5*E^UFWCaZb4W*oJhCWBfQN{IgLE8R8YbYNWp{e4BS9HK z;C{lhoe#U}p(~qZwjiWOR5`rL(c+rdzTmKDUPe(+aW)$ni=^f1V5R}uZ*vLOEKfgq zrYy@8<2AMOsh4JH^GF-o#@Vpne&a0OZ`-&Ec-l6%GNbxj3~$rEfFKK5wA+BpYth*b zK^`^TcXMECGp|=TE^%uP${~^#I(7bq(t4`Z*JXXVn4Q%BJXb5K2c;MHaywPVZkauG z4Z4IS#z5d1@B*lKG#(=WXr@2OO-}HEu+6X+1V%fxJBc8@imSljkjzjXU2oSl6`dAO zg{fByzto$>f9rMVUE;GD9lzRrcIpv2Vd>HX&)`!M4pH2m2(mNL)A8+8y;!>F=egNc} zWj2T0b(0O)n_X#$vRPf^GaGCm;nMDPF(#$>#F4>_L%5R`V8zrNGzR0+DkF<20Kh?- z-tS0}5Ox>h$4S4F7C^iS?=<$~km}mpihepqO$Ti$LCeG(%J`u)@eZcCc)c9kyqLcM?d2qR{pVU8H ztto3@y*mJ82`-e|{=)VQ{h@}-hQcMA3Mj$coh|{Bp^|pSqT&kD^BDq<62}PUO^On+wQZv)O=LH;)Urzh#!| zYwU8V=bvatPh!v7fm&eSeRhsqn1s zE_vW_@LE~}VL;r!{}L>r)%i78`ZXq6(r(qWpzd!CHCo!s&ga)q?O%ioP~iQn-%-HTvCt`UgK-e4MZNZ+nJH4yt7%(cjouV4(E;eJ+c$=zWg4! z!o_O*Hs?NB=`^{G1nxqWd2h-)I_)^elCy;Oo_qqZ5wx^Mc5JZBfS{9f6!+QTs5sw} z5E~pDhXIqNY#pu)~y>Zj&=wbbh`yB&-;aU>S$idXwtRG8e>38@L3NVtaZ z2IJX!21UGZq=7E|53VcaoTgr9_jLcMqBmV;P*89hXxtO-HW9mLYuw{4F2O6!p$g{j zs%@puB2TD(;IlYZ4(i=-vsAn9$-6l=pz)*dI!$~8NT=pSO9l$w_wKmCfRq?TcLJa@ zn7{!y)a>K{_gp)1N0G;AlM@9t5vy~5GZ?$1WG>hI_Sg^Xf3{TP?$`~RXDAZ)Q=^DmHIO=uuqFJx%b&8gHFcS3CgT~Y~Cjyh+t*cJtRBhz~vh|e> z$kkXbU=EGzG1~Cg!P{m%uh-XfNs4aj!KB9x-1r(cT|b!E4|$M z*JIONyMk>KXRr-y{=Ub}A1TZM?c&;p>ZWtVRBflcnDj}~0#k`Aw#QUDSvBTb!qgaz zCveDhGrfbGcKX^I;}M7b)KDQ-oEh|^y1hCMtn?GYlN&5UHuZllsch(McK7A?8x=jB z0A|F|70+%5l*42~_+)^UTb3@!XI=mldvE4pPik&)s z-L&KIRy-Rmk1|#&um<6fPJ+S-Gz|)MCwAc6Yoa9*WKlnyyss$qy^iK8g@s>0T*nr%*zz1Z`2sU62jq5SGZPe!+$qOupw z>R#L!TUFAxDGK?Y-W=k+!@!%3CUX~ROged^FaYJRnTmg#oJ0)QTA zPAOpP6{oMwnA>@QuE}}G$w1)X1d|asAiTVU1obk^VY^ErIghzIkcLpin>NStj~;6% zcTdJfcVs}AtuU-&43gb4X6?8m?MRv6k?|hM75!VrKp2ClEf+C@vD@jag30iNVOV?~ zwM@){VoH%db0lW+lcJbSu`E;!me)$f05L6kfU&b8jXl9nA0pJByVY-w>ugU^2nkjk+hc@F_su^58^O)P9dCrVaTle z=#-il07qQ0_fUaK@Xk$hJ`QM#K&i%ExW{{F0rW@n2SjF7V0h%xf-I&000*9#X_RjW zFy}G-5ymZJoAJS?oVv=hi}_mQwYQ(qPBY*+hh7ia;)Hnx37|=S1qO_@h7)Phc0Qxo z8x!aN97mkPBayMMWAr7P(ipf_CzxTPJysC+j-F0u>(l5t%Dt@8dypioU<08 zN$;E-KHid+IyNA8>EZ)|-li!Cb~yu}VK5ByciyY2FM5=^#`4h3t%qB1rbEZZXUZ`Z zKYm80w#1ulY3Mxc{G)>^54+GEH^#L9Y4S8k%XWP@tc%1AMN)PkJNx z_GKZCyNlxH=X3oVy#TU|S+t7~P=cKZLGmVTfHNM5XM{prrcLoERQ6nsL(Qc_D1lt4 z{S z6y5<@jFI7Qr^fa#>0DDt5Ufa%WAXvR6W)D^^I}+Ji0h(ppD@= zQkG5uP`Y7Fb$~(~^;XY*x-%lj<=iv#ai3#)ed9r717|zmN$;Dv%i4(%LtWWT6R>ug z(WQWV7-u{z1mM9lNsZn11PzL?bvYYN@K|#;&$E&lCn~SOJ&ib+;ndyIB%K2eaB{zf z4A4Hm1_!wG_%6x>?1+ACMo&xibZUe+dTlk|)Wd%6#E`#=LcdOH?5xwNg8dD7NFr(>`GMX0>>#w#~XYRDW7DtD9=`O*`0&ZIy7dX8xNckAnk(O6^JJV1PL?I*K4EdTNaCfosnK z6>Qmeia6nR%(Ql+B5UEM_`x+MRye-K1mcC*66bbr7DxA4WC)PSqA*=%mCC$E!WnCs z#CLT3IV=y4q4R~HCv^iZS%%W+$6bhsLfDAoy)ujKV#i#^98C4WtlXdn!i~C)nKPU? zwBc@FCd?Ci*Bs=jHv#s*>zLkji##gN=F;5cPHHtGDmtkh9L-&=uqZ=w4;StLBRt9l z0gu9?y}3v8mD)|PY?*t`vu$~oT3(y`8~rp>oOvLC37q$@BndPNufznd9Udme7A6?y z9Fs&WJjmFtOfxqolXrq@afpz!mw6WKNvdG(6Bj%jnp6aHm>VxegAk> zZ67}@HdF!k>6uFPuC@_&(GL@^iUGcuy5-}F3E{SsKJY|E4fGlnjT!8S!sOb{n7-%1 zM1>x|j8Yy8`?;djzg~TXF4y8%lL8;zB{Zte>JEd*`a$^KihVjC1PLC?2N8JZ@tJhR@wz6=z&uTz z-S@9->Zz-Fz`NHrb!2x?);9!hFFXF(2wyu&<1Bd%p}+!c75F<{6-zLPM8?rY&}JcX(bUj(V8W%3AC$w;-`9D z3bgV-gqbfMn`Tq5-z}kBBhyS&(@FU#{MNUx*#Hh$3H~iU0hc+uQ&Bq`d49-=@0DRR4^I)wJbciFX*EFVsi&LHP(e+Sf;_f-ulI|MJ~GGm0*TIWM5Ac?8oTYmNuTvl1RP*_;@W?m;zJZ3M_49AbbjOv9lcR$GW-PUCv%mu5>N^K)sz$}pPq_OcJ2R$F z)yOdtSF40Zn$%oczebv|N)C7afUC8I~@ZDl9SCyYs$BeT5x0`p1&GWLN zzxJ0{v`Rh&9I^-!S@`T-y`;tIs#z}X<$LU9F@hC`YcsuWAV39{leg>U2b~vbJjKn| zF@3z!tCOoS5?7VQR5hu&w0@&&q9)Dd4P}>let3JMEh?VWo)D@pV>T*3JJb+ANt=Zf z&eUeX1k<%Aj8%8}#u%%9a*BnyTFX+B$M^Ej^=v8Mj@!(xeis81>HVJtGM{ZWIuQDfAq2ts)EdM-V$H_N4ZzhMLC5pJ)_J{%(<#sehy zRW4qb&XJv*Nu1C@@HyD=N{2t3=3CjjY`A@Fe}skBdk5Kdn9FC*HP}4A*v+bgo5&rt z0h>%S_tZYLgVB^L8M2uM0bIC!-^^q9Dy_y_xV*jQS+<;Q@><;2sDsJm1{8CO!?d%^ zHDH%4yv{^`m5|AT!`q?k0077-ECbp3e7A$O!CHD8vDeYVS85eUYB%zPHj>sP6iylh za4{}mQJiZ*JrUsi6{@A|ohfdel)W<+Q6XjTyrI+e3#eA_hPUCr(H+h#BI4CUaW>^E zUBRn_k_63(U)q7Sh#6dEH_VZTxC^~tg@#{1VK@~}?ERv3w7Yc3DJP}ZBvH!QQ4^4} z1)r+uh-yE(8*Ps%AVXe?yS_^!@LGNE=!d{Z$|aXY#c{^`1=3x3W0?CEJZGT~de zVEo(DbTH^Gr}tz%h^$UxXV^XHawePw>yjkF##JPVZ6dxFiM<7-M^RNs5{`4-Aqo~) zeB_4(%L}hCpm;!2g#f#LX6%E(d}3530U0)RS)~EUJ95!_KRt_O!)?e^JDHcaS1_BvF#VQ?1Rn##sB@0YO& zajx;n;GP(ptT?KkpO-&B)j!_K*JEkZM~3PA3*}%|tFM$wwV2HYx$t4n*Y#HsfTSGB zW<6i5sHOnq0oyB2GJRuJ>9pxpX#QzF%jf#+5U!OYfNLzpdR| zZk`o8-Pg0h<#70HxSi;EUY`{q%Js7%wDBpP^JqnwpaeK6-L^MQEzR7;jJQnW8q06| ziWu7hZ}p2q4PWRuVoU56`_a@mn(13Ovr+K?B{a3$19$J>V`m z$qnEtlSf2c%)(S`Zf{3~@$+E>!BbL$j7Q{_ssWd%zJ3(0js{Se*4B@btQkn?*7kn? zDNk+b?42UaL_7VI-3H8eifq(4E^%GrI!Cs4b2&&>>~tr|2A9K8vf*~3=Q&GOgeZr} ziV)>ASrM3yla-b^o#WIphXZBfHir{s$Bkb&VkN>`BH~banC@jKuC>HfX;LHI3{7{e z9OJFWrnv6Lq@Li)m2XVAxI3Lnz&9)(ruQ>05RX0DM>))!?oZiEdk8AbOx;`^f=Gm$F&n820 z^T}W(Ws{Xh)qGAFjD3dS`*rhlEuJxIvl;)amM`_qx~^y9O=V3o2@)xfUY_R!ZE4H^ zSDBPU+X;=KeQ*oJ+`t*y;T&y~jyrB6I_AKcbh{n7acjFAIb6 z!$t0J8f4s&G|8BQXprr8{6>xKa_Ef4aMavRX1`}h*t?Q9dO%k|FX&U|)+3-w&?2Dc=|iE> z@F+ae(y)x7=dOD?I|c-I>GMHwb;r|@BnYSyIWW~W-x;a#@uNVIncY^UppNwTTT(ns#fGkD30Dz|| zh2AQUgx&MBrA=qZ&``d1fh2$ru4@j0G5AQ-1UA|6Zxo?kFBhwC(MmKXO;DsU2v0K# zlaNQ|Q79A890;zn9>8HMRtSe{x&k;8G{qow=dEkbyX$c&=Oy>zs5?uER?rb;f_{!L zczR}X&7<;Y=ZFumH0<@%55v~Y01Q_({V=Fr{yibv)Q*~rX~p<~Ac};adsBFqiR)m|)*aaj{Z{@?`zh9r~r;e}6PhS@Jjbh1F zS9YH=il_*@PquKHjSGkEm6vX=?rOYvC4g;R_RSSu_1{=jPT}7XrmSVSqOh6=tTPTjgOp?GgpD=~F@ zN5Jfoy>`lAwO%_}bfMl6j9cu|St=bhdSOmX&?K!qZwqM_;Ed(CtIVszxoZJNpvM>G z9f7;+@wzv4El6>6LDit|s{3!h)k_K`z=dR9(Z3dne?Hg~#Bb<&Qr?cN{har)d;8Y6 znzU=PQ==Cd+ctN@WN+Kp2#p^~Y{|yTf$iq^eGz|x0YLFi0qQ*LsRksuKyEu2uq}1? z9PHY-QJ5eBqul5SNZKNlK92-iVa$hgB{nFtd+UflLH95&GzAERn`hZV<}zUdpDevW zHh3h^id)r+;?0_#vX2g2B3b+*XSB;(y?}^E!tQy}vIh(q(Rj2EX?);Pk%oaYm5sqA zJNv!ADfpAJ*-kuNb&n(`}1ABrRZX_2D9Ip0M4GbC@4a?ym+kd zztwZPy>Lpe@5t!o+iJ1={IXTQki$3o{^j?Z+mD3#{`+^Wobf)G)I+8&28nZ4xHP{A zx!m=^({q3D^z}H52&KLrlV}xwCH3oVjVqv*Uue9*E3aLLx2T?UDk+KgkJY`h6Y!u@ zXKln@o@JhV?Qnv#j8>$384lNSkwyXBJr1zV8W)F~$L3`@Z*8<5>id=E1Lrk4#t@KV zbvnjb(eyy^DC*2>&ZnU|ydw_HYb2&m+$Dxw4tG?V$Cj_}sc~vX%W}qgBi9U&KsYfb zmd$8QvfMpV=ZtPMfC6l1h<8t7VnPIbV!JUhaYj>ez&H=vaj}ANb1qPHB%J{q(yGYV z`t%mV(e~+W#KqqywHF_eXEdi&H0sSfCn`VG?tzGpOL)MT0SA{C$s~7XnRz%%id}H= zaL3|~AF%P5ktr@71}gU9LH0W(GhFUu83G(W9|eWoIa$IOy3~pf4RX&4ogDU`)GPKu zz{FNSZbtBx0WFOpj%z9iaFR3=_di*%#jI+FVe!1sAZmBupE3S!Pew%iv|Fk>YX$m} zsC&q2DhP1mR^XzLf#Qpo^`@cVE!tZ)S^VN}w98wufrv-K?}A<=3x^;L1MN^EM%pN% zlahvk#-wy-e$X1buD-rm&EKt?=Zj{wtrqn1VD7Y+dWMtv$Lp`21s4&na`E`YBBg`3v)E*=yRzYE_Y@ zopot{Gmj6(IkJ(8+N*yQ2SU<>f4s z+uruMl-%XEej3e7&*~b+axAJg6Bq`Q{cG3eC=Jkhw;L7E8jw0*52zPBebvA`+?GdA zi`C+3v8k^qb%ON#^Y?oFSXXm+UD>ml2+G^jcyYFQT+>b5o90vVv02wQkJYL@PgTcB z&X?-TNzF#Z(t|CjIOV#g+>z#f_VhGN9CKsCg9=B|c{sd4di2n;>|k+TuQo61`i+nY zRkxgrd;XJ#me*{CksTVEIbM#(!C_T4Elu~5R~^mTNU_EqvV&sW-;3QX^QSy+4j>2 z_`qos9vMx<06skXmCOVAI?X2R8T0m=w{6VqCDJjh9-_HeR-4VI>Z#U4&U+hq*iy0s znR!P6c)(foI&yd=a|&|kch+h_%qejLdN(_RSJI`|Y8DLWj#fe(x3mQY<&%hkojtw2 zZ=UP9tfqfmZ>b*d<(+&{>hA7NZr~tYl2-cDclGAmws}5#x7a){tDl?G_79$LkW3e@ z|8seLd^?-ni8})twAKwTyw9Ds&H^u*$7ea){HUJ)TF?`_Ux;DrF4hYz8SOzX)Xel&&`&8p55Hi&+tWiI_qV} z-BUR%Xf87VCZ#PT_JHNYCS$`)iBeNs2jfVg)ePf-hR1H*QbmLYDKj<*B1(qHRvc;9 zD%d^o0!g8Ah4d0nbhP6v>NLs;*D@(0p?oRU5Wh`tf)lSdxt4}aq-U3|!XhRGNzo^= zm|ScVS~AnciObt|g^})8x>Pb`S(|*iMKB?yI;N4B$e@WUh0IBowh{*8epaerm~ZMB zJ93^gO)M?JSx9jb1-`u}! zF6emVYpomNPMqW%xhI%(cd(+y<~X z_pg;hu_JDHcRrn?;9Zqj*F2M;Szd>A&P$`gur+St?qH_(6?Qs4x;HrXEUjDy44ICo zqD-S|B+fC}iMf>540UtawL%?na^h1ww%cniFjjF&jq!V{R=U72MER`N1|(x)&(%sB zU@nLM8rkj?FE+ZVC|}l!uAC1>&VpToC3)DdbvGUF-CD6idJya5rZmFvbW>m>{oTkW z61-k(3rdgBiB)#qFiu0l*-X-SEt2+eV1ylJ$lM$80W+8mR%1SU(XPmce^E~Km-?Yz z*Q@(lzNTAzXqs=7hyK2A36Bm>!~9rnDC%DbY~(&?D~4n!K(|YDk+_*pLI&@~ z?qZVgO=x_LGAnc!*OVrq-0LhT%Ejvb^5Ijn{q(Y28Z*Lk-Gq)*wP~*3DA5Pk128(P zO1PHNVT=-aomYwniue?XftHuu(0$MQ+I=A3;TZYu7)XyM$EgxejylT`xH~nTrkXtI z>@vJ*K{fQN->IwZ)cE^ONd3{LsT2B+=djP4zpCkaMqvHMw$pKv4&PK%j>|9W%q|a(dssav;tD}bgf820|87$OV_kW-ue0#4GaP?b;ydw z&^-?wv}e)4@d;x$N}Ry9TldDezPJlct&Rg>FC%fFyXiRTn#SgruVWFA(0x<83>=1D zSt+_Utb0v!yksMzxTkBiD^A+FqR%he>*i&BUl#}JzvAS@T>3m-SP00GjLvZvjNFDv z4zr0Bau?SQ)b#$BH$Xp~Z zR}@WKRVplL&kvh%&OJ*vvg};=@H2#9_XOO_?pRtQC&0Nyx6#H&M{Fp($j6wHM;9jz zyaNDcegY8s<5PfOK1={YlNSfn)7o9uf(qZ`y!W1v6!5*h=X5G>u zWt<8ZdH%`dG~wJ6kky#sd8h2AXCIg<0SMabhiR#RXi$?;z?!C_qz5-(Jls0T4{fjk zq2s3i4k%JhP~42~0Y6o+{W_D&!r|W3v(W+xcm@VJ49f)>V0;g9^i0gMq(%3xsn&Cu zUVF2ysP@Umc+pQkaJqRM9INditx!;A)2E6e1levhE0od#O;#{hz|R&{<0|3&m+4lI^!(?)6Jy=)*=D7_DBN~xxI~Q zAYqeh!Izp7j<(unj#9d~U9x7n53ZWcV!LRl#xm@I^{apG;F}8ww;l2H@nKsRCrRN_ z78tIE34PS_$a<$uPSbcWUZmOHFCJ|?PbhkD2+qGy>1n!PxvZ(?#M6h%hnc8KLDTqH z)u|BWD~6&N#nClA7P?q{Rgb`L%Hx;ShW>>r9p10&dPORH(}+*xOQN>`PGvBtq{Web z!_q)2ifT^T)M^%p96F@`^1Jw_-f4lN8mf$~Jm|7a>VQ?!FITnEz^+I~akyPqtIb2R zeyZnhf0EZnSjF+1hX<;KPFrX7lUG6``TWs}Oyst=Ql@erLONy-z0xX=Bak0DD5HN* z%XY-|EA)}0jD6@DQcikkga=x)@5xFxKnjt%IzIo79dEa2mQ%ygV9%c6j=>~pnZ5Q( zFKWcSNEE++xg*WK-|EwCketcZFc_YF&Uji_lDIoL|KFF*cJZ*FDyg*M6(`m6^YZ6S zqZ=bCqC@uL@Rs80#{X+4v|u5M@(0!N>3g(T3~XEW-gZ0DIZdw;PTDU^?2yua*@_7( z?Uyt3GhSV#dQYXDQ{(W=bn!4lO!kJN!%V6pW~|!+E?sSVM#HNQiyo=k;mGJtiz^^z zk(}^3T4yP{i5msQ24_uskf3uN&uN26ClA~A>*k4y%8?Vgy`t-MtL^o3r7r$~ahDF# z)$deR?F$9oDEg+K4SE|YwT6N%5b(h*V2{^#uirIhI$>P#Kh z=CEmKSTs}O)w3Bd06Xx=`<@f9O}vUduwnq9CMIyu?=Gc@P5{7@2TLgojd$|8N@r1z z6IHVU8QO_LV-wvziI}q;_XwWt8UOOA3kP5#7R=>oSm`N<_O-?#1AZc6BrJ%68!EuT zU{gU`mRvS{B$#=CQa8+-6c*@Vaul|t5!6%*y~{I1LahTsgK^ahENxo?!Pu;YW@x^E zgHR;onW5a4$H3c#Q;1Dy!;)ZmFmrSw7ES^8&4IXCj4XPxYa?NSTkbSRX4q8FmPMm= z!N(Z~R0a#QHd$=OAxQ5s4oIkVU}!L891z07yTv#JX@=&}I2eQnZ=3bJUW-Tf=rEgp zq^Og={Vj`|`k$@#Uh_@07U>!|k_Y0W*?d6{Lzd?s>ebinBh?k?K%}yzw;qrU6zLbdx#Wg9;>Z^>tQ^586 z)$jL1B+1P6mi~uwHm-_8`L_-6eowkOKv`KiCssbz+s9^pdG)^X zLs9tqiaMd#6`WGQU4(~O?26Y-o0sMM`my;TM7$EuWd+(Rwe|x25V@gFkrI_0uywA-n$hv0AJ?)~grsmJI3LYECyS zC@%Lzf7+m~Fp0{8Yazd_e08FKoEcXui-A4AYMx)71t)DqLfr&TYZ}bMB&c^#`)(3c zSuBKEd_%7pJw0##daPGcR(b|3MNlc-pm~zn*B3AAO|!mSJs9@J@sV6cXs>syLaUHe zaQ=Vk#hz~5f1`n3QfWnz#3ZCI--D)ifNqBYp?k^g5A-7$$7VgdI{9=h{;|dF(j&&@ zNUUv%fG%l>m}jKAZJV=k3baK{iU>ei*iz3!;%rpb!KS-5UW#+db(?F7CKdbY^wYIm$p%}PhfVZWSD;)~avfd4=@W>Qejvw>d)v}PrmR6(-a^>%;`)_imfOEszEe9n- zkPgbTO}+j6L)#bj|zBk`$D~$9Y%A+@wt=gupwlpe|P#g(bmD4I5Oxf(s z!qOW2~~Q9(@hKEp1nNJ$=^fh;y}68LJrgL(fm)H7-2)^n70NSHbrt!qGh!1f-z2E z!yd&etT+&4_-+^&BVKW(50O2{V4d=gUKYn<28-eDr!R&Ae9aFkHoaTzoXgdtPjx-t z{2?{mwAf~k+LnjTSmjp~YQBgmxasF$i0I_a=I82O&?sKkjJ2y66NS}(Ow`#&pG6wA zgz*KtAVx$&hh+GtTc!0F0uux0sa2gYgyooR-cVL?{^|P9Mg5~s`w~URi(`6=VzH)R zAZy%g015qq1z4z9IND+*EE5Sis%C4Dqir_21cf_NB7Y|bdigW8qsBzEDaDbp6C#Fz z+N9zptwUp_q!$}06h@R%`v!dqQl3+Em&io$MWlrr3GKfx zJ}eGPGQ5i~Z*C55;Z<12jA>0_8?GU9IG!=>DcC}2xF_AiQyM{6ezMW(Y~V}1rFb#D zzuvVd;xk718_&mvrux3bq4s=9j)K9!#ElWQJO+a;8GJk{rrbR{kLK0+S-(0d<0W<} z{UulP=ATq#{Nhi%8z{eUw*{P+=X96hd0G9uuD4q{?P)h9-HOsPCNV=FBeFB{5P&iF zyMfOS59X=|B(!Gru=x5Sj`5n6=)zmty3YRo`%24^bw|?z?U+ZMfzMInLm$IlDfBUl z**}1#N*2DRp1`VtB-FsbP6wwjA^T^`)y0p z1_+LjwOP(5U`4DbR3BjRL_KfAdhLe6bJi8+oq2i}2C|&mg@|x@viDdYE*x>sMU^lV zTw1}i#t_$xp#=RvC&J2_@kyF0X8}PG7l)s(|J^1jylwuW@e&7)#Tzkd6dX2oU^o&WrR&F0ZS;_D`hAaj2OTsA2Y*D1jZ7D( zYF{ct4JwQkve#v3eqgReH*}-yjWA9>2W;X-^|J0|X+&hMNk5e-C_{Ta5hWV7&Fn7Za!#v8e zFXHqnI415t$;?cZbfoib6;*LS z$9{hi-^gH^jWG2wXL=kV-B@f zhz7sZ&y;>cr1e~6GpVL!jwYPlS;9@{ME$mTp)5N^1Y7yGagQ*?^3sxr6t_4eZLO9! z&A*n-oqF?QxFj49PjUEF65TW(1cor5eA<$__;ImXJS{dfzmz;ZT`G#jX81hZD?)!y zPqivHiveFQHrn?JKfuoKi)Qmp9K{Az^^~{~&Wjq%HtS9b*VDuq5r}x2%)c6LRfi>2 z(&)cmQ;Moc8V~YT91(MGmOrYWo6jpca15&U>9(ObCe4S?95~xHZ|g^L;MC!@apgMH z{c{=+nt4JwLZf~DbzR-bkAt5Ur(4Q|mpSKO>i@h@#Cfi%EnQj{3r=w?(&gnx>I^(I zUCAkXrjgp(CTn00m1mTuD@w7wS^d1Cv|Wn9kl7Gmn@`P;V1I;}d9!?etY#0vhDa^m ze6JSEiVWr#YN{5Q+q2bI3fXq6ghw4qVW26`R8%uDsDoTmg##z8j3obWcMxW=g+AfV zKDDPTt<2h81Z^R%M9C9Xm@hZD@FRBx-mRvYdF~E#GQ&E~dNQ}d@Dz)~@8lFp6YwvZ zJD`wwgGQ~aTS}aU13dgl*y|7V!`AbOT;CU8AMqQT>rospHfkIDhAPtuDX~lbd%wVn6U!q9mfv^(fxlrg#ABAW>crjHg7d+Bvjv#>&gG$q| zx;d|G;6$v6!>0#tY5S$EywQ9a@1 zal79hdW!XZ^e(LM0US_6jpxtZ#XGf1PQf#(!K;p2FQUe>>#Z1_wH?=USxP$El~a2c zw4&7dWgZ?~=&dbJlinie9y(qLboaI2G(9fP>(%CEUB6k1ZJOAB3ZGs-eYa|jjDtF7 zoJZT^%G7)MqzZ>Ks?~=uyyF$08I6zn`jqMA>Nd zi!7)utK$y)8Fyo)Xsizp{vq}>Qu=boIoz;zaKUMzI2P&0eG_lCh{b{+YxR|iLAJb! z$Xo&lg`y}8x}goR1TX@lB)=i_(hHNt-MNY&|FOCg0VfqXG~=!;pn=1W&3B4+5gU1i z;CwR_VwaI7p;$inf!)Yjf?Ax-sBze?YD3b^!%RfkE@(Hr#vqGP9z0OpZ`@*E!O+sA zwX``vSS#SUCy;PNM4}~ldTyg2LauLLX!itBDSc+spu6u1rkA&)b6+ZaaHw79aQCSg z6mj;?f`T&H6p=z@?HruR4NfdFEf5bi1yJs5wMCk%yt%9GS{T3y<)rBRi)uO4^w0q9 zFKIMqN?z?_PD+t*SnB`G;C75hobo!kv^D`H3PUO^lGcKT^2-7*tp&%ID$)GLV@W)8qdqSJp zJ{PY+ykAydH?Rpj6?ZYaprWPX3*OmKu}7m6WiiI+Igu{E6@xy38Y*?7mvPrL^EDk=);k#(&LgSOl!y1vUdW#`tU=-|dXYfG8=! ziqGch51Fw=m2#+Fj;w4HxZ(v*jECiUa`7+WgZl@F4t`{@AGvLiyq~IKKi9Kc_5Z^V z+Es!aT*^6GtmHYWXfV)=jxAAQNVYmO!0M9->-hU5f|=AW=*_#^>vx(%cX6#MO zv^e^2LkCWNUST5GhVp0_O1Z)I!;OSJbln189uMHMz}N>Wk;YRPw}@@+&~rv2qf-pz zYM!GJ>-18E@7K+?xo?(q-gedgagc$Xj4lnTNR3=W^-Zy*FK4uO7H1V}V_=6ytjANu z@v@VxJb#D$1}j^}z81Y4OO(N?Isd}x#2f&gXN z-OCg@JpU|e50aGuAy~y$mg-`gnENUo)TUx-XH-_g;*b()lr@)zyfxLsC|P9=i+F1a z0~2m+pd;Iuu&@m+*=1l^mNmIqB`~#&oShMyw-w@~5EI}F-M?&Pve+kCeGk%qkCp!` z?+=TTceo?ay4R+Un!c||@AP~-dXL}ReKO7K?NC4u1CE+wIW;?Xw%B}ruKx29as>vR zvIr3P3atC>jMLe>zR>-a5rV1#s{?vr@_GIw<9-W4W1nUeO9!NmBtmJ?zC7cZO=HahUfaJes z!lPxdSuUwMBozaiF2B>K>g#Ip@G~ANWF7)$D|Xfur`7#^{k+}0U#vIVk7B;$=Q&`~ zM&32kVo;qSk(t|FD+r95+qDjfJitDe+jEgtN4~n4R5#6E(sd8W+GF8PzjZ}CCYz&U zf=V$%6XoXK^O;LSaX^{dbb(D4-u4eOZ2YD&c;brHj2JwhH*~BmO8LJ1dEFLV4vZ}v zz)j`!_?AkDU6Wf!rHQp*o!>JMXM5X^)tc_t@Fd%};nB zh2*&OYmY9w0d(Z5&>esIH04ItJ-D3HxwS0k8W`~bF~sIoL6IZc4z3q>FY=y@$S(J@ z-j9v!!&x7q8yX#VQ&F8A6a&wi!pj#+oBMfR?j*7 z4s4F(Am)Lnksb>a>Tm0+`+M691-fkpBTa)-o;-;4TDbM^oAvPafHVNi1_z0RIwG73 znM3MF)-`VcABnp>`(7;<^IpB_YRWocs*iAG*}<-!N)9KuJW$63(lw&c%5x)fqS%vs z#9(=_rufX)RW`gr_ub+d3=R8}f4HyyD38Sp1J5EJD7-6?OGOu8zKY70;FL(kXrBnc zAiJs8#WC$xB?xn`z~;fDkVB*D(r-|A5*iK3I^bib$=cWF!$HuLrxs9Ze)GO2kNPHA z+qNA@Ikb6VH>qp1r_1FbU0QvnWFj(gVs?C{`)Sf=*oVB!gZ4Ju{#!1{Ke}JO%w>Az zE<0_RR#C?lU1YHE99Eb%D)p#>a{O2FDtTW#W05qk@b2fC7+qm;F+tiMFc#Mi->sYH zXLX61uF@Cfr|YYV@@elHdX8jx)kP|Gn>68Q@N}`6(SsUP!%v$5j&Fl8;OWOQ7FB?_ z>P}WOt>?BA9_=dKhi21V3_bdr5=^WEBs>IFqLWUAM4dxfF~L@KFx1<0-*f0vsEyur z_4^6BW6KB6wFQzbDn&k)`viLVt2hvuKkDf&J@qHl;lLtI0gYZHjs?Q1B&Q-UBtxxz zSV*5zR+{5pQMy2*CGKpc6qPMxoKGZv_u;~EEfA}M$}%&OT3$Wq$%k>Zlb!YKiU?yH zWo2?)p2~6{@9OW1`^JTsIvs%)zOX#Y0L5Z;4loG*Bk;KeqTgy=v#Yp&s z*k9?(@`;gSp%`phDzZV(YSCV;`O!XO^dJgElY`U?~>9({YZp>iPN&YGb6exr{1T7xE2 z)al>pDg*sUXXfy;rI1s3_@VhBEA0PkT|GZ8?l%`yeL}ovIGfkHj%fEF2>t`YD`|~5 zElYL3?wa1MqN>jQH9OtJ4i`P41tAdMoly?-MC)xiSRIDif*n3cFNLc`cL^v(hpKOv z>Q5@}FOIya%i5J5SxTok7)Z3d`@(~S3BcYjjmkkDP+9)yUA_6Xr49)7drwbW(qm-0 z5%G{8w*@??hi9FhF}p)Eb)3TDX$q4QivF3dk5qJuLJ`;XwkXMwx+2((Sh9LYv^6W{ z1?h5Jqg+1J;nvUD;vZeXtt=e1hXXBFJri;w`JM~u=-RULq&0NWM5xNat@SODw)DsN zZjieXIrU2WWg0Bl7s)MZrkjDHmyYVCd8=|fBC3##N#`h_@u?l@d@>OQIE&kMGGs?T zr1e9eXc2;gOnb`>C^wW}32-EH0`H1rVP9#C1_PdvY2ob9bTJwzqwk}oj>hPI8tweA zXzwv}_BDACg8xN$Days_UMq45eC1S#k0OAwE`(y>)j`z3R~#0)*oMQBvHONTN^RWH z)H9pf;Vd_r+L;M7+v%LN*2n&fShf9RL|lqpqpuv=M^<2|m*KA|^7+nY;q0ewZ)Kvj{N2zH)jMBs}0u1|{z zES0BEZGq8ld;dVZeGx(@{T%Fga!?9&Nckg1y9q{=d_K!HP+e{EWN_7fQE@ddF{=QfkNb_gyb7J|89ddK}oH?BBW2P~cINEb5y`6(Q8EJEX~1;N5I ztEI7sP=k0RV4GMZ#UW+IQrRRrWf5-!NDuWyiA49ZIa0$};wj6?0UOnGnK}ZQxr?v4 z!Ws_l!(S}0sg+n*jU*OjNx{Y$FAXy-A0y~x%H)WO2~30h&>Csf;I*=%ZMXXSaCnN?ts zAF60kh_r&=>Ln#6ZrX>O#erv6X`aG)IIikY)R9xB+j>8+A%MWgC<_0_t}`bUg!0oG zvT^j1_m$Ao-|@ghzR~shh2Adtr%O1buWSOwlX%?sSx^jV+P**$TD~aGo;WxwwDO==0&KJcpn-LNqu~@Moie#`oZq0< z8vvays2E;R-mL3dlvudj)=%{I4^hPwQgRXf1~Fc zmf{HqYDx^R)zGmg+tbKJsKPB^U)CrS<4KgYV_QhQFHKsj~CDk^OslLJj zse4@)j|(b9M8I?x^99KiujYRBdIzphG|r%`!ioDO}aXP+PIir(DQR)bXT(P$>4z{=!# zgOxKzGwoegU9JpT>fub43zL^)+SGYfyhz^D z8RQ*AP_G(LM)hrRkcOZN-cLdx2dmwQMf1>?B}?qc z$irDzWmJWXwFiX~RaHDtB`m|6Y8(RcptcfMv z1DBUqMm+02y{FGbNmt+HOT%(|XyHuT8}vBk0d2MD=wYF1N6l8^Sy{NV*MBC->dISuS*+_KKRy)qBDcIJf{Bjrr8^QdFL+omb#$k;S0 z#-@5>$ZRqS=+8cf^tBpJ$OFi057-$4d7GV_TacHX)GUOZa)EPdkFy~yvtg&Qz|EOk z79L|rhMPIdy&&;3)(gj*2p$L?K%&Gz6SC}K0gx$1l})!r@6q!7dvirZ&yJO96oJnJZeg4>!$hfi2*+IQzcXENJ)mhVG?w zm9ZrVX88ypM=S&Ix^A()^+y(*xRxjce#?r%pF#OnoQ-1EaiOFbSk*1=dtxZ5ffKy=t@2Yiie(|!|if3G8NlBHVN}tMv)wA{^ z5rtC4TYkzEAnoYii&GqT;Pv{dTGdM$u1vts&1NAoeLvOJ`fat=Be-6caESe%g2nKD zdU!xj7E+*4Tw$aj1)%xqZVh5#0}hPffYCox*NGE z5Zc<_pJ&8z!4aI`uy+UI;PpzxOP66N%w-+5jhwzJ@3Hh zC(G(5l?2q&$R{-2sgrUjSUpFQ0Jm`;Th}v(*knp0JxW38_2P-rFN=0Gth3*N(Qy|= z6T@V`!kP2Iqgf)612l^@D$iXtt%#PS2>Xekdnl|X`_9Rni7845^K}AH{MI6%zT6Og z0A}h|BLHs%>bP5uIMi;ggti`$sM&@-C9oLe6}Kd;SwSQ?eY-|ZuAi&>dQHDC9<=)- zVRdf_UF$^qGmekZsNFGbDVd&U`*m?n`M=t>OITleS^iEMV6a;T4~1$+r5uR3jofJs zl`|KMJ54Mm@tH_Cpgl`$z{kMpq-3@Dog}RmzWXs!VOuhO;Kg8=f3z|pOt*$T(>%jv zw9F%l(EFr-iouj&BRf6dTC-jvz)S23Xh%UK6CoFqP@9$gs(x4qcUQYzB~sSOh3r2t zK|W9^Hp)A?`W1T05l zhqM=BeHmoa&_k)1iRi2}%|z_LGL?v0oQj8QR$H-*b&(D|2`&+~6n7nMI;4BqiP&7L zlL*gWagrN|Uzw7d;x0zEu?pHAE_imE3ab#;-%pkyv}PL0-S%zgx(vSO<>4-xwPd(v?gw}&wdOMv!vd0o=8XnZZD!j zN#9Z46+^Da_f)QAJyTnm2~st#S*m*}o&*#IYen1*v<{J70P;+XuvA~}Z8G?td1q{* z4B{_f0h8*Ql^*y_(zc>d_kGoyuC(87{GOS60VP3JFs08k^tE#(w|IQbiPxX%v3mSIaD;(a~644M@zji}AB|7dErJBVP zHN$uo2h#A(7qpQo=miQ_pOQAm0MYUcNe-Bb8v-fju?vt9 z+`62PyJ}%u=(ACtDP;vkyXOuV1f@7bBy%G4liV|zX7ZiQi{^PzZ$3YCHP}rJKfkAN z=C-EKe)bPBh#4}pAP+R@ey+Z7^uH3DB)0?2W(+?`k?KFW<9s{=|DAx@dbjW>aqTM3x1A`n(U(XUaOwqJARIlRSe=t+ z`BENMRg0DWnKXj!GEF*(P0~L&OrTuv`{F=DcYwYWk4w^PyO$4CUTwRi;J&<^ThA|7 z8l%b#kHjEXpAknxOXjZ5y(hM)1!7Q)^rN=bG`M0V8Y zl31*2jLTssht)c|_4p{hzNqzbFivLC-H2yO&jZ1wcOup_VeyU%tODYZPU~Io5PDYe z;(+R}zAWc|(VMzpBy8GU&@txs`lgw!=AR!vP@GxD1@$UvR;u!@rW$-0a*=bRcLda{ zTKbO2Dzx4$Nt;;{H3wU_GT0eXV>=KX?wQRVbXQ1|s;G_nOpiw|mgKcyhjfncGq)3Z zE^Nqe&2mmTOh)po<}B##+bBGISU->BCvZj#-L^I7D}5a5Sy9pxQ7`==vbaWate)l) z;(>&tARnESBB@$o#Zg)NEFg{!x+=k;uIubZP-*P)sr+JA`8;9yf-x_oahb^otteL9 zUZ<27fwZn`uC0xt6GF>^1=EOQTE0lW*XUyi)xpwg$Cvo9zYq{Y^nZxc*48GDz_Bnc z(p=rh>d%HSM?ZJ??Q&J#h*Co0r5L)faz;Bvy6RNpdu>J}^1QcUzUbc}ImEMtc;8ez zprL!LT5F;ZjKC^rleQ5_B=WYJ_!m7z->~xfO)H;Y={_Y&0}P(7j5f22+3^oL()b^} zGxdMWhbd-vavyEha}+N^UcuXvcG-!w5aOR6XT~ag(-pQiVYj6e1IcDo3g?5ZW#)d^f6`Pqh`Nzuv`V z#itSI@5O6x*9X-`0zFvMc>08`oOLX?_a*EypS;m=@Ps)&+*1G!*wk?Y&Za66fb|=? z(Ei8KO{B;1I-z6$u?tAG+AY1`Xty7sgspt|Om>S>lyq?Yv0lB1++vE#ir~&w^ZY_@ z@~mF;rOnzvLE%-3cHT4{0-e&2eR>e2!M(>ebzk~Cn(}zDdGoSu#1XXMK|L0AO|PM> z-~ijoLXv4{xf&-|yVCuvg5#%>I>@KmrM??H(_-aSa>?S_LeQQ`#f`0}axT5B6P%7qm^e2CtZC6B0^%B|^T z5d}OeF2BZPw>Eu12dghnEAcoJ3iafAxgfiKe6@IbUKVN_^|Gn|daP^lircoD&F4d? z2fscNlD}NhBb{GqAG8sNN)X%jevM-Ge+oUsPm4`0UJ#-x(<`VdTa?`!qT;_|@6ytp zb^k8*fbGeJxV%Sy^Bu>Di1j@^hkc=*Q^CzparBnnE20<4)URvW02SRa)-V>_qb>bO)7kvp=wtAKE?l49id-5xT{_j0 zR9=^#qZLIA1WRueOI;+O8`4}u9V4TnpwL6d0Itm4zrF@rIK5tX*!mS^SK}oQXFF+k zb&OSG-3)ga0N<3i9{IMx5=@O9nHHHu(>$P^bGIRXVOtAQ5muFJSLrA^Z&0hIbp+*) zIUb>~QvX>moBPE!mi5D8vATa(-wU?iE!HY+`f~GIvtImHq{np8;m!`}9Xh8}r0x4< z^_4ERI~<talt+zkwdgXSI$^&wXC>5%fuWwvF{I;0S>3ed59m3>uU~1`F3UN!Z_&!JJo(gY>4|}RSzk?fAG*&m zeuC`(GxxP^jpVw5`;%}bK=?>QdWJi6H%pkAyY~xEkrYtVA>rhOZtkyN$#zv)F2BfC z6?*oWb9aW6C0UjwS(YV2CNzsCe&2N3?!grSkqLPczbv<}=DTDHNv~2@Q1dqoLlaio zvFgSsDF4?>R$XaDx%Z+H(qkBgSPiNz7Qe8B2NUB(eA+@xDM({sr zpp$MDsb>*PPOQCUZBS_G@ioqjxwiluSbd{!92^}p&^mywgg182(*^Xff?=l7(I`=0 z3AUi=R@>l9J>>K6pZ6>IG)`pj;H|!*H>@d^2E=1RtV8$B=eH7S2u=h3`D81@T^LZW z`;Wt2ziFH*G&XhcHlZpXh)&=}5DL-8N&FD*nL-kCqb57T1M}yBcjSx5cf-`OjGomA z&)<^rZZL?w>oyxPdBKXeaG=^1pW$W5_POqTtbI3d`txPA__gdsX2;xU-Du|DxO9ep zVEWT-O4pe%Z9^ydW5OPM|8=?+>dHWZ%-Xewomm|QR2%WI$SjL9I5G;K*luyAvcj%p zEJD@3qd`gf`N@2}+QQo!IMpvyT*rH$_c+;O)wmvF0kZtKI8g2t>_$VA0P~$`zJE^y05NYE*Cso@P4nIx0 ze`{wQWph52bAbFLjE{^Rs?{2Bs zrZ^e{)84eb#}mIMhTlI83TE)DW6JFwS5lN;eE^Xe_W&dy^tgm8?DOSvx-4EG?o^pN zxyk&`_w^1S*YTd)xGA0XKrjghtS9a*;^c)MC4)DFVCgKN)Z2)GY40;@{NMsk;r9?H zYQ_5iqKx;JPH3$(1{#ho_b)H+7aQ=VAm^hhzhjpc83rbylON4y~w7Ja8;J&ZWT zyK`{#pj451*sxx~M#hUGA1lmjSp~C!fxxOKHS)fy4xD^mZvcV5UmJ>)^5?(+ttxDa zPK(XWYzfDtno#A!bl5$4v?ptz_lgCokGUrUVn!cm*w0Vg!$MM{>+PAvX52td)PV*{ zjLRbjl`!{PAMb8-V+fHc0`=k|R;>fFlmdMo@KWsH$pyqE*YoMiOLI<35Zm$Nrl5s5 z5(e|?__@i~C((vzf3(>Rz&^FPzoORL^9?y?xxZn)1PTtue8teMs(Uc&C6Ie);!7Ym zkVw9&dywlTko!v+MD)J|au2Fj70-?zsk3#{)VcDcQCuLS5*N{m0>#RtGhNYU0l z*%5kOUX|)8>78+#*53(p@cdvs^{?0yrVHdCV1$PGca$r58=NoaoxhY%1#p{0jAQAlA_szlvv zRL6AGGb9P3znV?Av}W9Zud3V=vYo2_^P$4x#>)DJs5>_twxeybjMrS@i=WozMdDCnpE8(CH|qcbLNt4Sc;cjvtgFsUB(UyRfBiAHHqU^ul}a@9 zjnR;h3I7vf7nG!wfdu1$SL6e6rTZ5{$Q;j)=#Pnq=di0ujXcw@=|6QV>6Hrp2hNzP z-Va1feIY+$w*dmZ$lQg#@##Cu2Z<-e?$Nxl>D=ig)ov0yN-7Un-$f*clAge*ME2j} z7Q6xNE7zg#KL@_^KL{?eg8t-!Mz+Y6U*M9Iu0?`lL0O$Lkjy1Jl}T5B6z>n~e6#qx zp6|DJn;e>fLgi>mT<}xNPK2OV?z|3(hCUT15XJb4X<}7gz0C4Aiu4&bLLopIhC^;P z#ap@FZ~Fqn%U^`ikrrwoR4vdt#f9?G{*fG6RJxpRq+HhKM=~-Kn0f~_IiNAl4ywZI zHw$NS4E`r9Jf8K<_EXU@l=ArJX%xZ3j}l(hUINXpkgcyS#>5OBudbeC=OJBtNefkM zg78{ewq{YqJ!=k-NLdU9y#E3&{++|)TIf+gDvLyCpFwK_S<@UI|6)0QD8?%vQoAOG zB2G@pQRvlDB#zQ6f}`r>%OqS0qYPYiu4EFfgi!{rIyEv0SHh?U*Jx6upQhkS8Py3_ z2gysIY2a;2Ri&MWRf)OU^Q~Vsd%mh$CEE=Ur!D;#%J*m|GxY=*svJ`5qwM4nTBJY; zAV{^U|M>0kVwrEZ__R!ns!81BD@dJ|?WD}w0X>Oyra84>QX<5OPKK)q4)HaTnPp8d z4Yred%TtOYVCHKv0ku-MJkr^Rrwm!`13nl|cL6y>+h@!LCW0EHNM;Fw2lrTP zps9^+SVCTdkgd>`6!dA#u21qmjO@`gg`nCRn$@4J?7K8@cHU?|U`?wW&=J)Xp~lQC z3$6{t~C1yRPo|C2=^hdmUqOmVj4vC0H0K7NGy=Rmj%IuAj7q{$* zhKJ;UE7&QD+H=w!!>t2j{V>sW25^^dxqe*W%Jf}N0gmSi`e}_{OG?aP3 zZ9`|&lFXP}5jw{>o-O#p#8Imq!qnsCK|j1Hj}YRR*zXaTprTI`m~eQn6b6+YhFjG~ zG`l-lQLLuRWxm+4c%9XN+I_;zBb@C_*283UqkW_cZ4;_gxC8~yCEjV!8x1b5wDW); zIWdWY3Z})4A(yAKSKUV@Y#;kT8rou;_kPt9lr;IK4D1%wqJ(yYLBub?c=ue$UxRjl z6HUK)^Nt>aY5^X~4_odX{@kZ zS7Y6h_z*6&1o;*9(}Xk{EB^L?(Bur9RznBmGyeFC|6KK znY=pVfypvS+TFTdZcU<$2Vx3hl|9FUSFyCi$i^JiIfcnMQ%81KOzy7d(Qb#r{2QDN zkNViXH&(id<5J2qLp*3aSpB(6bu;rd7;g$4FLt{DA6iJ9*R)ba_UAb@RW5siM?-2) z+9v6Gjr9TNkZW)4;LxXlnqlIy5QzFxLLaC?-^!jav-g*W_0l*4wW~vqvdZE%%D*ww zpYm;yiOb>@I+hiy`8(9shqj@PsmH;HacvhmjrWj&Y_%K-SiV~$jW14`2eifR&Ttq@ zp%%0|hRItAMZl|-l>AlFRxLR4NE}UnzGBPPa=kj1-<=*S~RpS|3|0+WK8~^^{ouyt<^xtTtKfMQtM)Zn2uq z=3=DU%gQ|RVhe4%px4RYuv^zZ#?R2|cX|VU;?eyWyP{8x&EY62%K}P!wn^=5tgo2m zkHyWp#8New)b0m4LV{|=prO(}D&DSZeyGOmr{;yW*%Zr2`QZVAd3frg%8(#Ej1CRG za)#9@ba3co3l0svbFt{Y>%y)e-5(KQpcT>PL6_MxbeVg=A@mHrprCWj91ri^4R7N9 zePyT69}p3lQFp#mCC~#7p(i`7`!}Mhgu?4!!K+?IbTNXTQt1kRN{+L^Pouq;Lex_S znk6u3@zF)c_U-6VAKjmRdqs|HrwcPh@#Qb#W&9YX$DctPLCRC2N5WI4*W1?hp&6lRQnw zz|RUQ2f$Dze#)sT!NnHXFST~O3|aHTG`<%TI9AU05IilE=LTN3^5SWH&v4&(aCKen z|5thKB)G=|p=)EKw|2F~Q^N!F3@VM5$t*CLP(70F)}P>&bTdiAnhb5L9K6Axc3leQ97*4_6#g)@jsq9FP6r~46bwyS!X(QAmT#XG!k-EOM_7ZWJUBL9#&zw8LQxi92hnsjFXCipXE z(|Q&~nJ8DU``!5t6#4587`~E?F=?#hFup~b2#6kc50XM?=xz(~-2I|9hhnbzW+DE5%yd@Ird z7cwNAf&mGXPmR(6I!dKi_4guw{RDkDzF*-9BpGB?L|}YxmOb}_F~xPfm370hsFDot znO<2PT7zzn+?bpJTe{#k#Cz)GK@gC(;B=wUawVoH*<&i%{RzdEK6LJ!V@o!Hyt9iv z)HGP_mhZopPtQyEAJhbr>HsTD!7;(2Khdsar;Bo%gA0CFz7(53SGy9-E2s*zvDCTm z!dtRf9o#B0-afB?%=QncJ)!wiV9F^f5wwPeS)D(OV*_iaj06;ydV(l`Yjxz-A&R;S z@2qv5wnbumG6!|)645w4L`7ouV#@JOIa^qEWzOW;T zouLWz4UArq-b6W>+5Jw2?0<;1)jCko%eT~&2|+WB_sT!NJ;F5=I4DvZ9u8R_N0dLM zfERiY4nn>(?&;I-4IEe@XOH#0b_$4zDA}Lb>l(cnVcPW!6c!<@Ad~kURMyZ_KZ@ zGw`S|Z>A(QApOG8ChyGPW)*iu4R|cC#c7&m0^Dr$Tsf5Ju>6VXIBItpr&G~tmgtJGrkD(|?sr!+FlU)HM8ECW?NHRoTRgeU*crTqS*Ilki z+tOy;yCx9LJ>Iu))~R$67o{~2YAj>WqDo)rsI2KZY#=UDW()CDtcQrek(}4-5wpp)Ps$Npql?N&caRCqlRN(76EFcvHMU zi1c&0+3vpNyZJLXYbraQgn9YShUI>N7vo70oyIFd`5DB=5-tqY#kEPn4M8p_0t}BM zAlN-C|CioQ_B!S>nw+!QC!LfY{)EL536AGXWd7=>Z0a59%!zRnW4o#AEOK`u&H2z9 zPw0&&`y;IKr4CN?CA{htOfSubCO$iTDOcr7xh-b!R01yD&mSSs0%axEZ!i-hy4+=Z znTrw79wO39_>icFIV_kH9pISI0@q_hw_x#h^C7GRwSRtp=n%MDd2Joitu5UckZ9^_ zcah%&T*QCs6%?mr_X9rP$NYFNcwM-nrxuxOtdAS}HmnoesgCj%TcoAm!I? z9RI1U2`499Zd*#!YIPaBTn}8Xfhi$e;x9`())BHHAAux%q#9y_Ce3*WE1iUpTD&fX zIt?9JQ?`L^}JA?2js=J`15oye5~8}L5V(7pHz zb`RkVHBi5r8X79?6ensgjU!YfqdWe|`lC?h8QC)Ky}_j`6(*g$UCIK+1J$1u#JywI z1Y%8~qeI;ZHq%OVflW6`7jMLrjKw4ILTUIHKk*iaK zQgQraz4`uazr%NvtO#ctLGc0SP`>?IOt(oBev%&o4So=1pEL3aGGzR|t|@ zMlRbBgi%YxC9LBp<{LxGgwC(oC>U3NIremW?_x@eeI^`YA&0aaHnlvB&*df$+8{g` z)`Zw>p-xn93l#=GxCj#JsVy0T_Y`6m>tykxkAdnkA;aW={wC}{&`HWd(&5gb?f3?` zMyp`>S#+S;+D7qL5I|S;;0!0|`bJ>r^7V#BXzL#Aq%u569F~IQOCw)@SQt9UK>{wO zojAli53%L=GjD0p!}6I3G<$nk(~*(Wjyuf>ic(ddR;sd1Ac>GoZua-}dsR3mc=CW} zsruQR91l9bs&(09rTf)u8V0@$rNZSNDqQpKHI{iSapCQJIB@}U9rthnvFi8Hu61j|G%uz_((1s7t%}_V5ohO}N?F1#0bA@h#oo2a?AU zT36{=_I15^$(OZ-`+Fl>SizKJagqA(5KT0m&2?a`4^wN>>CYDYpey|x(d|9}eTVZ@ zyAOL(NX-YNpV9L{tr)|zdtNC0_|sdV_~;tI0Qx}>7)bOZ;hC&PjWM+X5A2}Ifok`@ z#?a3(f~OMiSRnuiOIZV;I$1$|T{ve= zE;soPtUiP>UBdS;Ki5LvxZFR>yeszF6s7MfQ3<;U)7!#kxQslgmO7M#ty-MY+B#-pY9~lVz*doBDKmeafSdilU%R`5##QygKbDonjz|6~vy`lwG;|M-6{%y0~zb0T}ji5MAKbOm5mA^D?-{TV!%t00=kl0s{srQr# zo$>}zOvkWJ55+{Hedf@N|CRZRaXiy!et41Y?XW=E*cK5f=NwotVY>dZpD=hZHbB4HfCCywr* zk%w|V;#i_zQ`q9_1qv7`HO2rQ{hUBQ;ld4lNFbi6ve+zz8~N4)*K^C#0Bb%V5QJ9m zwLqNJwgC>9w{YhL*D2LU^-n^4+ms+Z&{tu-GOF7KA`N~#t=OFZQ|jYaWI1TJj<0@* z;&iS$oPc4xfKt~_&}M?(6*kv!0es@@b^W@3#e1&{XxRDv+X~=y0(3lw8gaV4~c~fe0VxXD_*ypQV-l4 zC(fR7;!R!vaWxgP)S>UWGvcbz04~1G4g(>A)KNClZFZ0*p2-b>-~s45S#syZyeA6~ z+tFqxKpbR=$*hNfXxZ$^mpw$Osz{QI=4K->kq{uOj}%p<-yTD&Eve1(pLm<+GvSj{m43W&H{?{x8~l25`D1o$O> zRI@-ra|#P19M=P7SCN#Vqk1SLX6#Z%o@}2tkOO7g&p?q(x6nd zsD0Fx7*8AHVZ{Rb8ppahGt`vo?}I()|EQFRO0xG>q2T}pb?xhN6{?!qkL~VWKW>MR zD;A-Nq;$REFii?FJRXN!vh{rW^3wPhT?H}P@rF$nuiwqE5^e>C4keJaQ*cs}Pg>D!RQ9?IQ z-EQ^K8yN=Vz727_mvF`^u1CDT-XzMnp>)pbx+tb+9$X}~wjeu^W0H`;%iq^aczyw2 zqgHNe<4w)NCF0vFX2ig$&A#R}2H+L%4G4!hFpxrFM^#N~>^n05{X&}&6b|(}!(S(T zOYWz_aL-=W`)zT#{;^U?FXBjbgnxspU?T#=0s{T*dH@k8nv^{z`{7k!4`9*T=+FvV zWm?qc$#`=1x{DkKO%V_yaMe@-x72j%&RyXPb9@2=Rd}C_Ir{cvRV>aooBaLCxy?=N zfiv;+6tWkJpWhx^{oJF5g^ujnPPxjhNT9NkFLv?y)}R z73)yKL#IEGBvHqdxnt2-Q$yS4va#_fjzK*(>JbkMnsB&PdA7dE4yjmitQtx~rIp)a zx8JNtV_R`r138DVcn+`0#7O-cI6HUw_PZGG%9rA9eF+6*a(Es!T^N2cV>CQv`Pn>v z0cOGVkLhFef(CayK4^iRlT3AjFV+Dz-SM0ip*-z9p89dgGl)4s$pG2fDj9M@R&fW| z9ZX^eEIbpJE=D}K!)_~TPq^l^1Jej1x?v7DqeBWZnGrQ_!_J7pj>{EVW`|Oa9&a*n zS#F@*>3Rd^0;->`c3UhjHl1SccX3Y~^njD#1ydiHRLtoFpG+YFe36B10A%)wRxxy(2b(ydu7U4f!dM5z!om*P5 zt^*Kj$8~`~T%j)PIG!(ye51uktwh2)f^fj_ZFNpe9&fTy9~2X?OUrV;Sm4ula|T`b zfcw+(oD(R~LS=YuDT5ViV{mI10(I!psmIp1HEaJ=Y89WDs&`#u+|z3O@f~=r@BnvS z+&#mM#=;0P1=M4UoCMF$F_wzGXnhg=oqA@i@!8Q!`SiR)rID8_P#>y)8_`v*K{6Wj z=c@eAzW53+;7xIAQz*_#P>tVSi`5E5uX?nh!kb!*-3XA9-wUKJjNnYxG{mpvx=ntA zGSbiG9GlRE!~~KXU`X|VL)L=yg%sQLo#NQbbsYeN^oTSF*%3lewL##RMA_m~@|b%B zRY{*_P>OV3To&8;rj#M&FoUveF5fOzr8cqB!$S^HOL>EMs&K>8-+VEL44q$GfDE)Z3b3iZJo+9s;Px}bjNZFQtSvS8bio*7@ z;?to^&-kADQc;SyHfYEpxN=RruU1n9kV2UCS8O5d<5@R{E3IKDSG^{b2 zDZ^YdM$Apszv#p(c}pE;5S)O`%VzF6QSA`WjM0hnpN7U)J;5q6=;~l48BlrFFFscu zoPH}qO%Kot^Ux-9eM`U&f9L2C*b@T-kB+FEFUURQ;IoLIEG?n+I@Sx8cHU1bxABNj#b43Xte|<^z5V=s;+3E zz~>Ey`YFynEyuajr;T2 z#nn}v>hnX!b<}s0*K2PMIk0t1< z$0<3)Hqee5XkIXns%M5$YRym(S|H>rEaBJv%L5!orQ7Q!qwYD=gsN&l*-5clysk^A z%(A|K%ZyENlW!p21}EI@bb4XP?}1b@)aeld}YJojsjqSr9>&te35xK-1ht4m3A z)5Hg-d~{zSHq>4{9uo_&jgMm`M3yfWcbj~*eT0^El6_%VQ1J_8;AWZ6Wv!ae%lrx0 zXsTrwniDw+qOkQ7Xp3wW*sdliRsI$NiE295hN$LRXQt7m5lT!OWX@@MU}9F^#WUP= zIo8iLF|{{kS=MTqt(m!mP%{x5^sv9ah5J9w*Fp<;xq(X^)__bd&UCpfU*QsmP0)1- zFH;y_3kCmXy?lRy(3&;ENC&P3R|MK#Fu_<@u9CDyxov=KhOwpF~*A9!;s+Qn&Sckn)oyLJj=UxJzkH% z6|3hkJGqB{@DI9km`lC|K7f+!Wlo2na4d2Ldm6N=y3E;LEWuM;zy_BSl4I4}oU~+; zmd*Nm@p%m<%b_l<1(8pofz>eL?{Z;V6$f=Pru$!L&l-`c8Rq&P&DM0axX53517y6p zW+mRg%W)XUpb|!f1nLO5u#X-gJS+iV92yhkz}Gf>66s1*rpnqpC*}5P0VcbAEa6oE z44NvR#r_OYXoUz|zgj>pG_;o+{U#&XQo_EyPQgX7mV?LvsU*^fYGuG>-#R(~UY=9A zw8*0P=S!9}VE7%b-WFK-lWY&eQc5zE3@Wd~LVV)p#{}8{RG??O_3M_;6kBE|V8{um zD^Rt#v}3hTtKXbcwx}IT4cWK_$W^6!OubV(NK*VS*E>kPgNNn2sYi4ilVz@e%gZyE zfAh!O#dLXGbh|xH_pI3}BC8w`v_azJuY9>L@B&CT@};^Ykl1~SLh zMQR*a#lzHLP5iTIdy<4LX&61IGw^UDP;pQY@gb3fodzLmpCC3C&u zF?HxmN5R#GQGV^Wbd4{xu1)-r&rF=O#j)QZKw=kDGpqy!trfi)mq9V{4wLZ01;Z!sR6erkd$Y_9oY zFo6KBc1QHCFB$NV!aywffPj6bOSUA58IDyUA48Aj$2aBAVkw^^>i_^Wm#@nhT)-It z!eHMX{(Ad~L~T>y)?&FV z;Jy-WFC4aYRDX!EAqoYLiTVIk2h#zBk=dJN?T+>Bj=A(ouiU8^8r7y=xYjC(#JO1NqVGp^Eae=nBM)(iPTPT&45?tx&Nf6r%>WZy>| zlEnz$b8f16n0}uJtT_H&yvtiUh=s{6Di5v)J~F=I1ChO9c%d3EgUd4DU|i++h8_X- z`Zg4!w3F(3)A`OQL`HUu2Vw|dW5fbB)(a#!qx@hscp2T|3tF7;?5vGUW@Tw6R)_G~ zG4L>;T6)um@O|oVQaqmy%?bu}T!z#wOFg6;42gc)FeLV=2#P37Z#>b#5(ZhZPYtpn zpNcf`XV5vocBWdsgU+j#Fy>`=SPgC})98Bvr2CUzP(0_)Gn_ZL1B;1Q$BlM)i0s%@ zfC;VlQg-nMy|hsmP+x&s_704Yr@ElL5IuuyirIPt9v(V`*%8>QhjqSL$mAO3IBc^q zv>YjlRTV!+HxE25c>M}DMkU+|%`(FsOobti=Mr8~ry|HqjV5_*N@^{pg2x1cZyP9? zr4k4Xu!aXKWQC`T{bma_B_?of03~_VfBi1s70K&Z^UrWe2iIp4@HAEn;FkJU-qR*P zrJ6;=h~VmxD4>LsbBrdwc4JVLuICs)c}gn^hzG{6`=SUey~Wjnsc@;x4M*>Q!bzfbjf zIQB8-Bqrrn>G!t+9?^Y*L-Y?BBCuxER(KFI01IGdHpEv+45B|_{v0)oQTivC6Fv;o zC-G7Buod1SFSoEHkdJ4U?F5V2jL}&x1y~0BtCTDm>5z?Uk0BQju2O3YNo7u21C<(( z0P_g56BMZw+%53=)-v$jP@I5S1go`y5X18Q+nfEAkw5=z3%R4n7pyX;G901|Hx8tH zu4G5^=VJaHbB2DxRWnq#M66tlL=!YNIsttK8JY9K&=}@BtYHG#$EZ=@RrGgAYN~aYRPt28G&@5^b;D{Cm%pRhwCuFBP@}gT zoOBR;!$+T;-DA+Q_wMZ~LtW)WzsQsd3aziF-~)dJPh}<8KjEdpAmAW<6C&VJc{XJ% zn#JeS6^i+Efj2sWCL++ICSOjm-tMPj2LIQ{3JRR!_(W%-T)pmhkic2Iyzc&fE-H*& zD0T*^A-2`L`Q#H;iD}p2O{}g9cIQlzE!)we+`g3CEw-Smt21^pU-VE>{6~c-xQet& zXN5FZS_d0%ux?0D!TthvEPv6aQ+L578A7=&;GD66XLM9^gI5hAUTfkn`3emGCOcAZ zs^oP8{3|rK2hR+3WqE6+B&Lk6L`tt?(oii<9fpd@3r6tI>`flVCY zE(}=Hth#x!h^+21y>S)ohlVrss&^DxjL?5GBFQ^0ODugrow#{h9sgZQi5 zmJj8!+`V@JM77M2Qg%4V;-v1!sgevxotr>}YCuW1Bckp`7Py~1;=tOebb}lS2UUkn z15g(6@%B*B`702FiVs`EUxKwm)Ot|K33QkL5-w0> z{YyxoZrPC1XF>LMx{7Klwomm@3}jyo3@W@I!cU@^t%fPlg_0(PGN&7eiV78w*Z1Wh z2I549b+0fepl${*Dh4M&m&5IE^`yWWq`5)M=~QhG#l3FN-k&D3_o&P)6QjS2{Cl0r zsjhRb*X!>PZ~j~qOF7A`{+(oc+84WR7KtOpDw!u%aaQ5A<#TMa_X<)y$N_|DutP?tB~CbAbb@b* zh2JE0gHG1NP;c@`;Rne$OvDBg%n4@L57)2PAzVnM`SAD#I68EkDbIx;W6H050O>C606ot`crsJ>ah%iaLZ zl}#_hPMFdMQl}2&Zbvbot2i1z9VlUfq3GR^!umZlhT!SLY${Ifh?<)a_^Zdiw;a!* zfRZ`$cuW0O<`{x!7zNJZa>N&4v-|L7fO7Q%@X-|+*g2zXW5`HkK^SLhzXn!=$-Mmf zT424NJNW_*a<_g1)xF>7M6uCDb)|zhCq^a;6iWn&8DsYcc(kTFHp{bR0M7(7(Z1wQ ztMc*PL}T0z0noZiPJ_Wr4E0VLdv8lBWf311<&9|yP(7AZW5;30Lx3~6b)V&?SS5j+ z%44-0c3H?wM&tTROji4sDy9Bvr5fO3?nr>EhkAB*X<-NEN9#t)2?kuY&8t zp%N%Z%E+lsu$w^t(br}EzMW1Nq-RmqJQ&F#nRQXiq{=ClYv#GkKDuy^FmfOKrYwxt ze%2fQno4x!TM~i_e;dn43$jj($`!oYEwS;>`4Upc4AmPRc+?D3sdc_OSYhe~h_CFq z1}OxxXA-@{4$@EymNIbO#|2>u>=;w#l$gPA5#7{X^3o$9F)lEp4Z#&*!sxtG^hnH% zM8qaefLgnB7)pl{9zrSAyWJ(phU3zgHdmbA5S?Y149mgL%($Qb{CWShTtDQ?d&pnD zhg`QEC?D6KPd$Injyyk%#=aj;d_PP)Ka71i#+h$~5Bb=K{8)HE9gloJ9Q%Io@#^@@ zGvdTI!4n@f`RIkGrS7rJeX@KJhK>#D{$1o5z`N9%nur zXFl$p`H+hv-$cZb4~sbRL-R3G9QimYgqH&0V}KC8i3;J9BO!c(B!q7TMCPR+^HPv` zDagDOc$JPAc{w`ra&+XK&)7Skv3EXW?`n^|Gxe$~G4@h@=9_8em4htv%`_YNW}1zB zGtEZ6`D7#C%4ObF$h@nNdF?{xU7yUmKACqFvayfqkyl1XnQs+FQmy`W{q58F_5JrLkq8Z>A$Z$zjF&Umvs(*r`sITJyOMMB~2gH$Zd>|n7 zQ}tfKwhiVR3CHKB^LA#j>oWj~jdIka$MRo;Go37ay<;VQF?;jrkLf z*|XPTj^)P}5?6TSc$>p3Q8T~VF@+QS=zL4)i3|~^YK%-Q$)VssVriy*EhhQ)``sEJ zy8ghj{z)9ljuH6P^)6MteTQmf39lb*LmAUxlRWBl-L4ZQ%qJ<5I>YK#u~xCw!N8b$FPyYMinfsGGX z{(c5I+`dBJ7EM?X$#J=ze)}AlLS3ANoXo9x)*q2Gr|%;vB}ez9yESD&1rPXE?2uou zIj&ZV;wNp1?H+`oTWo{FfM0C^BTVceS_q8O>q75lFwygUO@voADqxBR(lE#av-nSB zGt?ks+pGF8xNEA9GIQ!*@O>xz4_~uHrxx6A6?n46ow8beDcjJ5)Jyf@$qUpB`1G!q zDF_qZzrGa<-nSytAEQJTxb_Ab%$$yqF`xpFDcMtQjPK>I$2CBD@k93E%w1@h&Pkkd%dUue3@G)LA z7_E^S{t>U!w+9J?k~QQ+Uv7|(12m2|1>8o=;U%?VR>?yHt;n!V1gtRB(bUdZFbG2Ci z4mXPH&3oY6k@OPp)+RL>TsvZdc$l2*2*`ngFet{x?qG6ZRs4``UeJYwo>krrFown* z>%h-YzpVP%wIj3fbG}t8yO@DsnM%W0C5W9i z-mESqcP(V$nM%{jifKRO7$?Rvg7H%UC0NwKriIc!{0>T{LIG824e=4LP4O*QDw1L# zJcO591*#%mcUp2{maLK@kb;=_N#ab_ySdJ{QhDN2>V2hUU3yJGCBORe7A|ywMfHCg zt3q*rZa`aEf9M}4nKE6JuyN{ZOLU2FpAwkz*|UHIi3LuowZUA&M7Eu8*3gu1jbcNcOXv5epf|wF zlBVojMJA+LN6sR@Ld@`u4J=%S%}MW|uE~0nZ{ES$6`LhoN@>Mc^+|+Xdwh$A9h*JD ze|T~sRnJ7+Llw1t#vBN7V5+jK;RV#{+|@}MN?zi`dWVM4;rZ&e$QR#M%lD{`08dC2 z6EJPKTR=9&!yY=EqC82BNwvIl%*p;0a~+`S9Ejp4=l~ntD3SaMr=E}}N`>Pg-`qWy z^Y3t=itmvuYfb5V`@Wh-iInlOYA-^zV0{)T+jgdokHw4&7*fL#(OwS?P&j!kAk7?- zI_5hoqr}N7A<&LWVTACJ)I-!PHs=EKG~q;irWRKMt2v;=D5NY@t6Y7CHCwy+2$8li z1QFEF@8#3;68^U{Raan>K&(`&$3KeVRZijC3PcDGn6aGzuCt+9>o zvv6(hC zDE*%J^~w7#f2hchiS%f!0u@cL_ftOq{sT%z!(js8V3X14z7V5Yw_F#GJ9>TMV$^89 z-^HOGql7?w48N8xP><-nbhzyA?Tx0_DnJYv<_J#_Hv-@376FS+^{l9_RZQRwrq|PXLLYp;-KKgOPX;2WL9AY!eWUyO19uOqJ zBzt6gbfB@O^1>@RAUmpsz`P-g5h#w83ak}h9MK8hkJaDbt)ZpPTM17jU|Ytytu-!q zk5bJ>u|WiY>*TegZZ1iNm`WXd^ILkjv4$%L)z?Rt|C5oE?6}=Os`@=<^ko>m_SlMr z-uzPLD)Sid_d>%%E+0lb+gPO!+#E8I_KF5SS7h{*1uJ-N#s<~u&@B(S%FA%m65vOD zLvpq9f(h`2R~prAgpMKVzE~Ej93=GQh>LxuM!*(feXbEqxAXk9;Ea&MAuqX=%-+ct zU5YMT*Q2UAkaI$z(IFP%Ldv@Y+5ZY|ATXia8ftj5T0QsdA*^vpX0)rw|^$S-rYFrC$ZQN(WwluqHL@H0xL}=0P}l42P98kE z0|K{E9Yin;9(SL~wFkz46@RLuHB9P6U5qFR37EYMQybK`;6%xYq?~w6s*h#0UzH}K z-(LC+z5ZCI07U{WCSXRA5f+JxMOt1etpnnO!=~S%;Dv+l4^Z5$l#-Z2q?VhD>jgO1WwWqxchdjos#nG zzhB@|NMCr;1rYQ%!YcY3Ww!NOXdGcI9min+9noz8uHi`2WKRM&F7Ga7%{g*C+$`O6 z`Ubt@nk{n;*9~Mmx(*PaN`WD=>wWHB1@fE4P4hQ<707R)an>rBO4Y&0zE+;~>du_^3RAm;OH> z-Yr!!ef+E3i4$lOu_+(+n82+RaA_u^`{0TUE6@KvL6b#7w&L0`NC~ z_6-?7m*6f-MzJI$RQ7PJZG{XDLCyLp3J$-S4 zK{fIPyXUa)W4tmi&}( ztFM()+*+&b7(A~pkc*1GuRH&&?y{~wo5AVFRF?q=;EMw{MRy2vKL&`ccAd6xewwVF zQ~nR-2~qKDi-*lh&Z&O(kB9gLB+slMb_)-UHuGm^%L)H*m;46i5BWi|rj8B>eJZY2 z^W`2MR1uHEj}CotJ+@B5F+Cdp$P6VDYO~BYnm=;zQ>U|&d-%uD&28lJp`_C4 zZE(SnF-qPd6G7+jYIRxW%k|Tz^-m=()kI1RL06kDM22gpwAmKR&}#E#1YRjDpA4wM zK9Y7pEmCb40umx3!?mIssiI)eCG-`laLGrWTg(@x+adFQM$Sv#&*6@O_JX)oBQm_v2%kb!vKm-cK=P?SC!m9VU)c zQg?@;8N|Wxk{6OFraxubH94`059$QxTWLtBl_#D$8t#m;!=d9wY5?PDvT`WA6LN>X zd}IjRZP;@S6DIVDO}Q4WAe|Ru25*0!aQ+)5{K(3$&;#tPfXq(`%%EO}f9|UX>0j@~ zwUB>Q2=CTkXH;<*x+0swdztO?OlHWzmLinO|In?h4SzC$ z`#!px#e>7^;JdUVn2T z>vHq>Mg|gK@^|#lL{=4*lZ7q4D;hHdgi_}jHo!aQ_m!%jy@SlZzzd}Jt2x*eBX(pQ zy0Ve)GfO#pKBJ58g;p(cgf{9e3wZMaX}D|Iz;CCH3y}M>*@CwzFJvm)ZEQiu5Fz9k zbzepIWNaYBJmj-6Jgtzu=tN_F{nHc(*ViMQn>-0(H3rz3H-F3xljEAZpkpZOIRnU& zat6>{;h092;WTcb89O|jd{;}P=L1JEsN_jWc0~V8FFgT4Hp16r-!|n_39UyYAFn{h zA!1|*w`+<%iqXr!)FA@0D=_t@=z!CYX_W*{I{n#%@tN4c<&Ii(Q`bqKT<#8U<9I$Jiv8dkT6TDM~M&_U< zWNmS!v~?(~H%}kz<)GZf7KNn~NL5D&wt>Yn3EGu~zkH^_2syNd$<0tJy?&M$=8`0<%14&hSn>nGYNddvIL;CuTCz0!+({P7VH!w zGXsuVy=!rVk=?H|2?pH?{1+(Nu#{CBrc({}_74+=zk<4>K4q)*gSSw;b8xMiDl>_3 za#|_$$Wdr$p%+q*vbx0zxKV5B2Fa&vFn3RZifIX@2IWc&0nF^6I|MvgR_@Q0R3!C1 zw+2j;BCChj@{m~l2W69I06yDBCaJ3~))360Za0sVnyx&o4XJNyOHTtHK)^ESa`cT!7}QV8xDI;KC> z6dojr%DXz%BFT|1Tm6ie5EXLhj1yVN1m!?v(;jy)@@n-nkbqHm{Z^d93MgfZb@jL* z^p7mO2;l)!_$C-$y(}LeZA>k-D^8)G+7^3sp_Y&}-%LRL_)}d{qnAYQNqU(BsUvRa z!KyVe*gdG;POv(FEE-sB?*F{|Jek5cntOSujU~yX&+ZR}s;Xj1uw{^q*VtGHN`kwh z-ma-@2ut@<&&{}Us+5UhrvWlzwxyx4lvrz-gixn=ghgI{Vr#dU?tuG{>_WxmVxh9r)R$z-B0 zn;I4oc?d6DH<*FdJJe<#&mn?zMb1%BzwPY{81v6>clXexQEE1U@AY(T6fuIvix6ps zQxX34YIboy9q-`Z;LG3duV$Cke>UeClijUdi3mK-xZKsXSy5pcqG%u!0_X@S8j@n) z!YwjY>B&(ZxTkQdv?uk--^yF5oG1MM2lTDfQkKcfcUG+zBo)E(omc;H`9tAyYYH*TYG1tg1BD0kIY!=P1}}O?6Jo0@!Ql1Rw=UT@Oc$ zjNQoD22XcAB&*483jz7I00x{o7v(MfFd2QUmkH{x-@raM*4c$ceT`NejAZ0nJm58p zQEy!Bc_xxKe?#g_2QisHH3e=Hn7&>SfG+;wBaQ0GeN4VA@Jxm|HcmG{m0)xm?I43E zVXcAnE>07i7M$s{EkmtCM&C8l>9@)+>P_%#b+k%@RIQvn+}2QiC)@UV2Ir^K3DVr) zkT2hN)%Qf_aJ{b*zA(F2#X619s@iTrzR42=Jzc~|sG(()6)3Qe)+CYX*JA-!W;%tp zMXNV>yAR)f-mg><7pw~}<-~d&r0FKsNS8OVi~buFX`dQjjD);r%=Xdcjli$Jfylmb z#&WlGFR#nf=@eGjY|^fThR`T5?2FwGs%l~eb(#3GUgXQ_qPgOM$e=V(?cjM`LBNjk zQ~{~7hBcl^1$BD!`K`RUyPwWZm0X1+08?GC3S(0PTz#$ih!XDH5-{b)r8#Sgmqhs9 z)|3ZAB=zNO^{~u*`j#{wsvQnQt5jXkqG=RW10Jqho=JScTs?+tqez6h(P;h!p0*da zWd_rMh76w@THOZ6*my$_BK(Kf{=B2+OYhkJV6DisOQ+UL8@Lm5NtD#Z@;V32LR~#s zF+HSmNRp$uM$}Hyq$>X*$5)TWJ_mMzU~Mc)Ak8Vs#KkLgw9|EID$TyN%8@t%8})%0 zZ40?!_CR#h%0V^V4zn93%|Cfsk%rGSdmLqzj~lY$=>OeA=A16_5oQQ2T;l<%%GqGs zNYxoo-Yyo~IAqljN1AXCXw1&QH!WCI8C!3vFpXR7NZ)|DeholbNmh5bQIz;o14zxC zl$A2;<4mXaN}0b7BDdZd`09!9=i-MzXXS{^Rh1m9=#t}0yMTl^*3J$#k(3FmU0^`n z3snMKxq9}TTNVleB+|pug;B(DRr5ht%nKccsM`|Q{1%cHQSDeu%|;o;AXVZlV6dm; z3~I-ACQE4mZ6vU69#R76FlHgDxR*9BfzRtBzw*%AUosZC9jCEo*b)q!8^i-|AHkP{ zf0P3D63ZaL5vk!!r6p^OsaRv`sU%Or0^|xerAVZ;v2CBIwIm7K!~)%kvmIcxv`G|3 zz3HqkhhzpbV%Oq#Yc|%_iwzKCb=g$)eWr1UPHPgQz>?4~1w-=KJRvE?)Z&gMzIq!P zuH2x8f_3bO(HOEs&f}X;CkLw9hzyGKUl&jq0IMC?cFM0$0w8T54o@I3+9s%_VcBE# z5{K;|8(NyW4S=;B#eVFm6_?i<21v1aUGHxVtd1Nub*WV2FCKsHu$LRaTK3x3;T*pRCi}wY4<+);S(PK(SIHm1jjSlOsMt*sv!AoA*&1)o22)| z9vG)k3FZl2(wd5+Wyc*P*)*TB~a73ihlca2!)jSekSqh&V}) z$qYRVMpo@vC>!focb|w0-5n9#Q^=x)ScT!xH5W(fJ->e+%iKP=C52Zb-yR`QLg94Z z)_zmi9VRvYUXI}t4vb_eg@6hL*RM}`f+HPC;(#(TbN%Ml{TkoaTIu8I&d-kP3(1T1 z9^J(4n4{6CD&xJcU$Pv})e{!A{nov8s++9#FViLTbzkkaS1Xkh zF~2TB;kt7jT;Klz15Vll{71c*)5!{Zdfmm!b!{KX!+51xf#@wZ4Kbhacb^9}ClP|h zkq(5x!#))vH;ItyH3k8z3DikmkQBsHe$IEvwvahLQjA6cCrPjYX?8uEZi(bbH8MP3 zE&iw2tgmDam1|(N&Q^bm0I3Ijov(=Dz0p_Sa$oAJuM^(us{zhe`woZ3S0jk(ZI^rI z9jVJCkb*Z!0Ca?3rspwE)F>nCj-hb)y|~-0&2W&zrrgVVv=3D zgEuspA|a3*JvUH{yg;FgKuDG}VcD``&YH1e6jsmWGwI@H={S`#7#T_m+!)I@?Xs9F z$l=Wzdf2_ABt|UXbb7jg$`zaSyY+Y@GR|Ua*gvquKK!vbYs#`>&VUq6tVj0k#|i>L zH$to*{+Zvy|G^VLbEKhygxr9JSE#u`*%l#>wFCo1(dE! zq9B>7A{5(;)$a&qb=Ycc{Jj0r!p<9(#0e^fTxYR8BLauL#bR){8!Q56 zpdG?i(QR@DqQC;<)j00M8DH*whYdT3HI%$d?kVvD2?N)IFqqpxDsE_WkE))H>YB8Y`EgASZ(*4LIZ)Ef7xT( zxEMS8y~tl>^-CA%>xZN1bOpr#|EM11tC=!Jl|QebaOKfekhvvhnU2Dyn{4H4FJUFPE?=da*U6q3-$RJ!1`w;AmYm zI)af2x9W*P+Yec~Bs1_C;;o4bvsXHPqm+Er4deyavD9V{0+ASQhPI_7a0UZK}3_SRUS*=b!ZTG2KQ5!12A236z!ae|D?f)v><_~Dl zY8K?Kzzk!wSkEvH0sBb#F);AK^nAZLCMf@Yh^RCNEJ9B-M2Xv4p8;F?FqGKNPzWsv z`-wqjKx}(hnZAezFg<-q;Mt3TH!~0E2TH&&maFet5Gv@N`c=H3I{jBs!8d%2CGg#x zH;IbSxTII=Kha~Yt;0Sd(OCyf03RYZ=HA0)=f*O-^Tp1h7=$xq&1?%s87xg6ohD}h z!O)sLLvRB&j4diX(R7ucerWC7%nwvUAH`TA9JVwuxW|x5HWWgOpV!{p3cf=X0Fmw* z1%NUA4PS-}bGZM8%m>&y!BU;liSwOYhydp(y#A6w;8~liUHZUFn9BGaM9}&ZK_U2; zt@T!w$xeG*`qr=^@C2HU;*H_Yo=O7Ou#gt@*7jk0%t0Vs7o}5@s6`1^l0pxzne+!h zq{~+T7*lMpEHAvsS-yXR9+|}g`+aS(KreH6K=pb6Te8Dfy*zkaSqyNFY!L1_j0GCix%bnw@t3&p6xeX=YjEC+{)vcL7)gT2;(!IP5 zSaOeb_vjoMzi4z0MuJcs^Z6>%|!&ROnUDdgu@RU@0ByU_A zH;C5YYPB|LmU`r>vp688d5Qw6wU7HA+Lpe+cBS&uM~w}3N0C51$UpI&0>O|3s0V>b zmfk+&+QdoyM9JU{Ay@)?#}0AX1Oy}|LFe?s(m^}*!pGA`eRc>B!=YBKn{MpIQi76- z^M}lmDz^_oNi{PTMfE&!6ZV!fBlG4xb%1P#KS1&KkyZ=RAYL2WB=-`#55hup?J$;y z@|>me>126B2;~78O(@c5ycIEx-f5- z`r*6)L=1rukqG8DN9)To!uM-8*piR#Vlfc3E@o(V#F{dL^W8T7-0?;9A4a` z?W@Fq2RW;&%D5AwLvC3NtLdi^Q4x1;4bxy|pY{(A%i>G1-R4ilaKS_mT+3=vQR~Dq zGc}BB1pQniwuGyhnc(_Mm<7Sp(o@JblVA5Q4}-Lr?A{TRw8V5bhCD<|%#(84w8Z?h zUc8fzn8Hm+Vjol;CT+DzJ)J`tdFX*I>z$rnJm;I6bqU4UH}~hWi>oUvgH1|^Oz@L@ z4jIt(xZG->m*rErqeACy=PMi7s*O6^KR!ZG8dsM*h^ZSYgXr*9 zA}hC&Wo#;r$}Oy0`*ZJ|iLiRda`mJ=F5TSO5O_w8j^d5++ae0Bqd^M-;hM295T-X0 z1Y#K+wnXs9{rAhV?sJ_GP|4`HE|Nqc@T7wFspgFdNfM=jI3HZsh>~Q9BVUpNl<>EA z07zGfu*UgZp6&PY6`WUWJQ3ERye8mB2oJJhUpH&Wh25?<*p)sBuy?EYJIr(W?1zxP z4g9c}!kt~*EcaXd-^F@S)LWT3x&xOwZ4&=92{`U{;eunTU?wu!1z6UJ#Mn5z>`5xZ`EHK4BxAz^eCEeM3;PY?lLjdCU^P$naTlqkCnAZh`QG$R&>09w(8_KW`|HcAOg~ojbF-D`BH9+86;;xNafpGv3V}?1u2~ti2kLc z6qD`qrd)l$TYp`DS#OHF=X^Ca8?84D;{?=USQJ*`7&01Ls?Fxl(7EYM>hQbw*CNo^ zQ8kvsei^JnpLnVn2=g?w9b0mcj9Bg*k8q^S0K7M7w`ZnWBryOKb!)h*f@<>o0+Q>k zz&H?B)oU`HyCv`PjnH!PL|7`W8`PlQ>jpBa3EXJ>To#GAz4`oB-hfa~Nf*ySpo6@7p!?mN0cO=IelY+{%ZVHUB5klV z07Nl)L5Y~{@?G&6?A7)e`nxHUA$R5wYsx;(3@{%%r^bKg9%5$vIK?p7Ivnc;;VJVF zHvldsrUUB&au(#qUj|y@PS;oiaNZ6WagVISqplC9N&_8ut!r$`^0rcQTvia%J}U1S z1401@d1@VuRqmocjiN8QB(GTYz-;DHy8*2Ua*yaN@+C00hY~msu|RimYi$=akt?j{ z{Vd`oUxH3&B56@?Q%R$J*kutLL;XAy{ z{3#F90X-oP(v-M^V*0Q-35e1xq3I%&^sgF1#~Xrp4_6(z%X+>)JW|4B&LKBAJ*gh3 zhzta?qLY94j1%h9?+j~0_6(gcYs1p<)#Q{n;eV3i27Ub7eh0Y`wPoz|g2tuRs^V(x zAf_VJ>-IS5*I%+#Y5b!wDfm4YX7BtaghT@k#p@-D4$%v06I0FK1dypP-0zPAc z0viHZ2X!|DTAqd*V1w}x9e71Mg;55WyruH#ru@h`Q@#0-m?I{@<&d<_{DIxtd18GL zCur}!sHoTkba`(?M9bQmodunt=M&%%dJ?3Tg(4tTJ#0XK)B{+A{zUN9c1uO}Ma)C{ zp^`9+?dZ#xp)ASJbo{y} zKiy4cA7A^=qID(ik4OxHjLOoWOe3Ie1M67?X;LY>lSUGpgKKQIh`B^Q#nYo42<$Ce z2KplIA$|j(rmN={#=fZNI@$upg3b`s1UPi!j;FRxSZ$3?Czh(wt( zrS(@o!jokC{f<^JX6{S!2@{@LgO0TZIkKI*D;D4?lRT#EOl`}RJa4Tt|buZy_lh{HlNklZhLF3rUrk=QxJ!L-5!kYr#Ua) zpnL|en#_`##eZa0zXLwh6Ziui0SoZmy?PjBu+;hj2RY!uK3f*~wlZjHHF!fUsb>zN zTfv@(hf0(fao>Tn_2EPbsJZjn%SG{_Olf8Eiju+|ragSl4#<)mPY-;#2rTb21R(B$hDP)J z&;exPC|@kD9>1=4=gSQ|cYeQnhE8(U&gze5GFJ_6wl(B|WO@YTW3h`C+nyPWK{UWe-AIXG{d>4V|+^@7(q*N;p)AveGp*WqH{g21~Tr*Smi zn81CCMFYKeB?p3zK&Z3R6$r7-9f43+;$T5GziUi*4ISLoWkc-1Oc~f;r43DAcmF+^ zAABdi185>*w$JE+Cv_uTprnxmr+;bd2!>zZtA{-U!y9U88T5BuS{7)+mhb}A@RFC- z8cA@rF6PsYt^`&<`}H!QcFyAg@qEyHI+*019ORkfe$v3hak$m%<|6cDEI~>Y?g!13 zn#~VFN?n!!QevN4xn_sDk)!1K?HAY8p>dl5;1NYL=<$k@IxJ{Hb=X|hoR#K^5|uQP z;Pi98HgXY9gh~dRJq+;nH3c{1!vamX5awSEFPZb!NP@GUX`oyWsEeN3n9A7!@l?Fw z1WGAeQv#*+$cRw)2$a?+q_m_4O6$=P0*4QjGB6JpC}kn*5h$(U%SGrAD5U^W1Eq8{ zFHkzD=1eczLfnc8od90s+abY#DmeXIE{jk3wpdhYHwm#e*WeD`y$cM_ofhq(yn%@v zA$~4f&9;f_`l2KbsZz-@4&G~aeIVJE?i^~MV$#IF!15o%X+^pzQBDb+PB>=(=S#7BUN5eo@}#v|VkFmY ztJ_`QoPxytRTe*PMD}%dS&Ts9BxPwM;C^g{pda4T=HSCfAJ3s~UAPvCtxk@sD!3yjZTcMQ=OWOV8!sb*9LP5NRSlla=WZ0rMN#JyA<)OU zcwPhRH_|;(Q>${~rOEtPv6LrK6Y%t0My46Jize^K=+ImSACPJJwb3;|{ zauGT}s4cfXGJ_S@f>m{cEy!+hUO%LGBQgi+0@_~!eHQ}-*my^ zHP!|ebjUoW*!YUr^av@afs#O;ew`_qVvS343%<^j!{oNy9mGW(L-GE_5+nc}W^i4j z+ESC?-1`QLQ|5JY@!KuBT7%7Mve@K5BuGoSSpJAcJmg$%#Q5tBvXaWj60*24AAYb| ziR=-5J?P-KdV;4=;ih( zN6up6G08_g>Q;|Y854U%J# zsgPkvx&L6M+a-XBj615)-xRQhT0t2OS$oRaNj>H-IHEq3%X0V58Y#qEEj0_JrtY3s z;^bbx$7xNg;%?+C&ExP_iJa~VOz}H1I>7bF$SCh&{A9vmXy~hkp@FX)tLa-uaiSCI zH|v)h=y?l)qo9acyUwLtoNE?hnwf$wp#-s6iBbCU*U z7ID@FrUA_Ssu+K>3s-^>Ex+OXQpxiYACEoi6hmYKf zNOU0N0B1>K3cz|J@aLXF_;8f8r6^YeI>xQZ*}K^@oNPVUHKRD1E#cN=gQp;%6@2oe zd*9U~c@X2cvNT}{v434a7!MA45W+N6TZ{;6i$%~_r;o_jkXE6N9trfoQ#;8Z`8u*X z1mJz!iDI02YK)*4rwY_1^umO*^9JsOryU_3H;|^Qg#!+F$=OluCPxUXc%C+>@uB&c zSlmn^gTvG`fKlG+Lx78^SpVsKJKI4I(xL) z3kZR^N#qXElBwif-&e90?+mt^9voBYty$GuMkBQIPF)0yFegV^0!+mTypEfirKb*p zp!{hzsdR0eY%D27nf!gd)HYsbAIUo=2-{9eY43$KE!+$ADW|z17<}?N5CAwkk|hQ& zHc*jg4sAE#2qbSJIRNJaMM=bNsLd%RSdlY8^HhQ2q5b2`DRm_Yqh5xMEgxc<>@xCO))r-ji5*OLs_D@ zVEWn8Yix8O{dg_G=DSCoOj!mN)GpH6L53{(JCM+P43^IINDegX_T|)}Ew&~4{)c)l zJ(IaJ^Fzl0x~}%?y%Z$Ud7|X^2S>t$fgt7K*8i7N(BWF>VBBC{E*%Iz5Bsl>l5Q7W z2Vzs#XG|YN&adB40N6=8oGp5iOg05N(wT%2>WEI%MvZI&s z=^5@TRy(+In(ZHO#uef5*%HddNS{75^fqDxt(L9ZV7+*q26LuUUAlLgPWoVDI?03kNPzgVUgXP4DSqCs?yoSE^nX|KWRS|fGfyW$>8w_W?ii>i^m)u zb8c(6rS(4EGbOk=)K(Tp!t2TCw7@FfN}^GL&c?=-Ry9{`OKP@tzyXnQ4-RjF(s0=A z7Y)Nft~R&U$%Cy4jl&N|ub8~xM!>f)P)>bSZl6KTsn!_MIT#L;Wm7+7m95qI7@Wj4 z^q+c$<7}6t;32UyBQAsO1tz`^S?x|SogtY|2>2E9P6_xG!XJp#e25Ixah13ijQJ2? zk6+;Jp!O3;U@7GLUVw&vT5sOvK?5vw^~}CX&}$M;g1!X-W4zXPfblbrOJ~c@atB(1 z%pS%++L(OEdLC^|SY3}c1jbnjXDckTv4U&wDr?uwFJmvUBnL(2_X1CEouutd9=#EW zm1kI*jzVCKgg)jPqT6Mpl2&tMCkZvFNfA(U9A7@kD7JW-qk2lG3Cb;;akbTgkuFgL z#F;LV0U}kOPPn2ul2TNkX_O{3g(4t`*4UOn*=Y`;ZFa2oC4`1_KwyAKcnBY*JwBrACu3^N=eGP#THb0r!>7=GOJNb-fXqbPALCdy+Dw^EmcyruZT$+aY#P zK&(WR5V#cX#&br8!sP5rtPZ0AnX~5tp_~$;CK#^7=gdk$C{1^$U2Y}2DrDB3NfMKo znWpJ5-I=B#I8^fJS^iM`{1_}lWfO(CXA5U2*QTW|z1clOVWbMse@8hOK5|Ixy+J7X z{lO9H{08t)Qg2^p{t62EXA=!2D^qBP4QJ-)lk-EZ1`qo$StAnmAQ#!coE*9(e?2+B zd`pucSsgFZ5q5p0T5K+%NbOFSfQ{VJh?Yt5WfS?iAKIhT-t%=*3e0pZlLDQ&a|13V z6D4KovWLxMx#(pf0c16xHa$4oGk62!L|MbLX6r=Hu|R67zm0W(G}yZ4wz2 z{M?)QKB6-uXp&Jrt-cmNa2Ff7?1OKGdf|ILy}zNCbHdj*w4jV&!=fZ>rF?Uh3BEe zZ`3`Sb!bkt+>8&xYuV+G!pgEVQa%lZJ(~x5nW)5twI*>5@sh}GX{{~JR&iC)c6Q+ZGI4#E{;MZt8>i01dMz|5N zPU}S|vh?J?fJc@G@Gqdq@{NBDMHUeW{wrnZ;8zb6d>~qrK=Lq|FZR_zrx%+^R5LYE z0!$`Ezf30JvX1!d2t;=jZ0*wn1=nJCM`3Nvf!2aT9emqT@ZGkpoj^rl9x92)!gBEB z8SXwf)O=f~Ca-`UkOH!c4xg+}*SL3fIbFj3;0QNDkr?y+-4KS-gqLt63g|WqBAuC6 z(ztUT+T>DdnZ}VhdnU9Yc+w?_Jb~pV_#sRz|pw48o?sYsXXJ;?T$RP*Qp>L2FG_(#t1J99e*`e2}#|06CH-p{^G4N3Z z8gR%4UZVteX?V4$jx$G%%g2f$=i2`VV6R)6>=CJ1iNN=K59K_;pHwoJB34 z@B_I)F-O%XgN$B*@E8LNp{15#>>!$7oHM`qc7_{bntw`(l#Ln(}ELm zwxis#Dh{bPqb;A*LK=~=_L?UThzPv{LwFh61CkkMZJb*A;b|276WjyFP~IMB4TuS~ zF#vaU>gQqR9b3>l?*TWQ^gUp~>ARG?Jzyb?iL~*#TJz)qu|3en5MIX9)__FDVV4~2 z*jW(s#y)2@vlLlR?uC#O(BRZq53rzjVgh^2SdMrCU;ww-A z-Deg>t1XPyp7ZD8r8twD;qLu4)N=j0Jep47@$~H3EUXhK%&q1I+ws08S==X0oSsq468$V9M5b!9OG36&T22b-5*e<_<$AtHdo+P+ z?3)~BE?WcG4rH%+7$-xgk7aQ$6VM}Y34zMH{9%h8#|)#ETS-@EUXrrW94f@9TrCO^ zQE&kFFHjkVoES}THBBBD(wbh93>5!S?$*QYA1VG;AC!$rp^ly^h;zuvT4lGpct#y3 z-pfD-aZ0n?ury$$b-^K)Y?}JB_z#`{blc&>FH*aF{2@g`mXNyzs9Xi?H+5;J1^8BNIIW}_|E7+TV))PN^nm+hgZLO$bE|fu ze~_$-c%?ggfDYF0>;aco#Pg7vf%?;lXPS_t1>9?^MCV5#CFhl4b~ZgD3O*IXczs>tCs~|6LmR_oalUZX87MTJ35D7fyKcb{x9=7FW@fjcjPD8b2K4<*5zs+3JcnjK$%8u9t}U zxtHZI{`f>UBIi-Z`n;iz^SR(GD^PkePNJ0cc|$4Z^CZz>QXCVYs611()KQCA%E7I# zhQTz1(o0V(4M;cl6;A*}?|WFky0mUnsqfKowaJ|*UHU;F4zk2u-roe42rMNb%Zf)< zHkoq6_fgzJ;>gBzpr~V>JsHZs1*W2LC?tf5nLG`apO@BAP_oM5WUF zW9b?Mz9Y-v|L*j)*gUQ`FQ%K}|9ZS%E!MnG1@@SlmH%5@t^Qn<^pe$&fT~fwPB+Lb zc;nK9$nokTaGa926*|JB!*SAAp?H;R6Iv3V&*O&^S{@Uh^=^cSiuql9dCadP%VU1Z zUmkN5U7q%ufMlz+dd@exDaQSucb_LysO4Uo@vI5@mY3z@qlS1t|M~O&X}NyLm-qQ* zlfU0D-~yyMC1hi4-Td42^e3DSwh;gNykE(^v=v7sh*y~}Av4O9OmV74eBR_Q#i#uv z1TLwjaeY9NdK@2E^KYY|>+gU-$dy`Pr0A4gH6a~Nb4efT=#P_fi{kngn`jh?6zt=x z7r0w9bDi7s5#k5jpcgmg&tkcS_$;jMnf#CQ+uuH^Gr`#{+^y%Ur)7aLy=KXxlPAZ( zYq%s^7WoF2c(Z}4FVatea7YN~x$=(k0~drY5}@pRX*S$N(9gyEdjWaRT2we=E*ci(B63#{hPnFJ>@kaRF1%*L!4gihp|X+muZ}r~X|ocF&qW-Ve{< zL(-ny`=yNQYi?d$6271_zxKQ=;{5{JmI$)!YU@ZIdL<4Bmm%T%fo| z_$`h$MZTzZU&`jwr0RvG?vJ29PEac4ezy0wsj;m=mZCdWQe5*|=yv2(xKZsK-Jj?c zl&Zq1=fqhKcmK~hh}ZV~Eiae(!;{Q*TEAYQ<^4I5bzO7VfK&>h_AbIpZA*~!1 z>~vBk`EB_z1Thm*O7-lQ@2}4nIjA^Om_~YyE#6%0w>x+REm;fZkT^Jv>gEi_Y)9NB zvmL4cgE+=u%ZzGL_3{a0+gB?ZumHjn6PM z@Q4#>F)=g_n@?uWp;Shup>(QVO|2vaSUp%FY1C!WYg0%ooua?Zj?j$Q9v&`cvtF$s z<+dI%+rPf9Ww0_dL>!lurf@h@7WJpa3U$wHUV?~i?uxB`ui)dYP2TZtldrbG!s0Is zqyAJo?{59q$hUpOncCLsOD#kK4gWPbS$pu<01|q@Ax56oXu)tkVNwwTvDV?zE5yud z%Uy2$Or2%>XKRnQevXW;j<4E2*u&AkK^ki(!t>pUvJ+^}mAfm1w5Ffo$eW|H{a}ce zjYM+Y@I3H|iCQ+V>udlA_Q8?I;c1%Rh~^tT1FiUtk5pQTzBBQD1qWhCJ|Q7NJwJDC{)gkB`aUrwyp}40pOW zf9N;ki~-^Z*!d-gCH$FzEq*MYxtujdjyjJV8zYH>Q5|ha(6!P}`bSIuXydMbbZQ>@ zi4f%$9u<}g3}jZJ85b3mohi$kKi>W^jLLN;KqX<`){kPL5i4NE&ZJ1s@I0nsGt!T1 z8ym;>=gZgU99Z>CEDrrp99Jj3&&%=^`qsktU>J>nj`NtKsUAN-8ZK2k6#U74Wqd-o zq^%6>f4?X1KBMZ9?uFDpo-B$ToPPqaYun+XN(c~eb#jHbl``0@qmA_++iRs!XQwc> z&LFwT%he7~L(*wnn5`fy!K}uij>3O0S9>Tsa9hasuQ=3@9czpj!ybHkDmMD-zcH1%pd$S%K*ez@crNLB)-9r6&#=-KzZX|!VG8iWxw2&+Z=K|c$`2| zmCLIg+uPzl`w|d>({^-U@t|^gz4T7<9SXtSS{{wy&hX`Ry#mMAJYiM9^i-sOr-Bj9 z=W2FZFKPj=zCVKatHc7t1;4{ckNw2(lN`~LRx^w zk|+7(?qP6s@@ekf^Q^@GQTv9^0s)c{2cUjte{Lio}EFq3{?wm zC8dR-!r9&O?{dQxTD+E$)43QGh_rRFTfXn!Ll8a`8tZcIfwR#^-BW}|>%vS`Z|rvc z=!oFJjrDxICvGxo>cy>n@eVWov#;Ml#t))O)O+=9bt_%5+mHAeD;2^6=$_xHu zCa)QrgY2v}QXgjUiWfY{;MJKN6gu@BFR%|MH@`e$o9nf06(wDKS19l+W9$3n0POfLILwX&uJ+}{&L;UOUKQFq8OG{2}G^p+GqeqMmdAec7SQe55hI>2rW z8u+7Zkf96W&F(IdnEZyM3U}nPg_AX}v-@>)xn$}cdCMtZ?x1p`&a5*0rx}8qbFLSt$e69IDf<8l!wUw)r&qu)gd6xpcf+9pS9> zUZ`!N4rr$jrSMo>_-^xbftR(bf`aK=x7Zw!e@ViqHoLnV2u&9XH?4G3k*8OXOJezN z7o%HRcDl^PVOUav2IEsGemic4uiG_ry=%1MRL-P#@MzG8&wU!)HI3(W*uW^NZq~7H z)ov!=JNx)_t)ZP7uNwhbN*vDck!{S(-tDy-f4(g-x5DP;t?zMm)n}zAdHq>~vF`aS zs%I+^v&oM4e^vIskRO}~(;urdS?*I3NV&%!>PO&mBzjMiZoX5%^p5b@o-K;IJ!`~RZ;?KkQ zuS?Hyl>jWQ*j;<+zUhI$R~p%aPxDo2*e%$Ko*5h8tUR;hpl?Dq&)A7(#YbbmipsA> zf97`OImh&D%;8@Rz`yjJY|w*lnJ7Z_U1h!g*urmK9A`0&Mfw|^iXmCBXHgq z8`>{Y5Uw82WQu+`{dD>F+A-1}n;AIL(lGqs7}thbcpiO{!MNbD8WH_sD9R){h1I!1 zrJJK-NbhF>i|ci~!<(Egaqa&fDN#Lv3zG z`Myv5ZVgX*+8bNe_cG>XTH{SVraA1LpxCZd!wZ)Pdj9q6Gvyz(;ohW$+ZV7kH{lLvSZBiY&tPKA4rY~B zy$+A8Z2^birNZc|GBSKsI)*BHxAVRHB2mhBLB+ZUy=TyeW!d8wg`xg=x&E+zFZ=JM z(x`cy*3OKlLLO>h9fatF&Yia6g4gmMUp^q`JXo;w=^0FaJD^+tx;#)1KK2n~4n~48V-7`${xOH$pYhrMvWwXVT06hqxx z*IvX($}SHP;bHIb6Y@TF6+t_A-tHk93~%LIRcg(~xGQM~8v$d>gD}YdZs_3*8f-j` zA2jT+%QIl8VFPvF!U0pXaDV8#G=AivH*|-QeN69UIL43cU%x%!+#0OgHWC=8*xkKv zdvpp_dbbAmX(tXQ_5)62!uhcLyYM2uxLrS~SlF|wt4AqhS9TDPgkf)4wyg@17g}bs zFjA$_Xxkk(2F@2+Qjv`I%&*Qk9UA*oX~HeF?qnzFm~hIr1#7~geG)t6z<$v4bO$^1 zHJ@-VZI7{Tsy^+c10ShLCmqkf(|w zl;h@h`Lw>P9rRvOX5J?IOuXUEYxOTdKY#mU*p?Pxf_-9`<10ln|BIH=V&;ChF3Dfd z!EfbDPq#(tq_o)wThAe-~hDxAW19Qt-e8Re|^H2b8TdO~7&q-_@XsQ+Mz{G4@+pxEP z3&@8JvIhjcXV$-uQ;j;=X?ttkT*EDHR9gVtG7I^y)h>5iBb<9l1IJzJI#1>B>s)@} z0~t15b@MMwXS}eB#Vw;j$}rWBML@6oQ_h;9tle2$Tt=Ys`y$s_$LHM+2KI7|@FS&< zC%NE*%cI*B9N;3iQFo|K)h@0zl8;NH$Uu7}AKk{Cw|Cw5znDJ37+jVgD}tEKEbB@NeRT%PN-C7oQ}w2?>hNeYz}Zr%b`|CMxvm>gXZ7_H;xs=_ zHXr}CdR%>6-L9U#j~gPGJ*~cKUWFllTwGUKr&X{b4X?INUmwlT?#~4`hK!CY<289% zck&`j%WtdY->!1zD-}s?h3U31!}~bR%699=#rZwn z_4l}O7N#5hr*Mg_XvK5!@te7-ma43_%h7u7HsUI82u+W!{CvTUIdA6msg$7df2yA< zm??BVA{SqU2MT$0RdZC8X%j%uysO@b!O^GN_4?uXQD4ly%$FSGWCLM3XjP z*hW8;l=Zo0(QXuIYjv%li4~C&aNjpU&?X4Y&OxXvd~>@j=|JCCeh#JZs6@Trm5XNm z_nE4!lr?ILa%RscQP-pI7R+1d?a$K4M2}$hb`m@k#bpZa*58QDU6xg45#BHER2<CM=k3XvDjf2zX5=w&T}PfnTS8D>p*H0(GYxZ^UhM!zV4%X*ERRI;U1e zvaD#9Ruw5nV`st1`bTZ=FQQ6IVrZRPgT>k~@>>C^mmJvY;(e-B70oJzJv9ft$0t?_ z{fC;h-HBi_@a?W#t3<@CL!fL08h5*L3rN9SUTI2eCf<39Cf9gg13*H^36z5#b1M!>U?g+?>!6OufIJm->x72 zUOYHG{D+IOyE7HMzFj;%`jTe<{sVRPzv5M39w#o`k&?X(^)Vp z{`Dvs=URm}&(aSU^S_D;Df7QBT$rXe$-bKlqKDPzFHZ$By^(}4AGn%l-P_(P2%lH* z>;3ro2ZDJqaAS(HIs};0#r5^_{^{}U>fy13_LMty5t5&!W|c1AUHztD*bSbdi1fLP zLu;2w_~ygn>(WQy;qQ-6n?%XHi#mK9|IulU(jA4=$;I?3;=CnJ%W}0yZ)bea{_7sa zlljXU_o)vpn|`gI3bZkz-MgXS4rNWf__F?6Pul6j`zp^EsmV8Hw*Y@4|?{~|;mMRA+OZh*w zdcJo8sae)aZ(rJb%2&N>mf)zIU{!>ecG$>*BsBOX5Ht7tTe&QKNaa z`k?&y&S12-`Tb$_w0yso5%c+h>0DLlMm;Zefv&pE(N+BB+t;t(mE_^*Dk+9~5bN4l zOnK_o;#0Ka(so*gGN>$WWWH)F=|?Z)-vW-!I&@cxD+q_-mn{TcoIR-^dq$`lBj)qM z$}ua`Y4jp&bzqV1Qt5Y9TgW`SW*7Qy$B}CMAXc9KrmXtwpGJkYie)+hqiQi#v=kUTNP2 zkD(DnUElAktnV7PrB&DUZus7H>r4g?xBnS>W`zBb${Vi5P40jnn-MA>G%;s)lDVWd z_<4DIFR!B@zE~&%;^Ij@D*B)6Ka1*0aj7NWboK*!Th6n6ox|wU>h{(-IXZ9n*Wcum z{k1F);5db&t03}<1w3k^FHR_YwRl`^@qKAeoBs5!*hMaKFnEe*CJ-`iM9-jc>lpx< ztlllHy%}24UVIQ1Yp)Mw_WIkygS6S@K7yd|B7NReaHV4_;Pk)W7B~OUU5qgd(NWR^Dl>2*G8ui=L^08zBeJe&oQ(;H zptw+%iwDJhxNEfy(d>oabxt?i@#ERz>5Fqy{;Le(*tjpBTq^V0A#RhKu-s(y{AUm! zfBK|2fXj!)-Q%bA!`G>&&fP`U6_X}UQe%I)Xi+f_MHFK_uaIEgj6&)kPE zH|OY?M9u3-H_;RYQ@{VPK|H_tyu5UUhs#^wSZo{MQZx-bqn84OR_boyGhV*b#4Wz! zg=kKT{dl2SgYaf~ee&tU`su?rdAYU#-d)dTf6T0IS;H6bN1U~Itk#}i4DhSFPQdRE zU3>2(lkRu#_g_?TR+DyS8BlL(}Y7zQ0wwKnf;LuirE5K!w#^IAXwbr z-+p&&*X6oIxqiAGUDfaHGo?Soy0m?_qz%(U*Ws`$$XhFLQDfyQ`a{Vq8@Mkjgh$JN zu5Z8HEKBbA`bi=1x7%d4>6am+YjGyeyx~9=eccks~QVQP_@;Z|}b> z%K1w}K!qiSaTZ&-iE9Z`1&b`c-rq_;Aj#6@CFp0Y_eG-o$uaP^(mgmfJ1)|8Z-O8X zM#Yr9VI$GGnE8iCi8hj2?b}wI*TL2i6j?>I6ffPu;ilVYCkkE6`c`2Ja+hkxt3B0{U;A9j7}(MyF6z5b}N{$KA3s^ruP zw1d^kTZ~b*HAM2TbJ&xD);vE9PN8z?Lu$-C9pE1@%UgYf9xz@t_x*RiXY4asC<2?;MJC1BL?+hsLe7Mn4gfjAC5+0PH=C)-L(s3lS}1e(rrC{zx=v>_#ui3(l;?#&0Bf6V+q726)-M5N8}KwThnADg2PSSD&<$b zsXs3l_pe-DtCIp*M_!_`2%Ao?xSUPWa=3j|SURtG;F1A^IERs2c`n&B9c1or9iw=5 z5&1RyCRnU-m_8ulgwfY3y5mA&Zc5U2D(C1ga=`Y&m%#gb0Lf_*&32-KNk;VDn|drk zW6`By@!8{{*v1(4(%2UF7dk;=scc;C{|nZ*^?GJ?heFd;zMN-@=;(e5->r_s70>G{ zCq#aJfV&-^_B{6~2lkJ@(|c+3ipM*>jhwP@_B=y9(Tew!-fJk@j zYFkJca+>oXd;B6d%0DmHAJ*^J56er5n;sk68P2-fbfYT$_G3$`_^n%Uo%63>pC6P~ zoNMQq5F~D=O8Cs#HiyPId3T^3_0{&2HuVeyNo&zK_+14 zH$ z`*P%z^3J*K_}0a}e!u*(d}zPcQ%sayD=1yLtsgg>z+`(UAam}t9nbW>hqiW-?mjA- zmwA$9r(9plIB-*BNiNkod;>aX=~Qb>iIkpb(gTZem#gppwLrO_ z#U=MZs8pkvxqQWb`07?RR`H82@ITCCBRCU(_U-m*C4Y_OP4m|-BhRymr96|-ma|qE zz`XEs4?WJ)iVyxaA}vDQ@Kk+Vk%fVaz`vo-F^ zxVeJBg+x@-%*!>GFt_k&0W}Cpwfo{>@%7OKv%FtCJ*@ue^51a=+_oY0(R|5kIDrTr|bS#jbENXuw^jsdIzCaUEJum-{j)kx8CYPbV0x2 zjSwWxoyGaG)ZQW;{sD!AJI1es4`$;B5V?C-;FfIV_1qgT02yh9%|(6yyI;`wX7%W> zp}M0kvZos-8$ zbpQoxR7w|BCDn2nZQ-3htEGp~Q^EAGKCMA|4u3mq)2$2{G0P|!xi#)^8JIrYF5}Wy zTV>cGG`sNrb2R&6twi!Ap=7eH18VpPjd(FTUY@P2Sd+)tpOf6?g5{Hs)|x9?Uc8t? z3HkKC=nxktGF#B^osZg`>c&B*a+2yk=>zP^#{ATKDqsBrOo`!zjc4!xQ`%knrFf>F zQi6}%OkGw{7eG<4{KDMk6|RG9Z6Y7}F`daP@Sq^+SYL2d`ZyKg1tV6tjX>-T;3@*B zrEc1LSQ7#j9yPp!cR0Eo9c~YP-rf5edgPPr?8WfJ*8okAC&goM5g+!FI&JPRhn~bY zw(cMQQAS((YT>=%Uk+LaKo(EaOQDk7fle>d{(~N$biv67mtR)Cn~w$4_<@6}KxFac zc%JJW7udPqcjq|heT2rZZl=Vxr+2sCiy#sOhDmqobjmK#?fl`PcD1)b0)x4%L~wn- z_-FO?+gC5_YASB#SyAR3e)c&>(~^<6;rrxyWEQeX9ov$i*53J4x1 z-kJ9EZ;5%vwY_-UGp^#t#Xi$=eo*`~E#*hXK;wEUe0i2zi(+lcQmam<~=7Ao&;*Go1vxmj%DgrE8EN^e@cLUkbem}T{aS5LaA z4hc*YXFzm3TVY$7B`K)U=^eLiqYwcb#$@Nv(gkS_SUxDD-Uv!okqqBffRV!K3kM;G zGl)lhTg2Kny`-#nNCV~_2K;SDxAj`M<8ND?J226E?Tkl5bFH0*t9_SC&+j3H_b^s2 z(G99AGE>3t>xZ|u>%~)T@PXV*CCB^xS#31g#}KqL9wTm9)VeqJlz)Pp}pPn?|( zDCLaVb;CQP@MzCHESpB_gob@I0s_0G*l6#?8^uS4UDvYv(FE_7i$7nlzq!oFx_V9O zJRGC_54T@;Ld)&{7{M$V2jBedloqZYzb?)`qoo>|JI0Xs{pck!nad5A2#VD4&wsJyJLSleVu82j4R%j)d%cl;!oDXo{K3rW*W{=W z>OE%Epqwuu8T!|tc}Al%n_alVhpuef&AavA@0NcpT?FO*m(}%S#cLM)wwcqD0k>?W z4u-9i)<;)0Wqw}S7+Ct-H3Zh|ahEcW!I3f#J}I1ZrCN+G!PN6o%}Gg)-;|Nm7M0HO z=&IgwL*CtIi~eOXE2w8{bu*Bd=Cu9$Wfr6CiAB6~g+8q{8ANLJuAj2%WjfFnf@t;l zo3c}^AKongT3!1pj04T-G+(C=tIw;uA`7Bl@1uOV4>WTSDvwLyRQ}183oJA!9bV)I zT}SBr`p>?6e{{(~icqQx{jq$za0k(RXRNVz8q5v$b>^LD8IyVQPP3kA+C z6D?>bZ`#IlaiB{*k<;o#KpIueXQDZS)uW3+oPWJnsip>(dMN6VKkAtmyQG3mFECpm z$Gb<-#h05=89SDGor;Izexaf;*WceQzAJP8r z8_2oMm~JG3-I1Y4LK)X?1m)d$$>}#YsOwtpytT;D+Pb*YbKSq;1>d__>0}O;%kh0Ab%a(Pvy9^Ee22hKVEZLRbz1{$UV-sJ)eoXhAT{IF9m z&2})8nLzy7gOXp1foZY_z&^##o(hHE#{hkUjDy=W^P`EVa|H2yDl84%VX0|lF{yyC zD~aF8wA-<#130b(@3WvfsGOvyYVpO*9lozwrczw#amP2P=B=aQoL}YK-VT!1+WRJG zIg$)OquOz3-kQat&v;_C&uVst_hv&D)WgwtGYBvzZTQ!&Lh+~DZ;xL*a?$Qu4XYH7 z&knIWEUFzKbaB1DU)~h%FUvBRqhsRvyeKy7WqaRVZMKQPQfhWoB%G5xHU6SC7g%16 zcB=jM-kQ#0eezy#R2CpCytu21!xiwSnxX)K3NU*}FxBAlv{^15=FL>>Qw{Bsc)CK8 z=X&g2S^H*Qj&?PGUho%*@$1?EoAQh$l*bRmbsi@}*n!26yQ>ZKf}-c9>{0D;=P5^( zJLsKdc=3bn!)z~wuzifJg%KtuBgxJ3cKNha9@$bUQ0LU$70b&C9G*YyfOp%YdUNNY zd;s=uH~*Dg?1qu^1oFsc-@y-BSKk1I-?YzCPQmbmazk9-EsH$vpWc_n)V^=@oHv8_ z=Z@2lm;uRSJU>s68*@<4BxA$bxOrn=Ybd*3~50KRSpDb(*C?>p*ir}^@}&Y#y* z6juD8ELbRnZB{TpyS!3G&E}08tv?&9HhHcmpo48@_kOXN3zTZkJlQ*16-e?=rO@VA z^&6FS+l51%$d7-ENxbjT?5TKIv2jye;gQ)w$6vycUZ&;aHObBBmw z#2qwT+teP@xZS^30Pw;iCwrp~HSAF6OeLus08KBQ zwm@}&2|S>UR}1(H+~Ip~{vMQ`@X%g<${ixFr`zwauLDY$uYCm9J^~;fb1_NjZU5S| zIqTNa3OkU0yo0{*&hb#-eu+tTczyRlp<&P99#?hP1P3~?-5%F{;OWii-McT&Z9Z#HparRCHw6dxTL8EoDPO|u^m9{xrydreD$_bThn~82rAq^8e7yNm zzWFs)nSx1-#gq-9q^vehsrJk_ErBk4bt{i=g+RVv-zJppmtTKwnSEoHBjv|pp`dmH`6 zTcSU1$KJsug8%os>n1tcc6#kCdN~lAWNj=nWH)C0W(^{=KPpQJj6B2kARTD%wGSiB z7@{e#jOG|op^GUp+`U;mEi$K-aj~wg%iER*w!%PuJd5iu%bPMKiWbr3-RvXI7<$v* ztx2!Bb&>vKWs$BuLo2KN*71X6^>y)i=>Yp$bp<~!Z`>QADtvEd+RxDZMjpYd=TAbAUc|rxCq1_B>pNdpk!6#)n+Q4l?y2morR|J|N*3wtydm zF`igGnE5*7d3h`HiOs(OM*hS0Z&;DfoA<0}D_I*sKn9Gp105JJ>ag3io%tFz&VJDJ zP8UO@u;K6rf^uR-(w6OzEiLw4z2PEUIiC%*58H_TAq{sh`MR=&#V}##|ii7!F z|GcMQI(ZtN(X5Aw)?h+h~v#Mtg0C%yHy`Z}ep-HGaqTp$kN3lm0?YVmPF zP`*=(hsD>&vD16sj+_^`zmWj!X7xr6RDyANQ`Iou2^7T>(i&nMM3lRixXY1y36EN% z?6RAVK}PPUmlTa0tBX309OlSpSI>3>4h}MMCH-&5$iZ6B*}P{XhiR>;^~R1H%;$ec zA~7+$V}}5iXWS0DnXhr<1i-V7-3&3P`wQSr@?A^ERL;HEm8I`Jak?4j8ngGH0K$6g z5x#w`rFI_h{zKD?G8u&7si{}IH=ymUsfXSj&UBk67}XOe_8+fb!kA!ue0!!s3R$>3 zMNIj!)vMkYEy9imrXGKH+-O7Hm!T#YzqRsOteRltKK5pU;gOG<4qb>#tXI7^x-chO z55EVtbjp(Zk4@s`)=~G@-A`*=X}xfAp54N$__h__-QEARZJex5vC^9Lr4km>HXSPW z7|35yx9xVmxhwY|nJ5S&pch9*@wWAS7GvSm62ctJZo3`~H&H&mt;CpZWA>n_mTkn6L zp58C-etK6H&v9j09$HEX+rhCzTgYwo(OYSgm#@Bk`m}s#F2W6<+Ow;&uHv=~BK>2H zK(eg^A!HhRh|gAE?{D4e;jvKxfJT*pFe>3X|3?v5kILoy_S@a{lm7oPNI&2Hw7e^Z z{aAqJalShH2QsZdhzrMHQciC?sNKqJLQZrD4tn zK~2T%ns9FpSAbqyxw`)6pR3Qe>yL}utG^ZxSF5|#lbU~eclzr1-PP5})#87Cdj0xp z`Oo$8{^{yz@$q(fWLiSg64<6NGQGmsG|gtV$$l6GrdMP?w4DOG_8>Py&1|ok?G@WC z!V*$DdSaR)J5+4f029U*G;wBzPwXNR=w-K?VUFJ6dpLcOD$stp`VTqd^GY!lex0 zRt6!BXCW7a7IZ-f`-LkO%m4;63%+0mYnj1XX0R5x#{t~FfT&3X`-ox939K2eV35Fg zsYR*)5G?>43Xkl5!@#aD3@jdm0em~N_!rJBu7#0>eHg)b349B%3KM(2VQOI&0$~W@ zf`^FgL0XJsw*396snZa`~gZE$tq<#jpewJH&p1~cAfR0Ci8xhd# z=*Yq<0y-WYS@=bPy;~8``v~ZL1oSxqT#MlDM?iNYz`rQ5I2pm2M?fbdxcd>@=_t2! zBR;b8#&8}nysI&sQ4Hr11Fstg_AFz7eGKng4EHjQ?D@t(cVnQtG2Foz_`ew5o*3?1 z4EHStRxSo!E(V$%XO;(ZKfp1>VU;LH=aM+v;437l^dSX@isz9m506S!{) z+_wbyp#=D<(pK*Mt2Epj-c9NwNB zGzmHIf58zvAZoPKPLjN3In-!rv>NT+BdMgT|v1R)4Op%?@}qSZ)C0u5Ub02T%TkV`ev zn4m)o0^qdNXrF8W$=*i+2^(SdkU&RryO1VT6!E+IW1iBCy z5%mO24hcVJKre$CUF{jXOwwAx-e;skn*rk|^t6&fFauUYjX*?Ro}C!*K87cSm6BF2OW>VJ;7v*3%oBK1 zSea+{mcS#P04JA#QkNBXFb6!y3DE2W;Fo~0B?V=C3NmDRWV!Ja6dkBA1lBPHMMnzC zT2>fZdWwobU_?>*1`<&U_alY-k;0j$aONo($x`6mQ@9H$(7Fs%4;kFm9Fzn(&_7mM z**7HzsVoOtH&~Gc8iO2oT2?aIyH84{9Nv!{c%K~ZRu1<_iWmE+Nb6*8h!jk~dUhz7 zK$JQnsp$w<7Acr4ETjvsmIq0_0;sWZg9Ii84QtW-p zL72*chUdUw+dL(Hg zAhvorX-ojI9!ZOjqOTU|)ktFk+RKOoV|G|}U`MjJSW@2cL<57+@kGOp(3>-$gA0I4 zby#+Qj&>Pw?EBYY*`YHENuwBo_!oqPv>^yE>Iq020)-K81otQe1%Z0P5r@P^by$l4 zN+EE%(ue|nlGCFM8L;>fCJ*8(XJCaF{{fghBX*DUL1I+^bRE_WxN&Uqpfe)ZydVNq zj2eM1k>{KgyRi6}gp3#*1Oiel1*BODNDZP!SZ6|PegZB+0r_GD3E9*VA{PnK`Gjal zLUK<+bUp#?WsuNuB%lwF!5MHqfyY@r;owN;6OhtJjX;wV;2PBvs7*poPeM;mLQhXh zPfrTUGf83qkd)AdbRV+7!`03}XbUnhE2t638hJPc84>D?2z5q8m3UeiQ{XksY4PMV zq`(6>xST*ooUQy6=yST8!~_S#-Kr4?Ao09GP8T*OCW>@63b3#TCppf-Q;inE)M)8a zcmyx38tHSO-s(w90@*h_0&P`DUO?dyu;>y)VM*dj4YwAO?nLn=uy^9YLKJw3;R!K7 zg&3ZY7#=lRRFo;tQZO}I1e41Q>^%gNrdDJ@2T}*&5iG_o8c+b%1}lR{2~@N2qQENw zI0F`cU}oVV091pUhp})(FyV%wc8Fv#e2t0v(-B()2|%h1h@k}^&Jfh$s6~Poj~u-4 zrU0z)N`Mj(&D%g*F_sH7G9jFK2=D$3OgS^q2$HAP46geOSW@!HngK~8C#@OyAJ4!Y z0^_IPKF)wQp8+pOE?eZWg|Sj_ooAq3n}PXw1`NgwaGYcz5`{Q^%HFLAI1@CD1CB?a z+m1lBgJyN0tmH=)fm$a5t!)GvP?E+ zG3*!3{($2gvt)4tUcYb3AcK-bvn zVrfnexRC>H@r}_NW8LLpb|$|`9h7r-m)(M5GdI`Xm&sm$&NG;0IkcS z0W9|s>6$ux0ch{=B*>xx6JgQ~ZQh8(fxf3kD^bc50hWZ>GtdLLBh-bKL_r+rjT_Lx zaa0T3WLY!->!j5JfWQMIvya7iHNuX_RafyZ)DyTDX)NG4Lg3pK)j~@mc#?iVX;c6i z$QM_^Cb0M!;S$L@T@fgN$&_kB5h$?E89bhfK!MYo0sA4#3-ts6QMw{pCn;Si?}0pW zfCNQk2#Y|^rjRc<;+S;HF{zO$^goC}-xI_%drT%XwvxcxF4GAdTug+T(gy@F=sWCy zz|;c10Q(Q?Am-JcKA;XrKOi6g0RmM6NT*=Z149Ie3!tIEXh*UP5Rw7+EW^E}pdkI~ z?XmrUqb7|l#z-OofVB`35}hDo3aU$t!UPS9Zj{|GaT$O+vPi+VRtg9}9U1_~im{u( z{RN;U4M3}c*`46o;=mKTw-D|k1$WXjhMAnev=YKgkJ*^u@h3AsYX9IK%>eIbK!GVD zlb%C*_%J{PdH&(Hp-L<&3UltTQUJk)Q7*GNXZVt?P4s@416fg@4;BF4O zlN^k+IlMDDFuytAE@_)A=2{#8k^!z9063t_M3(Jo5zlY&3*3%j*C5h?g^TRYmLiY~ zAE*;CN6BFGG>OV^D5R?+CLNHCoG&<<+X5Z^WC2m-v}c)WFaeR8Nq!{eTls82o1KGA z%vKnpfQAs#EKzjx^eIFws*wqN29L!I9(mFgp$Qx^W(;PGL5N_}wiQ5#F(wt!3?2}U z(zYaI2Ex@0gpwJkjWNO-m=!W(GlOsM5l3^|eNd_sX7KG@h{!z%=)rKNANGNQfPGdX zQ0%e50CNBn96=On1j1wlPDT;v6FD`grMsB&6O=M6&{(*jnVp0jc!k*<4{L_ECkC}0 zM*0H|p?M$ZK@3Wn7#J9K0{~bJ6_DVr#-P=U2@k*y#KM(*Q#h@tJ&yzw{22WY%sjch zC!j3Al%&A6v73T@YZG`Y5)drd#Q|Ui3^WRufPW}-f|4--;|!-qwQp1cyb3w!4|c5p z#Ur`#lNUdxRt5S;PV@=jJ!e_4bTAC7S%Nb(Sf$orWdYzz z3i!h5Of9}pv_J~)5ob!U_l*J#FrxzSgsecYbD$dv(54KG6B*zErf-F}5tS5R-^@Un zn}KXF+;ztC*{BEsZ+(i#pm2-~jCdLFTp0-bs8|6dGN+-n{2!;GwYbZvX#rnAmd-%I zn~~`a-fni|fq8*P&&Zz~pmd^Yt22B0Hf34lmF zEqvw8WSLqu+MC zov4f;mfKV#07M=vMyI5nv`&y(l=l}7jyaAU2%9{l0KrI|CKV;% zJcU)sLja&ewr2GNoDbmvQ;J`joowlp!BCEIv`xZfQs1cp6<`Qioz)W{AA;DZo`CbD zuPfQ`VWEmBK??Fvkb(kHjWiK)Ybk^m$uAj* zKNUeyPe2CJ2dF2V5!ff?@>E|CbV&*8?A=eN?;0TCd7aAmrnC6Uw74B{#EIlz<3_9`zPU>)VFlime; z0ui8EK>D1PL{yPtwxr;J8%MPi)RQJ6Qb}bOlskkVPY6coDx`Cw&w;lIDJ`EG;T}}~kOB%uk%A$G zEvS)Z2T@40ANC#tN3EW;cw(X`mq$qTI+Vg1ZbwWE4>|Iv91cN=4vw^2`W$Wt6%Lj% z8zv&39983i9g(Mwdg7RHk0@znNS--rgo}{S%awrbEF@1Hr4I)TNx%;!q{t360+1=* zBP5NP*btaKB@U2OUdm|>NSo4IoYIv^iGGs5NJu3;)JU_FFp?5inGyp@#e753M9G8# zBt0d;Aq7c4Oz9p`fQza~!5NWvhI#@(GJ5#PK|`D-eNLF1(ZP|1C!~VE3R$Eb5v?O9 z3OSU+%SG-HAtkFUZi)>#&!E*3r5sweVDkn*bs`!Q!)Dlwm zc^TP&ROZA1QW_Qc)B{z_iGt-|t(MecPg9L{?`pKiF{4r|GxB^;2~vAu)oAywMw%Ut zL(-K!O-WZ4z12u#g6=|9-e{e`8c8^Vo>bshDJ|^PmKbLbZbsSJWgP`5kz6b(5cV$p zsga;18p7;UVs|E;0(=g%PQ~y5mqK`;XOb~sOgdspF`{@5ICm-;A`uplmdxTx5duKQ zs1rfNE?!%rM!-4}tChGB)=AZLXOzoCjc`U}D_2K2cZ>)ptGYg?brO1$_^%bg!C~w< zneX*EEgp0N>IpY)1`?m(K}!N7h3EPZ`Tu_DtDIjS{bdO@NwupoPF2#hjF`;5i7(#jmQ6ShRDGC(g z2p5*hd5Tt1PdZ|f^hLnnj1poCNvKywVfvg-lU!@052nwFDkgMrRA*G=6W+~)4vzE; z(lG-(NzWka3&e_CYm}7?9zIe&hczPl!d#PRtpmix- zgp~Ms%4MOa1C~U=9ty;Tdz66&QlYp25Xw)g_XN;}1aQ44fFT(@kyJ55j|?CK`ADcI zY?C}6^c(@`axi)-oi-pCMHZ+hP(?~>D#Hl%B*;^q3VjZc&*?aF!q1$@MNX1w4vMT9 z`CZ6>V<9gCj>RQ4+QrMNW67EtEtJ$q6Ty9tsIrF|?KKn|V)0Y);`ZFtNS}kERoT$t zbF#myr$xnxs;fnmbWM!_PZd!z5}$Y|IF10G30cYPjZj=oDpTFP)`B~-HsUu zP5K56*NX-1$Eh{&?6Mj&gH$u5dO z1Xd%Q5yd#DCr$)s6alvuQ63950xnVcz9^=Lk8)JV_zzDc1wN=Jpbg1!Dw6?(n&db+ z6kt!9h~P=~V)-M$g-w8`RlEz#PQ@Z3%B`nHnh3Oo@`eCpNC=n6W~!Vka1kg9Uzu0{ zKS>x-PXIERN7WOMHU%bMNg`=X&=$(SgT@5aT$B>|C8LJnhv8ybT#=)f4cOWJ3{J zpi3F(s6~Bg@$_zH#6VJXxJWW!G6{E44kBLF#@n7MVlKoTRq`8NZwS^eAtl+YQvax znhKewo-{k1rlOAFb2?&*7LO?{x*7q!$%HLMJ^`69gwiwWb6PxMh~fZYo1i&~skEk& zDZ>#{AwZ>A22`Ya8tRE-!og87a2YXZBEot31em>Bu!AZD)a_uT2CM>{0sz7*3wTF# z-mab)D0{8oWd+3y=vBa!0){?#5W!0fsTBS-10;wQ7 zv{{TMbr@;G?2&@T4d@?Gzkz6L$tGc+-8mo;$=enb^qg5B(pzL{0z6K@?*q3F77mav zfu#qA9?ZqSqJ#J3u#19uP~ZU$z*dOp4q9ofF$JuUDiv9D2WFKXNvicsub~R{*g1eP z;%vhfQ7IOSt{!G*0n`~@62!htin6wQ0~bX_Btt*TP6QzClbaeA1O|SM(!r458YP2K z;cc_#!I_x>hlqtBg*SP&kq;Z?l?g$-$M`jP`6&AgY1B!f&gD)lt)vt+=wJs=A{7AR z!p8Paqt61wuF|Zm~J_UFN&ID{}SPV*;n4W*ox>4qu7?@28xJf`ul7I@4 zoKq5@*%a+U*;Faogn~^dy-ErqC8=izmpcL9DvBMU94M3mh1^L}kU1&U2?d={rV`42 z%2`bRb^};YkK{3szOZ;60GzT9pr8qAlEK0!yfUgiXhUnLD*y4%a%d+zaJzVD8jPW#s+A(HC}aw)VN*g3Fv0GI~Jje#-?QiwRkeN$#Wiu$IY?+iRxDP|iB7Xm*- zuHobvo&#;qL1xI|PUk?!$$dPByU&FSE$^Mf`%BsNxJaSphscRQMYMsDC3o!L2)5FZ zGoGwENAMCT#~IB|JfFSpVDtr}3fMP+4IyKlWd_KeVS9mKg%T5(O4$ZsrwD)>C))z+ zSnYU96JWR!@YFzgg0T8x|o9Y6W-GDm39PVoW;1`)ja$ms#+BWG$m z9_XLs_H6rsu9yNFBY3s2@*C*eBG3Vo-zw`wEw#du(qJ0qQqh(>VEw1%Xef_T3@&XH zMi~S7!OChNaWdCw&ys>2QO61yFes-Ha+qLRr)=L8k(dCnPJobNbuZ*tt+a|Z z?+n{C?D=B3cCa0xBm`1CCDS6maJFe!4Ot5Jh}^%)`(K@*2+} zbdJJ&xfH#nf8<)uRmI?2(2i3ia1NFUu1IEiQAz^FRmvS+_Je!f<=o5CQ3am)YV910w1bk9QIsOU%#&f8_71|8%-x{;vgkkrU(1b8Z4tc83>=?Yjp<-=5h5I|bePAlRHKu4)BlA`0rJ%l))17yXI4Go;7DVyEG$4+DE(tsqgr6}zJuxv7Wq%63WQ)Wu-S^G0Hh`BfqK&3 zfh|;31;9`8Z&6R63<>D6RDS`^Jpu8mtEvK!wFD%ojtU6$^dv;A$jMy6DKtB%^;K#C zfJ};W)k=VaBbBoXD8Ms8=?YaV0q#4wugfVB?h(1JgekGv$#qa+V=!Geb&qp+-1&5|$NQ1W?Kd!6@6IDhtr(V3|>L z67=L61faxJ{xJHS7)VNpp&A5m9F&AmY#pFCd7`MY005cfVsVAklc1E7AeIAHDgM!- zq8jZ)YP3{QMFi+`Kt+`XpwEF=sWgB+BQ;uLrG)>M+H_O_fNLm@7{;WqZq*C0r>RDm zozfMmr$rmF-ZVSNn=`7-r$&Gh1!tPd?y z{0un!olh3 zg1v)=M-m%Mgl_dDMJg>KOhjc3B?SVM#uPgMOjh!AyG;@U<-Pb7I8%L26`W$XY zM5HnT*F9Ahpml;&uAT%>urPL2E1-$MZm2pWG!gK$>Iv77BBe!F;2J7VrKJp%_EVqJ z8G)#-p0s$PV9HZTv(t`11F2lIv?F?YC_Sk@ryYTN`iwG>s*x5?%n6mqln#$(2b-yS z5wiy!}6BDhYJg8Dt!rr+;2hpXN=n`q7RN#XqBErH2 zK8UcyL|CY1sFbfjmney=dIHWIcvz3d@o<8s4J>0ydOZ13*WmJf+O0+37U76bPLrWl&JMYnq5&goMsLA?i&U zGo{c51fx2nDjEXkPA;x9@>5kK5SD~wE^;?LOeGO|OeyJum|q|llqpw%tZ;CYDYv6O z2q@gdP{SFK7mc`VxLoA2II5Beyd9*4leGknm~z!BKm&F}S~#V$0j#62Foglr-a##? zbnGxDITxyE2<(VlR#XZEW~XGc5<6&2BB~w5IOucI8s&sbIpGr3@=$UhJCP(IEA^<+ zo~Fbji#BSco?sPHfp>e4)JUHL2dIoiw0HorN`cUhKrU7(5c^ChG>EndSf`%wIfaBt z;Da$q;ijGzlO-C`L_p^y+gY-vMvKXcb^<7o8ck9lK%U$oBn85ll>bapAOM6ES&{;& zC(vX`fz%Up7ZMEt>t?{yN?wG$Qxu%CVgcmI_dq=@8`Dvt17t4M$bfBZ1BEk?- z=BRW9Tv*basPqINElK4O2G6Nbgpp-bx&jtY@}>l6`W)0#9Tg>LnMHDBb>?W{HiXKu=05b93>Iv5n%S@18x=KO- zsmwtC*-<E56|QC&RI0D2C>hgl zaB@BnKQNs%&|o>I+j-&jVJCEZIY|&hzj9#QL%0?s!;#-W2#hNy0JLX5JlUUR`{YAr z;RmFh(o@Un$9&5vRxF%JkR&H`P5@|OAj7m>3+bJKz{$J_-@@L2pvm}Rza<4L$g?wG zbI=C@NTf8_c3ybIf0WEm#nau0tTf$iwBaI%zh=XK$|^Z zNfFS`;%)?Rmb75M1v`?eX4!tA!X?us87aw17z3S*LAoQMp3HHWjt0(ygm3awCwV*u zMID*kNNgu>^cZlLe9>d#SV6WY`yH9@$m2W#Ct*&5V{wg&Kax8{rdn6OllEC<)AYfV&C==wq zZRK3qh+y&Br+F&X6F&!dQed(qI@mka8B|ZpG^i1v6o3XyL()1yLo0`L+9s&Qv?5v( zsD>12O=FVCMhvPK2It5fpC>V-kKUI+uFV>>z~6 zsEa)bARsp>EhqsQtmM+dU{5*@VCto?At=Ffs-A$KR5waJ33TwJswY8-E|+54;5dK< z4oKctBYsZD0csxAs{phiLI1PX^&sYluoT?C3! z59Ce?vlC6G&~<%II|5~adeSyQeX5>tnq*H`r4iaYnCH|JND#%dtIi(~)frs`3eC{x zaEmFnLYh+o9oWL8Po@+Q)Dr+gS$tIw22e2q zTY$<4Q%}Nqxkp&^mL~)?5VOx9n_Pc1crcsv}j6GM4y9)fJ&RfH6&jb^`ylU z&XYncNJzXQ4;F>Y0=Y?k5=Siz3>lZBvbjK2p0G{M1F6$YLNvVL< z6L6j~GpHwALvk#UosMQFAX5$peGc%XdV{iE16kwzlk`laU`$h5NE(wkfAU?IU<$8x zO8k6Eyf?YZC|4u_gcKU&(5_sObZ|ucGdkjq43L0|GLUGl2F^3^}=SsWzbfT)84Gt?Ni23EEfnw5X`8 zk~9&p2XYCwjD*}D?A=tOy&cMzU{O(x_8Ll$1xxD4)(Eqc`ZOd}ry2nuoP!aNR$4UJ z5oc=zOqRaQzJ_W9fRHnlG;@Fq0m!iGX|IeLX(CV%N!v%;1jbDMEHoyarqIra7;7fCKYX0z8SdMBkZSU%5oXUoEg4d|4mHA(s05?3;lb_T z6nVrNWnhNj)N>RbtDdmUoES)QVF<~GL5*-XsZfV<+`-;+dN(N!Hza97jkF`;!8k=8 z2x2Pb40MSy&nuZ8?FhUe)f1k`oako`^1E{J!G+}neZ;NhL|DkXL#g~|?_iHpPr!Nd z4pHPKjS0SHAxS;T?`KJ+8ZG42XrZJ=%g?LPqK&M1G$s(M*%4UT)Mx>s?1Gj6s?h>O zjrJa?k;Vk>Li`Tx9TWxXNqYxU*^%227)UWz1Z2QEaa*)^Krr>By@Q%pnH6bFkUP|q z#st-eB7y1SRnHQBMLL@C?cTNqZ+sOI`|HX(0(pAUG&7BjC~u_)qo3F=_F@sY+G` zoF_Mfu6&8GPVy7zNI3`=F$v|gBzktq`mYEYK!%8rLD>!LJ?h8=NK2wun_L2vppPb^ z_nqYTuDp40izCnl&8TFt8fi(OEmYb)f+yjpVuLL_DSAXsNdQm9$HM1Cf?_ZxD*A~& zCtfioIv*3SNV*I8Nx_XHHv>6O(UOP*BrS(3gaG7YI^r0dn)Eqf2nDSucO2}9EZ|D% z2J|x_;!oKgq(!68iT9=&$;#da2u9&1>In#z5ag){g1pISA~5(W&l{W(6-!o60x}&j z)k{{89h_!DTskL|qgzZxla)}8&WN5K%3q<+X`3KgDlZP)4op&)5NAbUJPI*{gQM&j z>IoP^6^i9W2uGX}6P40MND1eu{Dhnk;fPc43sR0dT0CJ$3jT`nVFdPoLX4CmkCp_g zIpr>b)5N@aDKWZK(n4;P0Qrobi3}9iN^T8M%1A1wqLAXYXm-#i�t@_%iw&+@F+M z8+vlyJW`TSxn0G^!Zqy3um>_MDe>f{O6#OIj`Vd3&85$Y_ofIbWe^9tloMH_k`_w4 zN1qd6q4X@OLuGMEjTXpC&1Elw8tpw&BaI0MCw|;6UX3(6P#a}Wr`dsxkt?y4B9$JH zCIaVGr3a*S0<}@rK8tlq({AaK9GL;0BeM2^_%AMQR!>?dxMj+X8X!+q z9pxMiW0LM7l4aWP$!Y{#BHe|O{sBCx+@X5Hxyy71vje{*OD5n_2=r6wEh$0sx zRl}H^MS;kLlHA!Hk+nL)>;;&sZKCBCkdgS1UTh6psJ%I*)JQ}%VK1Yn(% z|6D!c#*w@!jRMUMZ?Sp;x#&oE2-KTQ?K)wgA(V4LJ!y7uZs|ykNcWutTj3XA9Z9=V zvCxvhHldz$9AL0ePoPU3i5UrW^cqqb!LAgJKyfPVhQ>Z6FiQbM3 zbZZKFqlt)D%s_JzWkmeR+eg)AXd=4BIT)rRlHb(`m`p-_MD9AObpuz1(¬9C1!Z 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%0D;h-u+t`B1?RUv0r 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
    `%lpg=D+w6I*<<5dTb zH?*RWG(4WzdU!l>!5(iKM^wyuG10=_W@vG_u(y$1c*~DyVQ(|ExW07QO4?;E+YI(h z(xH!M(t)WSo+;P0=9w~s@ytO7&os1PLk>EOzKIqdeH&V_ZVk^QwjQ2IT(D=F#t{{> zRz|e2XBt{uF6@~k7xqk|g+0^I;`+j#NpfM&B-%cnNhi)A&kQ|HzDG{S_~}H~eNlYZ zOQwr8z@fkSwWXVsP}-~z%iigUp~P7dBmP+-7W==keMNOeJTwU}s_G_!T-57E?J4SJ zK5%6kA92!BGBR2%i4ixg5O>fSanw>WGGZ->5m&7cchDJe*5I*P@`D$2 z<+O;R_`-R}|6!MIpAuz$H2=Q(d=phq#TbJML@5x_$@D|E$#(fNRIOSy-@xNPH^tA5 zZQ$#CUu)iasTy7!_lM&7cA0Jnpr-9f%0=N-Qh}_n``t{Zf>ZR(X(YE%Y=4@NLj!kB!E#GB7@@00Lt+ORrb*)>x4OsKO zdpbVfZ_<2S>s2GCEWAjUPxgeT_rXMc%vbrJ*~@*A?p6$h?fEy`ZM;0G^~B9OeW~|5 zP$Azs(F*xO+oQ1xIf~W_c`00lyo{C#`DRxX7q;2%@N%2g{ABpdhk;# z`;RRgX`yQLm>s@l+4oiYqPZ{g`%5)665rWh_W!e3{6}O-G)|SnJM-+XO@6q`>Um(~ zfBteT^MtECYn+Q6-&oi#OHS zGP=ulF2a>;r^wS@T8&GdnU71JqEe4aT=Jz{T=M1du;WWx;)sgIj626!^GYu-=9QiW za3Lo~b|H_~a3Np7xsX?eH*^<726x5xY-1ecdiH-uia+EI)eur8n52|<9@%0w*shQJ z%l|v3>uPXSRS`-(=Npk|yv`mDw@>-QL6A1tksm{pg9@dN)RFqnPpAyV*ecJIj!gBL z!tt`8(9gB(@JDLnPeiR@{;=Tq#@TwGv8BUR!Iq6T$Mu>mo&0>F*vl4=9*P}XIHCNX zerJny4mywx@Y3hU%_@7yH<=v`M4DvwaNI20EOole4#(YwRbqVDwJ0!oAPeU88*Q?m ztYkIFS2X>~A99ybBI-}qIVHo?j`t(w^L<8R&{lg{6?SwQ;U-Iaeoi@ynbVMQLlg3h zwM8{pu8V!vN@JwF-O;#%!*NpDX_Qt*lYDmr@kn)4V$_kS1_v4vv`33c)*hOMTEr)6 z*jBRnMxs!Ib@7-l)3uhxgoBxm6>afC4NRsqf3d@LNk-p zojaV*Y-FFi`tTHrGU0xI_mpmkMmG+p@yye41Zs9lfPZat8t22Snmtkorw|1ID^;Q8 zz=v7!V9NXeeEc_MXQ=Y zU(?Wizo&i-epF-kYgiZG{nIxly}#WRDa{aRF|sy0OWy2XHp{=ZD{ZBr;OPZ<%VWl} zHp`Q7gXJP!ukR@>g`x)^kLyF;oGh9tM5soRTy03TtzCd7Tinokk{??8woPVnqT6iu zqh77q1&zp7Wczx({bQs_s9q<6+jUA)WgXo-)=+&cj-=A+E6sVIGu`aA*6*n6^b)0| z_9nsix~JfJ-Ia&E?wR7f?n}8|_vMjZ_eDK=m1hl_qT0EhrC|uJpuN{U5zy-%i0ySx z!1cN-2Ydain+_#|UA8UAGLAbMARa#5UjEQq3AB(hH2?ZyO0%6YtgAju9!ZUy|GOAZ z52GE5EiKz@)5G%Vx+u09HTmCTe(=5+fcE8g0VWw<7eBAFAKBXM6y?i3x#%JL6)yP> zM|G+jYMk5UF5e!$WHd?H)x30=)ERDzhr>@AZAZz~=<1mQ<4yi6Tfa*WcFgV_c5ce_ z%slX8HT5Ey^6@7M(?2q%boAlsy(x
    5cz&bNPWS9o>9l3uju-2R|L~RZt_lX%#P= zyrWh4+ozNg#wD#;*O%J|AJ*}L`9-nIqTS|veEuKMUcQ( zXg{e~rR$O-I-Z=A#qV}$V-F@7=wE3Xpp8|>h?LeP!dwZEs39fay-B)_ZB?d1iDkLk zq%>~$ksn^dJnaWcqYDZyhq4M`^%K80_`X;k_jfxQ6YTb0doMw~+3kv-Z;ywATb}aX zJE{KW`X~6!OBhiT{nT3tRR&);{(~aJZk=zw$4ZrnHqjD_4BM#0!5ziv7)x?TduVYj zhIh1ubf4}bY%{NYkoDug(ook`)wKAYmT`g>=gQqgwaJ~RrOrE>!!<2+iiX2?`Ob`JUoLFh?)9*O_O)wX;!GN*cNU$fhI~Dk4s=M& zf;~+^ev-S@V7(Yaa*cL=Rnt=Jn@vuqjr@efH`gglzomK1 zN{`p}hg~Ha`+!p+Jko@y9_|{&O6lRrAGB_?uF)o=Qm2o_kL;P;^qU@?*2vVDbXn4I zf_#(Sq?@dEjAQg+R~)(17b7#Hd`IC~OE=u#a$5QL8TRt5NoEOrVW!4*Y-MnDULKyr^;u$I;BeP(tG+bk`ZW2FulLeR<@|Y=t|?t&$I_@ zi(MEGl%g5UcN#^!&l=`YDOr3?!fs_#9SuZFd5f?1tg3GV6&Bjdqh;abW41X`o#N`N z#1+%Psix`trq~|0x|j^!oJFgNaONh`xgH!+H?Pf9<)R>?A?G<{G`-68Dv9o{J#GD$ z2)B)sE;4&ydur;@Zi-xc+Tlqhw}*6hpz|t`)D)q<(7Pfa_2im{iFbvlg8JWMy3(gH zmNN15;&^|e^Ui&Wn>uzkMwe<}leR95uN!u3$Yk`EhEiF&@n;>%J_;(E46XM_RFvK5 zv`#yfnhNDZU)~JA$&ii%QAF|-jJ8S-BidI}W)BBniO?5{!gy@B9 zT1MaR>%nGXwGW$iK;dbf{XwUtxDaZBn;jQ4uuM#e9Z0PdB=hTR^LTioh((Kpv_D5n znG{E9rMtO^sb+3$t@HkSBBkSFb$#vNTNBh8s7pE?Nhqa959 zpAvPj(zOJd1e(Q}+Tg*{1~L;mmSE-t5w-kSqFS|^loq*b6wOn!HR%yrBRcvYLi|Z zMy6&o38$g2UbNqC^UY&<=Co{-+6GHtrD_~4EqUJ_?qWk_ zxn5M3G}eoJNn}~b7sZx^$}(zJv#M2D)bM4e9(h}xWBTH9J*2X5;mgW}i_@Uf70Cm! z_<-0;#zwep)XfntPaTYKc{0@;;qt`H2-kN+ZJEf+DO>ck6y%CpmuehMWQ?ZfI!(IO zo49d{6t$6o*VQby=+QwLOM+-0jt)Ij(h?4tHwTKk`V?^&?*xUyJai z(y~!yK_ZN<0xb6HohpnZsSU8D>I&_WsDT&Znwzd z`NBfC$l?o`MHXMoFS5wfb#^lBgiG^tPu4y^FR5DR=e|C%`L`?)TVJ5tC&?HP~vtYB= z3y!pLU^gw^q%}Nf|efbVuCs%Vbb4j+zOkEeOu8oFl`Z zpQ*?gWxw)+nX=J(CM{5q4(c-a$sM)fl;|eF=XH~K^)l_sZy>mqa_veQ(y?N5r@J=T z@##OgxS>PP`hS|#TtuP6y>@fmpDki&l7yCs-qDE@I*@lk2j!2uTiTbQYk5B|#|PTZ zF?YktHSgr#&+Djo6_j)odVNeop&lwEEsS;R^P0C;o7WA z=)LREdS|w@=^P#)&hATDcAt6F&;n3YIMAkvq7y9J7d`bp?y}1-e}1}M%*%=TRepJS zJ6hy)Svnbfrqf4s3WL@}?0(E6Jqi+}q}P}HHKFaVoPwJFyYRZRrT~2P-t&TKlxL=jpKqs zGV~ksdeNVws@$Z$Sm*lOxVA&V3T_ul-M-M140K9EkNwW->@LD&y#}9u(j6%}9Z4f3 zifU?7(eta`wZ5cZ>G0?A`T6ByN9Pvk#@{U+Jkz&4=s#z~1C932q02RI*7V%kbd%Uk zLo!&p$@iKX$`VBlY0^x`Sj=Nk`Yc=3XU^2Lr({uMeL{vZ^!+QU+Et{eW1{F3g3fld zkNS#w_7N-U+VJ2Yy#CJ6@hZS_eJ3C39?NT5y6PrT)G!%bU45Yq6FSWDn#R*zs;Ft* zcIKtxzcc5&0;*Wk#9Z8?L$fp;PtEy=*X)|!!ezY&_Mxp;4n*ChikhmqekIP0T5mIY zfOe?n&aN< zJyXrDB4r&-fVFRep4-DVSOc;|t!U+*!hX3eORJ&g;gd5PuZL7oQ&oL)*&k9rQ_s#a zWi4w1-HI>%#=-0>pmwfltSyz@Z}AU*ACBAKIvR^u%qwcty@hNhzWQw2!|YT3Mx$^M z?N#7??o@Q>b7!|dF6darKHDd%{3SrL8*uI*OgAo{#Uos1WyIsqX6C(qih^#*o0sOl z(bo^?NR-_R_M5rq2$6fduk>@{*gt{W*2mFy@7K`S=%_K(>s#aB>2SYW$JevZvj-?> z)mwph3)Bb5UEJ~BFIXSP(WA{`qF&vByMkbCMTb6i8~0>pxyjw=t15PtMa!K8X?bo3 zoekm}KQjEPHIZxmWNtqwq7S>$VGDf##lB4U#awR>;v7ONH{|GB`lEu=8k2$5UDZXN zs2!b>dwl#_?C$gZE9%%os;H?Nzh9^JGgs~@!E=qTlR!YfGHJe+eq96t`n|~?9$vAN z)wqj5S--?CqVDWbr*k_OmxgO5AJakn*J~zA6E#a}+qW);o!NFhq>7r>XBcq|MVG|v z*QDOA3wjLsH%=%1S%t**ao_r**M9c)MBgiQr8|n#MXac+%e6MjeWQbjuW*dgj&NX+ zqK@v1kXE2=%U4=px8ED=C|K547?zyt(r1Vlbr0;}b?mmQNLfca(zM<7y6fAxOj*m? z`nKD2vk1R48omy&ADkzHa0u*TMs?A$g+y#MhWA{Ti7VYEm8-AwiMIMyNIKW|bzH9A zih$IzzN$K>qQ0)w#;=3W)5zvSk9OV_(#SPtnAaQ^wTbn0p3}T3V#l?g#hO*< z+faeZfRd{EN4iN%sr(G-4_FGQKOo8LPhWYY>0qP>8U94T0VW(A(OitOq?R;?|5SI+vA+mdZ71u(hdzRI8IfuOHoAbyah@KBIf@^d*>7 zP3Ws}D>}Avn?IVft^3O_G-o*-z|()JF+CAW$98Yhd}l8ATwczf)4z)y@m23_>DRel z8z$eJV0=%}R3lsnh&WLjjc=9s)j~aGV*t+VyFOysI!A1@A-_V?z0R-WhMZ1qO>+Zpv!aCfC+8Y-RtZuL|g8hG4O` z6WjaiHy4Y=*UK-rSD!yEZtuQaefsb}3;*k-6EjNw7_GPFLe>|RFE_vH77tIb1k@pRmLr-xGL4G4N2qE(-aOmDT2O*NTHW)NL6o2$R7`)X)%)26ItG zLpW1&QAagdJgn)}>xH}XvJiDp(;CM}tY3pg*(a=8+OElB>+FpzX33M)?%|ND%lziy zMqevF>|UO<@#8$h!!`#v($)RrWlsOOdAL=J>VGeB2}6=l;lCUm(xdsDm7p$x$5=tV zMtVo4~T=Scf+sA;_l6dS{&5ll}f0&RznIc ztBW^xmnPPjF_#LylK%IlQnbOh))!*wDO_FaGCj;qxT6Pu^@r_>o%yiS=#zds$dLIx zS4Xx!KIR*J0Y0T$Oi>C>kl%20-vn|W_>2)Fk)UmWI zr@P%%&6tl2&HN5>l=y6PXRgeH5@ytAU-3N)sV%=Foy%qBN~3AmpaNL{JQH- z4`i8zI_`Wwec6s4B-v#v^I3rU803}3)=bbFoLm14Ek^8M6}QbZpB?BdRMay`tPho6 z&ADBs^fk=$@5uC#D{5Qc7*pdvH}pZ%Qy5SK`)~b->u+5G{znv%+oKM9_IZg;0%iT` zOY~D`ZSG3|`Y{e24S&}&9j^#4*F6H(7A=8@O|OfZgy%n`VBRum2`QqE$<(}ok=v6Z zWtO+kz@2ML{e_EqtJtuFrvLhYk{P00eLhv@+(v&btbVmRw-=&K)hblhv+mW^`{|CoEUJ+iddj#y{1>V+XV%GXzO|aPV zuUeHeJLtFRBK2c^tu`@hwZSK7UaMzc5vq4zzmg9BQ1Ac$L%Z?=6Rkr)Z&*>ESN6Lf zk&n*Bf_H;j>|Po4%pN)qz_$%;#?!anH}UIQ^wokV{n%0X8jM@l9uAu0d-{cLr5|4O z?n#iHFk(=$Qf8)NKP%G-rpYPxqojE#^2|PcJ+QOu)#_QmU|p(8t9);rezB>!4=C0z z&U$A5bQdb?IW-H6U$PColTQcLK5zF4J*i**<==3mLCo^_D$k9n*F`M*swq~DU5KzJ zem;jWA*M%V$+gl3fsaSn7#tT)A`I1~-8xRM9%J-A*W8*-%4yz))Y?ODR;$zNcybTX zy~7v--_&}mef!c0g5hYvm|oB~%6FYWIF=TagsQF+BE4S=G*pDTMfT`jMqkUorAO&o zer`b^XsDce%zW54397MIi=sbGuVvk^m>qA z(tkbO{87^KgW|Q3oIg+#9m)AZyI^Biy5eUx=`roivUsNa^o~wm(-&Vd`pQ%72&cW| zb@z09zTc$zy8P;s*s<=}ywh-!JmD1E^ zOszs?J?p^~Z=c_|eG#pAyx00_CAXB_&nPXYwcU}<>>^LruHKI|>DHHY(EhFI@Ab71 zTOz4GXLIYmv-o=9ufKFra~e}W&{d|)yhi&_?4Hjyu}%X0^dK2k6USfMcXSfYt_}tB zFNw?#6Kf`*#@G6mg|}~O@)=*{u(v@8_mmX@JnLJ+^(f87DberpM+1VCy=VHw>(Z*ChnxhC+D}for zHiRUd*=lEF_;%u(Kd`s>Qmz~03o^t8YvDh$nR-et8>cle4~IIY8JqI1TBd}k&%TN@ zxi!y*Ik(aOQ3ZV82$Rx;JEmXt`H8*18(6v;T>je9&5}JGSe^PSaO2A#>H28C_13eE2f_?f%EJ7XSr4}?{#$tqpfM6|ss!oC{XjaN7MHXGmQVb!?`cakS+r-t9s z{GdN5Yo2O2SGg|YWZh=p$eotyZl&)z(*IuJ2(0QVQ`B<$pM0zJo4!4gw&w??PVz+U z>SrkH(nsV+&%bjC;&l}e>mP?ZGrx8h3hQ~U1OC6wz3X=4ILe!Y?l9TdW{r7+enUW}xG9AA&YfV>7kst_yAP9nhLah~!6`Llm zVFNHbxBJR`g@;=AT=u_;1x=0YXgFA@5RAV5`{tg`C8X0PsYreUy*CQIO+g34wqrde ztgoVZfwwqj9S7}$fm`ury??Ei*UM-{ImhDk3k42Ouzo<=V)$Q?%|2G4Z>XvgnNMEX1G z40nZT$8s#NJfe=yI)b$0I3)Xqz))DjedTZ`fOh;QDnY_Asn{8)9nS&XvcKRl_Y`>? zBL7oP7kGB;C?YFPwzwxb5_+8gTJhW4J$<)aM@UwT20ym(!WS7k5Gx)`1_Br9L44Py zGcYS&qla+4K%h%cj9kE2abdlS_=S?gzxZ2donbj(MUwS4c{vJJjcT|0?8$>&Xn&NU4dn&>iW5}**iygm_9^LvV?AHyV z9mD!{t2YyN1Zl^SsrRzeBPeOk!0dPh=TBLlhV%SO{G51`%^jNZ8|vakqa1t&zoI9d zzjYrXWNoZ}w3DIQ%2U6nVbKOpk%FDUt!4jkXo}niA`q@b-}L>GUEj0d`xGr7qW^4R zpTF+Umpl${VJPa@u5ebepwk?o*3_XlYniZdp=#-luZe3~D_Oaxv2`1M#q>1O@gTSb zH?`YWY0X#%h8v$YFFDWQc|b1)Il0`XDQ@=!p7I8{BoCTv6t3Uj@r*4>9}{5}!wSTE zH~58Q3=WCm{Eb@}r9Da~+rYgYEz>z763>?*JQ?TQ4i^!uJr^7Unp(O+2Vf;%$GU@} zokwIm@Z(rYZ*fi=!+P8gJcwscNbf-=yS%4gqjPakiVJ1YSy zHQQjqoX)jHJIr#;7MOiJwYP%XS89R8*j19>Au0_yby`6hYP-S?n6_GB+_bHa;dG8* zIb&Nj#pfl=TKh5}Z0gHUt+g-2$>2s?FNBRiTrpwey^H@rSTq7?!2oXamp$~z4; zYi1wTdq}{N+~&mwO3+Cgn9wEu8vMPTN32uRQM`Un-Xfmvht0%{i`+l`_b_E=!kt-l zcb>lBrf-tJ#@WpRx{}g6{%?A=D-^Ay2-yBT$Ri^4AIU?uo&JY(S|}*3!(juwReC;$ zQuwmwUTQQsg$B~vbixma9UJLNO_|GE`!b`cmQrie3YwnNuR-%YeYj%X){o;PYx;p8 zx)bGC@PIce`Sdk@#;(?7w$6l_ptiyyJck=&u|c_cm!1tMyN$IGWw+)=l--)L+vxca zBG=ow_19OL5xg9_O{=M;Tc17XSTVhG>egYcnQL!{$TQZfib1#D5Wi?G1{c<1HMOpB zW@_oyXK)ecA8@4k7d*H-txQ8hw;q}7@vdWs^>%LkDMZiLi^E2!HFWEd;m$IKe^TcW z*4nxC7sz%RqUv#IJKGohCxTcnF zeU5MO(&5k{v!>Q=eIs?Q?7P!oYt7tx8$Rwf(f1_hGn;jqT4rwR)^9-l9@43yp<9pa zz){xQIrVpTz~CxvocalRdyVVInsoB0oAhe~;Do^$f)sC;NhjW^v~lZ4n6bL`Q*Ptb z59=u_RHv@$&D?rp-=hzu^>$KQ)mfS1$9HL1>rkF=Ea%DKCCYIjoF_R}ESPk?4%%_7V`%aSytIuDvTQW9c9R@~3+QHV2X$<0 z>elPe#Dr^4LB}H(+-&JTleM<4PFy z^rmjT2DdTH0pao|qFHq!u%V%2kJ4ZLk{nUGOleSS=%negQaeU^FYlUjR7Y*s36|TM zp8Ruq_q{6(Dvg}Rzi;C=b}Jmmaesq{cIR=I8@Y|UXyZ9<8yvTBGx@%=>(J}%oJL=2 z=0^Y*P>wX{aY5CY1l4A46wq3E62K10ar{i|rkx2;Yv)D*y_qKo96-6zpo7HcRpm&V zT~w9B;Bj6qNbf&8Fg054?l6X;ABXS(g)L>qd7R;F^en?L@`BR1yET&gDsObA_k@_W zuSwZ+iC1D;rFy@OAoPCfAoQ;#5aO!V(vMzAhg7GW1(4>sqVAF#s3`#Hot4nm0X0?< z{>T;r~qVg0)6za}_CHD4u7);tVFyC&Ufho#PD$ zoMs~m^GOz~nTia1%?6148dE&XJeeorp~H9XL3JDSUt?IgWYC_gXiYgx3Qs^$iS_@x zjGsvP%r@aXx@Ch5rk8j=ds@yGQ8wpzH&pG*stf0u8ceGo9Zml{4~8S(XA&-8thn^Q zT@8H^vBI!oF?yJuBejVyA}(O8xSYYV^YJClyk9rE0kY!52J$&s9A!s&lGg>E6+0v@ z+iaG&%O_*W9#P+!JOr#2*J@Zo3VOCkD0nFaw1utbl(w>C^=%(DqfyE*{J!(ToPpW# zs@@LipeJHR=mF&^C*{Z}DAjesjXsZXVP(PeHB52SES|>eTW4z}D>WNix4ASHSC7p~ z|3PrA*g|cA6^ubQ!9Ox@h$o_5LE7eq4ZkJt5s%0%rGq|MHPNAeY@%5MNU2?!LCTL! zAOlKAc$Ypzs}^JrYb<*Xpvz;DhrF=+e-DjmC~k$p5*NcQfl*zy~WGrH@I(wFXG^)J_OLi)7YJjz`gLIN-uF+De%|`<84G>t*p183R^4O*Z8PdO=2;905)6-pG?q zejQlxXJb8)z;qeD`-c(f2-1$@nU3SPFvI1DFIibvm{u%7-Fp6Gvmmcv-&tVp z(CnC11g1A`UErx*6^S3IgBZIXg7v7Q%yjp;_N2F)i7WRqAt~ zOUhb>xyajrumBI!-mD(7&P`% zDQ2#|GqB!XQkLd{^6Tw0+}vXa7qJ{ll?=OA9iUQ9+W=ZQzY!f@x!#0T8(b^4HoCL{ zcR1+zfG>E#umRWSPC0nERJK#a2E~^wKJW{=Oek_ERvKm3-j&v=B1Ur!wUX-+GHBY1 z$z*aYL3zYZ_KS9}NRc>PHRBJ zn_5TdNzqTJXpHgvZ3aR$ewTb__zt0m&65MnOkCKZiIwgKSiY)OSCER5Ohf_U<5t>3 zc@J)?U>&6qv?m{RhFOfWq$VTlxTb=ern{_Gx71fMc`OV)7by}(&iNTu#+i!tjC*G|}OFn#HMyxt08 zw^EGVP5(vSPtWjaD6=UZ#iY^KG~B$#^Xz7&Y^lXTafB#6NHB=CCv)re`%{W}M{~Kj zO+I*bZq*(tNgn;qaS-p#g3&a2&OdN(B_KrU6edL^mVoYdeO*Rk$UCNc>MxX8sqC`C z#saP9XPD7Yr#PppRairjvCCz=dEjXxG6!VX@OtqQJ<^@7XjI0|8~&iMA~%!uNH`yj zCK}F-FoWJ@IDd^6UzfYhYe7N>f?Me82iLyVYZKboA+xcuuOK)PDutA&^~ZXA_V`4K znLBt=r~O%FU7w`41LnIjXv}icpsfrr9bnK$=YmrrDCx&Od$Jh4GM!>0Sw=a$ex$_} zPdr}u=H4h}I!ngM12ziWydlW}jKH5F(OF|3c5a;LJFeU@y*a2eP&=MgPa9Jgh>W@4 z)KBSi^J&O9(B&&!{jRw-;yrB;zD}_0SdFeyJlK5=7f$e8OuOA6+A*y16Ox7g&TqqA zvdss#lvCrB{ByL<9mc&Mr$4_q!s>*TpuX=OR-ra?Wgcix9h-bf z*a@H&zrhzA;eExF9f%bVHn`kod9qSQiwU3DoAnV=kQ@fNGseC|tWuyAo*ldD?%Pa- zQ*Oh@$HGd9GsRM^1a%OuZh)-#RK1wk=seHU_-PAQLh*EMQWTtY*ZT}S?9{0B>N`z! zdbUD507Gqle1&;!^p3EtSmQpJY`ZvazQaA0yb=G3(si_KrG>*HI0&v4TVW6O#mxbV z6%#h#bi0p#M@w?Y@WrVUJS%p6L>ety;Hx%wUwl1#Xtp~Z@fyKOCWC2fxVKyI>kODa zt)@Qj#a+EhLGtOsdU6yj?3Adg0X3sv>$S}(RfE%DW~EqvP+ejaerU>bfvSrw??vX@ zhjkQHCBtP@|5vuXli_Bi+L^l7^qpWgKvsP4s29o`V!C%#EQqHxHt7h#u1VgqchyGFOR`qZh)-#;2@kV zkvtBIaS`(G~X>F<$N-t_;AU3p5js67o?zC?kHBrmo!=3FX7wrnk?b0QV9t%TvIp?x@0Vn zJUZlp#tqIYc1l+@v+>>(EC)Y)gxo)^<@@MJC^~TyAv+VVZ)lde)9*Sght6rQrMRT8 zEIQnYfibX%@-3ry+5K>d$i0gl%8-|j*ub&j8MqA2N{c%t3hBm!RH z^Hfl-Y03ib=t?xdNPdqWk`HQ88sL~F>?uq~Q;LCBp7G&r_!KSAjE>nNnu_@wn|z=C zj3eF|XU+Sl0(k9d5RW- zr(Bqoja7h`4pYhHBAr`0v>AL&lkLX6LD1upK*%ijW_X*6_bPW=5+Bx?R-(jOkqzls z2lhos#`_RAQ}z}NbbU$jTF7M5=m>hyYvG@ zA^a9@D7cJ}9tAN?!YdfJ!5W@#7jbeGy~pzinO~usC42GG8C<|_5ym}f#fNp;lL{f- zAm#(wG(l3NscPCL`hD$95Kvn|A5pKpuq*MX4f?jubh#`d07Lc`&p--I^$S*hCSvZC zwkNv=7wnxUu_^f~Z|>0Sm{m6cZ{#`wwBvUM*1xAUDEXga@A=ZND@;3<)f1he2S$sS zkK{2%E{jv%bbTH+$Ds`DuX2qF5%+&hn`7Z)rA{!Y3#!L3B@>1xj~@uxj`6ULu@tS| zC?5#gigWdD6443w!C@uqamT+C^4-yKuv201m~8lCN_pb+%WXpXnq4WJ#r$|1@dy)N+V*acT{xJ+J- zGsnywnjJIb3zrr%Zr$)*!X3cbannw1-t*}S%Z`<9vhYUB8JHcfs>Z0FHBYJ>9;M^X z<1H*cryQ$)r=7>CA1zNg)T8u!;An;A>hz=a?AJcpK-pHw{?0~7^Nh%=Sq3u?Y$(S# z*L%S4h`qNcEYYGBnjN#MEG)x5p;pe0)3bHNg^|9Ma1MHz8z3t_>`Y$B5M$qmct1}e zR9KJu!cfd<$_qZ8^YGItSkQM1r84#UV&(+LicRfQ+0$rPsA;E^f-tv>Yqj$A z;GyfsN`Z#{Jo)ATs8&p?b9F|pPv?03cgpGU@6XGNcT!(ktfM>jK}J#)0mFA0$O1?U}Xx3pqv#9YxmH7 z#YK0hYJ~a)ok@-yii@2pC1;ja3cHNU9a>lE6p(Z>U$|e#<)~S%i`fCBm3~L+%X4X; z01G=MjLs0g9Mv%6ZS=BYTGf`!eNY5-lMk%oi62C{|45!|Xz-^u?(YysoW{ zTxE3)y5|!3lzy$F)oAQzZgB%-#iuI!3$SNoR5-P)KVt9Jkq3+prZrDW-(`9TSUawL z;oo|EY!3o##h3LJrrh(=m!@67*>S6T&wAt65u_Ezpnv(Az+Y2Q@o1aKVSpX*6?ZY8 zfbSuI?f4EZU^$IKl`497JOUpE*^05jr`Dfq)l-k+=}0R`JC4;;yv+~z&{MpNf_o}l ztW@bE1(JACbD1P59zNm)=>8=Qf1~56$$0i)9Rcfo3)8nKB}KoLL!9Qt5taj1Rr}Q* z@<{x7N^8GPB;W3>W7nSAjL1En>uN`ej&U&TE?5smFvg>aT@C3@pgZ6!-spNR)jghe za2;^-U6p&ZS|M36s-7nHa8Lfi`B+`s$6R`#(n>!U`RER<>lvS$cNv!#cuuoldOp_T zW^h)zxt_mU(Dq!6pNxT(0tVuFj;JF*ACB)9n)y% zjhZtsD_&>xSa_49-m07%AS*shzJJ{dB;Q5Q31C+#D!c-!Z+5+00~&x?Dd#G`8d3Hn z^r!Z39lhckVIaVc=Do)1^Uz|Vwc}SkfmXqf@mTuQ2G$zUypgcef$qRDJE z=?cw?SumLHUvS?&{S6-_`GVV*l@5e#$GGjyxi``W1GnR?Q(C;0Kh`6{!ysERuAXE{ zGg=x!(4*70D3bQiILc0GdN>(wR;ukIuJ|&eBP1(Elz?0Y{Ghm)M^iEmf@{ZiP+*IQ zjB70pj4wTd!ytFT_yX3=&%wA0WGlupjkAjCa-0h)k*L}orWMOzz_Z$xARgy^;(?H@ z7}w&h__Ay_fOh<9`dBqS4CB1;r-=A@%DahLq?)5(Vx>qxaSudTw{OWi4;l6=L_iz= zmrVykwqjh}mG=S7PPyM6p;!Az_ul9i+n8d|GDcBJRc>ovHQEFG0l0gMf*QK55bYRN zWkC&oncAlm2A_nAl_r7KF&=&`GKfd`+J{J_=zX+47`7E_3SBK_*!em}rticX*{&e% zI99o>jx*~E?2$(2G0fghDa{PSJr*`r$^;^uBBCU{>yaE=7q`PD${}E_xQfW4^kTQ* zIA1)wg0$io@F;)NC`{+C6bh7X?2m@+;lQnU3qq8l6CQ`Q?jRj;JSs&E!D?HF-PKkt zA9PS$QTUT3h$|`rogmI4NtnGJ!`L)@77=6-Y!;tNkw0PFKFlHb*!^4Q$kif!OvF4j zvHvxcyYd*nToAEqYdm%s*VrK*jSt$pI?>D?j)a{KJf?7cURv%oT(;NlP#rNnx+1_a z?F7||DPx*EZ57uJq;v;n#mgK&+84nCpxQBIS8>YY(8BK)!6w#ub`00T-~g~zT&os` zhE6CmQFQ9dyidc$N|k=UHiK7jwpoUlPDJ0hFL!XBd(Lq>vW^Ea?n<=t+fO<`v(M^SVOHcXaGu)6rdE11lidjO(m9m~R&qrfZD@8iOY@@z|dV0j(tRve?8jYTw^KGJY z3rIERY@(K}cI9H#89KI7349v+sxoVdx0*XMH?#Iukg93lZ0@nSse7;5oI8%Q=(X0= z+G}OMaO}|3%F5Nn3i92S+yGhe5rMLwj^>WX!+5)av*Q*#CND3@fy8q$`4SACg09f) znDKZ-N5ab$mK`gGY?qs3k;@sF172E^EbnR5Gj6p4v*R`V6F2DTGG4zOX(~GbwBt8W z+s={D>jKY;olKF|It30Yg$o!fF1VgZktpp*WO4>(#VhE4OSTydL5NiszsLFR3R#6I z;gT=a4g+k(mmw4)@V(ronLm#1z^r%$J*%4|F5mwZg>MhhbCgC%2PZB!^_N-X+XE+I z`Tdf|JYI;`09dtskx-gPNWk2dvWOiWvUM)US5fwsCmUaJ;snQv4PF}xX}8(t(`1{@ zaR6>PT{&zH9U)pV)NZ)-gtMMl9ssoiroJ@XW7i5vt&cu3vcqJbhAA=*#%qzGHh-O} zoW3GcR~Gc9xZzmmSKHNUC*tQqfRxsQKO`%akU)Gpj})HL7m`hIWCdz;1(T_02(4px z;l$(gq^N8}oKsJZ*;wI{Aq;zezRXG?*zHwS_GV*EF=xdY*+kIMdA3{6iIhJ!3xq4F z$UP%z8rrn>GvWQ<{JuiM#+&tff*>O$mNE{2H8+#J1rvE2MfswULsRB(R1u#`UAWY> z@}&)kr@-+6zvny|AU9*?QQ9<>`ann_b8T{T~bnpjF!s9uNaQ`K5W^;Ag= z$0ou?K>j6^1{e=CfA2~YRLk$(*uuIR+(3CQ4F66P&0)}wp2O`jFJ-^eDc({;(VNk! z_s?hvyIRJC4nQkUisLe+UFs^hXZw`k#%-H5R!|W7Ja;|$cF+Yu857et*{;a2Ls76P zGb_)5{%8F1y2StU5*(+xb+|Wcc;e>#NNI)JT(=6B>;~MKirPE=G(u#4f2~lB4#MEcB1~fzF9W?KfiyWu3oQu}p z@Dz57oO7!ffk-*xHbW4n?i?UyASv( zhm5A1a4rv|&f`*zjx-Jza0+i9F0_vCP~e_)_>689z4ZJ)3>M%O-awy=%tAWb+p5Wx zRIVnrZ7Z}|HS0X+-B5`3^e8VLwRAgfK#eqHH)~jeVTLO#Mkd-!NF@`G?9FmUA0lh6 ztzh%iWg=}+5!tLXe~lFsgdt(XaTgk&*ag(rQVJi^YzlSKK3V3ro@;`KKw3t0q=6Bp zz^DysFj9+sCjy)tmUM#s^rrfq0B2y`<(Z9vsnAv(zITa2;bG&ZCSS=)(A zqwmy4GKfs>GQ5vhn`OZ6lg)NhbB5O$(z$_^;!cp-Xyq^g-hCAF(IxGk?6u-hscs9A zp6@A~zqM!XD}%7o@<7<0)cu5B6}?LnSK@NR7s<;i2M@MGA?K3XIkKgSmBtNiJ!yCV zR7Im;Af+g`mQoOuX|xm$8~Td1RI`q|rM>6a4}`47zb75h!MJ_4RI!e``gm#&tHfSp zzU=Xf#mh9#<9WC&(uMk-oC<)-LbL=8h}*WY|dZ zTcIVC2;o-S$_iChWQL?MCtL}~>|QZfg;GJ01*lcsFKThiMth^~R4zj|O!X;g{%Odl z8EDM!LrxN_a04?vU#!wyr?km6eh<`%-4PzWY?pW!u~E}gozv#!Q2 z06mxFvAVL3sj6Z$cibmCe<8_E>GAvNI31Bnb(TD#vd~PZiVr^$y7{n$w`5vI`c%J(FM5$30nqjPUoq6ESBBwdBeLKOZ=xsvR* z_q4V?oV^;seimU5>QK?P->-YPN%t+IMSztuT$vB({h{_kWA?K@Q*p3`9wpy>>H2|t z3+ueNf%2RS|4tPBSvjXtz{X!m6>X%HYke!7TmX4e$+wF}8VyB0WwWKJ)~mU;)PaNX z^>2j9)fkp?ddlNKz-}=YNg-aoMfq#8$Vw`4D}es+e7lH~D+EZL7shE1Z~-iT-yq`P z>LKn-EwHBh3@IYTh0KtGgf8q%8?$L(jKSUVC52b4Q|($5bQ^r->|sZwN9UZoE!~$| zD>vK$+K^!b?kHH0)7p_0mlvXk@?s4ikA~w9(KH+}aoniJ~Z#GQKLHn#@EjeD;`e6FId@E@A z>f2gxpZ29gRkIGEQe71UmX6(!MJ4UdR?of<$^~ZX$anuc5OlHc)z|(-^a`WemlVFj z@Q)yzjnoh-7MI&iEtCxiuZEK4lBy2HpHD?}5nV&mrq)=`O6N8Jo^(DGbU|lB{+FN+ z`aVUAf-Q_Ma7@`~EG-M`CH%eNpNI!;A-_4nb{npvrOaQVlfITorC!xaeG3fF3Gjek z%z-tkJ{$1oAH{@}8UL{6cDi+k>r2by_E^w&L=SA~NJla7$%??~XD2|to$mmwkh)tg~FDn+gJR_?HS%l1CC$V0l)s$63$7*=ZA*FfdjVgp$IoRpl3Pk9&mX}BoPugBA2J#oWM zn{;Vf9jbPxb#oMg6JDgYgc3Lu3q{{xFM~qlP1MeMD}>14^tBSr0>g7(@qk_o64uj( z!F?b6jd(n_L2r?4$(FT@=WmbkDuSu?n=o>V8WqiE#Kj98Bjk14_!QV>?fcnowIZoEuRyqEBV4NFKi2Vow$XirBuQ80)nk4`bR+TaUt&Oy z2ye5d7o4S*(z02xVX20VdbO3U*yLCAbde?>=&;z|y!ZRgK&^NN{pk*V!z(x;?{4Ps zNK*1%JgD)-*ay57cQ&T0&xoE5=8?Ff@x`|*NIQR{OD6yeM6hk~}^Owq%Zh`Cz4SM=qiF7WKw)#kE{Ep7@wDAW9YzdtEs zeHJoSx&(o^^p_^3{qQ|!?;yAeTXwq*i?fM(Q=PGKoWV;YO5dXemd8huE@+F!?E$Qa zG92>k$K#i?>ljgz-$acpps)HZ$}xfCfzsyzAABb8;b#KpGxAw9zsp~v(uDSI5l%aj z0kTzidyyMQ=ObUi$pU9+ijP|```2n&aJWBa&d{uw1;OS0a+}fr%N7D}d2j&S!rs#* zPy@nfk*$WGk~DEvGI1y~r&HL5Hh^||9s_k>+J80pk}c0B78@I|s4M2Vpa6knPvyfo)COJRM~^xaGFCUzIx&>cj< zPbRBsPdv0C)v%-!!o9m@Wyjt0GRAxVePzW-rpgd_WB}Q#o_6@%n*@Wx@^6e`(t=>? zok1JTEPdLUvbr%Ds22o8e)X6{(C~l33V(FG)B-Wl0Pi*S4?krd2_y?(@HRqVPTc+= zq0#&GSuFpi{iN8+O#B-h0I-!2%Z{9%sHKbR>(bCW9V_i%t?TND{dsN@C&EPWW()0bp@>KwFG;%V#w+z!idS0rlF5gQ zow}+wa_Gt67VfeH49%=uRlO>0BQ}{4*Dn#wv8TU|ISF1?YPDfep}y}LYhlC=J-Mu* z+O*P64?*S% z+&;^WyBHS{F1`9P!zuA;=9xdYrMNAnBW#@t#@do+YPH8&Z4t_{9ePv!CisZR!hMV= z4-Q!o+o79lH^Igu8Zm`*|Q$jW<3^uaig}s#xD@mU|9)dbnK7- zd?&JHoNb_s*(lx9SH>@C8E`iSb!B{oOdGi=;g+qM5n3&imYSF{w8m--fxao$G~%Mk zY^MD_-WSi`_%-)!^1%(_UlAShHJ-y+3z;^NGm0D{hva zdWRKSXUJ0`DCuWK!k0DJgd(p%CxWV$tmUf@N@DRsN{D?H$6_baRG6}MYs-il{R4VqG{Qhk98sODBwv)KhQ~x_sar39w zq+GX>#$|;b4!twxrLp@;mI~g^uqD;;j-REoFj`C0bpnQzZEd2^INz6?>GJ-PsCUmeiOkh zV=2Sxj+boTJS`pYYJ_E7>`k5c3aEqNswH69`WeFSY#yQ)EYi$Dp=ZNF{TGc&-0Kg2 z!2L-}#)`Ubc@&(jGg!B~47FX7hxKrlvMxJM%_MYqcgLG=Z9e2m^q*r&4LFCREc8R7 z;-~OYOCM?+eR1}drj9Zn*XCkSvWsMFQu=L-o~)~1P=;9*L{EUIGrR#YJF`|Ad8-p; z;EZnx$e~^Ib0KZwfR8@%bE;r!keSUhQ!%5}-P2E4%Ms5UZr(l(9tZ>U# ziBodbiBPlC%!-J&Jn`$H;JkKLQX5*Wvx-hsW>2Tu|Nj0L4=2h-kFO~X`5x`&Tkn*GUR|>2&iYpa)nT$k2Lxg zFXEyq*_gjBlc#V=#WJQlY|NvVN+Hdv=<_z{uMl)I-I3vj8!Uc?X-tvfIo}nPK14Q0 zVv&mon)@aADvuVtk_0t+2-k~b#fBLy-BGjPlnVJ^T^K7^RJzoe88aQ^e#GQQY+SqKi5K*m@ezS--!x#A$`iy+PcdKenN@}b*iw5~sjb1i4H)`+S%Tt}KQ3Hd zzDDymIS$1LJ$yoidxY|5v<3wW&`%I@u))72D&pe6rM~1zMp1|h4m+dRz2Byn2o4Nt za*?95z!~nw^T!CmJ?ZHu9);51l&gD~(;p=?9O}x6><2WFv)`*FS+n`EX`RF7p2knx zJo*l&4jqR;)JFf;zoYqf?}XTwCvZSj{HT|gXmC(#god%Q;af6giNNi7;-$aPn4AK(e!s9t8^i*2xP4xr4K3VeVC6*LxYItnH z{i_z|$eggv7sejj(ow@~8$vDi(^E1+95g-)>EuBLMgenA|lo>%KJ z!a)V(r6iPIRPuK@3jv9TFL1fKU&0ajHCclDX#MadN(-Zmpj&kbdq8jlN-%L1J%`|5 z+AE&X4K6|G)Ahq&6di;G3-OuvTblZVAt=%e`QnOxZxB5_#yIEO>@LL+Z^S+&StqDu z6Dx$~eyz%}$ zd@U4-3O>=Laa+GZPxLFElqpsL;%+@#n@hU0Nrrx+HJ$t+%$`XzD9I+q_$qx(65JE9 zv+Onb00ZVE2(BPPlNWxIHat%$ayitx0hia!hnw5Dhiesn-8K??88KHdo1V>{=zpY@ zitJ0!o8B>F1wl=BZvTVG3Bt1ReX`kZzD4UTrR%|Vk=^zg!pm%bh1s9+ViBz`qItN@ zqPu5uK;%#5^gW>*`j2lAa&5{d00=~b&6Bogtkv?`KcKB*MMH!LErdrUCz!IF!80oDfai1l@|}h! z=d-G@vtTYG`4u}#Q_W#0fXezL?!VlgU(U|&Z)VdU_xE=XkJH)R*RQ;E-(~+jOb6@j za>?030H-pB#1T;Qp($YEXFs9U7Qs0xH3O#CBz@%>anl;Bv!Pxci5i>WvT>#2XwX=- zgzN?M*~Xe@I?yYgO2e(L5F>7N#kSs9w=^&=(;BOm(7izV$#mydS0srx)#b92v2}vI ziM!5=*9&l}6G`dYlIb}-A6F)UBVZ9qjqC9?%qZ+SC z@jQ%Hn|!CWned%DOkdtjg>$`-A2Mj`9mnf;=-c{U&L;o-ad{2dhYg>rlyq^#24dGM z_PhO9%=JlIGF2YP;KDMalZo0xIvv4+!v7KauVb~rvV0~C0${;a79qz~)-{b3!6=5J z22x*8+h}pILvEFj2j0=uzhF#T1hRn4->_u}XbS^4`ED#5K0z7OkEg|lk5@QwXb7ke zY=kuJ>kLf9kukR}Rr=KcX@UuzM^DSGv6}z_iqgb1;V}sRvkgu7_2|P25)Kg__p`6i zABO)WPjkbErzn=mhQxYNEk;jq20RQ+*Z|a9Q&OLBxk}bLbE?LuVQ$)^5ASgTmp}vL z;S*BMtPLL~Pup~fFw%*sv&kI(H+f@^b36!x9RVtX3Gn8OpFY0Osb`%U zsmCF|q=>{&$7aGClb+l3@$EHyiwz$cY&hu~<*{1lMs^+0_hbo=J@jpa&w9KHR-KVQ z)#v$ZNj$148dGB=EHvT90cV_fO`ij5nnhtFVw|QKF-^ma2&(fM4U`o%@cQFF+XUtm z6B-=L#-(z$h@#CVUYqy}#K*_%ZP$R_coDCf@Io>!`1Ln&_2fBDqo;}?P?4N5tOzWa zCeelOu-;~Q6J5v8+xcr2o7iRY62|N7DM^K8sVu1m#NGx9PTJUh&_IA;6Lv7~5u@&+ zC6>LRx3gEMAG?Ko=Um2c{F>wqb2ULebtt7~P94$57t@%B@jDFI1~i6ED-vc*?4z&@ z7#gv@`UsB6UQIOuFj#oGt z?NV5yO!Q#u@ICxHX_DLnd^QQ2F$6DJRSh7Ad~Y{=nD7saG<-6A9AW=3Z}$`N#Y`GB zYhs1|CWKA6MgN)b3JpSo@#d{F$7{6CTW=F?!d(dBiYT^~iP=O5puE8oT?0J^u=j6` z<>sA#uvu2lpbCDa05=pf@f*F-k=;M@3DkA{a>vazTCQS!g07$s~!$X`;rY;1YyFt9XGt>vtvj> zU$rQ)0OlcXl|yL3j42znD%4Fz$VH`)x!A@yAE&GrFVq#QHY{9O$~1PoK?eH}gFP8` z46@J>=`EG(35!9b+vr*6eN!j3c4uh!Kng(D4q5Lh$+3P9=@drLSCHo`k|S>(!fK^zCi1J1j$8F=Dnh!|^Vb#&fONQtuoyPwyQN@9|pTX}sA?-~@8DAUS8V&Nw7V6LsO!kz$Lz`uLBLs^H2mOaniYUNwjos-BHYp2=9`gDkvP_7zg;VqwDA^Hhac7D-%@$>TII2TJ<2pU!qL$2 zJZtongp)@G)5Bx(B?UW^*MdG+W0Tf{t*Hh48ikv5ae^l&O=~~nHyopJ{3fS|8V+H} zdWMB7Nc1>uudsTZMcg4in!(nDBmN&V{toC0E(r7Jk~^s0++nTF$)Q#I1WN|?h@J5p zH2)Ni>RRn7*j^TJr%%$!wclUW^91q(*UIT(_^&vBRemaPM&v+IUy}UKB+JRoMt=A+ zOcx(;K$#-1Htf^}G>!BM##|3y4ZR7!u=7P>I3ej7LEn@> z#CJ2M#&4vjmfAkx-f^F7%m}`Q+T|DSgC-{UkD2^QbfrfedI2}oox`Pk5&h=n>WKv% z^T?Hm^GNfTZ{o3qsRFvYjn*&utLY;WhS9}|=)_b3V=A6|(07{QJu>tQ@Go|Gbf1IP z;(MvbtC%kqxYudTiZWE?L+4Fvr8m#=@fCeWRWfqX3c36O6CrlZ%Ve{YELtu^GejE2 zoxv@xakj8@fTvX>y-V>}VUL*jUFxYQD)5wnatPu>ltXavzqWXqkZiz#Q=ACq;2nGw zWdNrkxi2J{qg4|OR%?y=H)|LUb%>(U9&HIz6yFF}J?zRFaPesxzpO*NNGeeKg)Hbl zATut%=xoM?0lbyq_lj^y`>!+*bMcd9vz^pn65hj2*pJN=`|zEcfkF;bJrTx8hIJ?i^Ys$vvsC>2O41;nKYYEQ`uqdO zQ$~;?&iu|`Qd#e>18a^geC9I(y776<0<`vs_(J_iH@MsTfj!U1Sxp>D^ zu1GgaV$al@!wEe~H{{odbqW?;!n9p(M+|)#>QjSWsgNIw%XP7Mh`M}b)xJQ0!5nJ% zHhoRD%f&fv)X;sXPYZeyAE&D%$zN#*mCtmt{uW{f*5?ClK6sGQ>|B^|bX+(Vg#R>p zfiG|gAZIS}u zleNepHNOOzp6rU ztfrn+Nx>PspbB=+?fkR8Rq}$pk|hA@6-?v1rL`$e9#S+CF1K_?ssH}5CdY8Cgk%du zxsne2C!FOu`_m6G{Jq}xl?t`NP(xZiFc#8|{gr;xwFUhxC7%Fs{u_*4D}CUmI;~g( z{VPm24g07#Me;E5csq#8OF($!43I3Bz<^kYtD;yHxQ|=E&^Me?;7PoJ@S){ntWK0| zth(9hDyD3|*{RUf)NT)Vv!mCG`fum~`IIA2`ohs94UzgTI@n{#zZ20hP`;cCnEXo} z~pLqXHWRQu|yqFDex%(-O(%5Gtw}3aDkdL`q>!MrjV`u{97%0+{$+0;M!p4N_55s#qRlvc^Sk4(rScZ~f=k zlphn?pwJbkA^m;5M!8Umcv-2U5UsR9K=Cqsx&EE=gFiOeNY?serWb-(>g-+q@Bphu zxdh=Rpcd+lvD=y(|H5N`eFzl&4+ zCE_H2u&ShxdoZGW!*K!>EQA>GrC6nEnwWNH(Mw^sZ^SYC9BjWoh@5AZAXGKGFC|KjI%HE-Xi zc-r>IjQ^uvxLw5yJo-&mJm1TE^gY?%Wz=gz8^>u|yhm-R`3nl|k2T(o)WBWf?F509 z&xRpP$iN_UaVjO#8#+mrTViNl6H@N}DS>s4e$gskLzHKth-@dSm`rW(!;LCm@K*H) z)`wUT-=}|Kq*r)nK_PL#XWyq}Amuc`o&a5zzj3P$P1X@dDPxU$m}A5q^?k}uxHoIk zZKwl`@qCE|dLOPMs5HFb5|NB?VYIA$AZaF}SyaDDcH*Q^BFK3sx=hNxzAG6DwLg6iyi&YZ| zrR zLe=l_Q@u=+<_(h}Hpf~^vBA}gc}A@!8q=lA*IO-8eM5T^JH}5^Mpj04j~G#r+ybhf zM9?{*1XjMu&85~6S&GaZVQu3TTD<|>(YDzIr9P~5A!Kr`SUlXW6=U*DWuPYQ?|i?j zz&8>~h}jyXUrKmZzWj=w1en==(~ZPc1N0N}74fa;1c{G7)*sM)W>_;= zuiWY4uW3Gse$S%~p*#3^g^&3={~+%YgQqZy=QEN9>zA83h16s8MtGK|VVq|-^XqGr z;gvQF3lwpR3a&@988!^0HTY|eHHGLF5?EgV!$}wl=E@B1`U-(_IyYKo*H9<+Jq-)A z(b3cPxuLH?wp-83-8r^|Yw8moZHo{yGA3Bpze5kzEJy;^`KS?p93i{*XQShb7% z7GwG;7fUf~nizQT&9{z_m8p~4)u*@*NZ{@iZRBmP8W-PseaudwseHJTiE_ypTcI4A8x{7WXW zaGuEjf~HVDFe&t3`hiIl{|)3n&*ESHE#W^Bh*}c6=!Yh^_;Z%+R!_+ike{Fd{lUGW zk~#j3XrT08G@rj>`=Ni}6_0=T0t*+5n|IO_i=QI2l2!maMNV;1R1uU;@Q!-!My1@W zGZ$(he$xQ)AL=ooD_1-VUM$eXVkxUGmI&X7u`ZTC8~Cy3q)PUs^@pF^Y6ps!Sg?s#M4P z6_+-Acyu-sr$Oo~zZL?S|IP1C;h-qcpsNR(NILx@idwlaR+V&A=+0<`m68@;#oUx3 zh_ZbZz7I<1FoTnYQpfQI+hduzahdg|F$XsYz>hPHAZ=gZTM{mK5hsk^mg>NeN|mPb zm}1HEKlw^ihVd7~fd0*mHDWgKYdM!iAtXK$%3;kcY)?*^e3IH`2pb%sCuaP0kh2vY(r|#DqOtdf`$GdCd0qc zYW|9@=-(Capno^mH1RL_74tt}cEG=HTvJ-TJ!AFJPuVLnHsV*Zz`|N>pT{#jw7;d!w2rA#+#JXZ(gzx*Tz-Yno`cI!3fMFq{HS# zc32^t`IlApA}-tXU(+quV)Y_Yl!y?eGO}x_GH@MtZ7QPzvmogsN;l-eNVyX^;LtY^ z*YJ(&f}5DG#t@kV|ADd(nF}QrCm76Q@f-04XNVONE`;)5D#x-XFa1hwI!jlIXe!}3 zUn{Q^aYbX_6hQ^SUi;q|WkyjCH?%|Tiv?c_^y%oJP+TEU|L<81M^RixQj~#Tp=g$y zLl&Bfx7_QgQaQxd+|VEYWayKZV}>?`zF+EIeWoM%zOyW%lZC2?)?(7QU8+>BQ|mw2 zDKRZH$^5@!b>foq{TX+nR3w&TDw7qE&W_R*Uz8jWaoG&Id;)!YhxHBDKvOxLu0;7R zj+W>Q=z(Lnrq&h+0YI5*<52iyv^iRvI+5rhQ&OEQW6C7FbO<=|u8=HNBs`WBbp)6jNv*RZf5JKWK0=9Zy7_tPW1c;Wv5B+VVz*p?*xM(5 La)uHk|M&j@BG1z< literal 0 HcmV?d00001 diff --git a/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/PkgInfo b/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/PkgInfo new file mode 100644 index 0000000000..bd04210fb4 --- /dev/null +++ b/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Resources/RecentFilesMenuTemplate.nib b/Examples/AudioAppExample/Builds/MacOSX/build/Debug/AudioAppExample.app/Contents/Resources/RecentFilesMenuTemplate.nib new file mode 100644 index 0000000000000000000000000000000000000000..cec7f7c72bb7b287e0d493d53b0c487866ed6038 GIT binary patch literal 2842 zcmai03v3kE6}|7xy!Xa&z`M5b4;%lM&tmWg|D6Ew7aQ2M@%n>tur*!}uy{Yt&e%Yj z!V5{9M2(VAB|&M`7EBWqMJYm*Qk147ZPe1JqQtSlrHBH7I0T_IjZ#F@)_t?%Ee=It zN7~t$ckeyto_pVY+c)U<=|*AUI3U0vfeZvFDn(`M9m85!_l1J%9ihIhn%B^~9BSCR z#V203IgHR?JfM+%hit2XfdZM33l3Ne`LGO1p%PYu3*68FouI-XJOW|Z2HRl=JO&&d zhbQ3$coFu%%kV0U!U6axya8{)&*3Qi0*=GG@E)9mKfr1D5GLTya1k!SWw;8Tz^8Bv z#i9%}4`re(l#OywE^?sxXaQP?79l5EjPlSDRDhPXJAy-g|6d>m?t@skA7;U9hyxqg zAs!MS5#~S=Btr_MLK@74bjW~=UYpJB>G0{kKEKxK3-*V$=^NdiW-IkI+77+L?P(2# zjEBWbU%%d=`iC^V!{PO-y1v1BXIcrL+E6ek^b*qPy|%dj#jrejZK-Zgwb!fZ0?Ft1 z89S!ULt$Z^e8-xJWJdjeuiG3r;V~TZa^A$tIOC;!6>sE?VWu%!dWA5EgB)G6@Q+_0~^K?-8y;x)BOkDvSy{=lWhr{ZQ15gGP z;OrD+%}2|n3LfAkKZ6HhIjn${@DNl(4b(y%)I$TTf<|cK_woDrQXa<_@>HJA=kaWw z%k#LC7w~0KMb-)xV!x@vI5dlFT3{Wtf(P25U5Mt=fYA2|)`3%3tXY&QT zh|lV(cB#IgX%)?M5LB%O3Eae3g&<9@V7f2dxg3SVLi^yav z41ga35QI>#&F=Pya@RjH7ukjfz9|JYZG%QTR?|*H}#w^&f>t!FfCQP8jBMcrs6j zn3_={EIo#5XjYir@PtUpTru??h27vh2TuvHM(&X7X(3q6Hza#rv}1K-s|kTTLwx}e zgwGX~pUzw)oz~Xi^J_i2wP+bveH1D9I{3aQ_wzhMR5UGG#l2kF54C*W-6{M)P^c3m zZdYwT&k|jhZYeGBGP|1xwP04O=GB769k93i>@@*=5ccyN0X?5*M#0}S!RvYM-CCt? z2Ivt187Zv*bZn^gYic;l6tLHp)N5AK#I6f@hlC!6ZZ23#AA?^`_tPjG1LxgPW;W!B z88R+vtMB(2XYZ)UOzYpzuwLBJ5DEuW<6a1Vn&Gpgt;45nyO+n=86No^)}a12R)3vg zU)a{D`3Jj&LNm9nIVG=%nNTdYQ$r|dxYVH7W?@UQ3YZ)<2a#2vD)`JCKuO|SK7B<; zkoBA-1~C?h))gH=))S7#_?nj-vc-uQ-!{nby+&CcRH0dsNN6^SLpEeb@hAZ$qB$rD zC8HFSiqggI%~8 zx8N?k2?wx_AHzHGF8mDMi+_w?$A|D?d*2`4pWg6Sed~ARjY?$q3ud*Mq zAF-dX{p<~N5j6 literal 0 HcmV?d00001 diff --git a/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.sln b/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.sln new file mode 100644 index 0000000000..705ec48904 --- /dev/null +++ b/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{2E378E24-A882-72B1-F070-ABCF45D0CB11}") = "AudioAppExample", "AudioAppExample.vcxproj", "{98301F26-3786-86BB-BD55-8BBF7C70DA8D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {98301F26-3786-86BB-BD55-8BBF7C70DA8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {98301F26-3786-86BB-BD55-8BBF7C70DA8D}.Debug|Win32.Build.0 = Debug|Win32 + {98301F26-3786-86BB-BD55-8BBF7C70DA8D}.Release|Win32.ActiveCfg = Release|Win32 + {98301F26-3786-86BB-BD55-8BBF7C70DA8D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj b/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj new file mode 100644 index 0000000000..2937385ee7 --- /dev/null +++ b/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj @@ -0,0 +1,1725 @@ + + + + + + Debug + Win32 + + + Release + Win32 + + + + {98301F26-3786-86BB-BD55-8BBF7C70DA8D} + + + + Application + false + + + Application + false + true + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\Debug\ + AudioAppExample + true + .\Release\ + AudioAppExample + true + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + + + + Disabled + EditAndContinue + ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2010_78A501D=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) + MultiThreadedDebug + true + + $(IntDir)\ + $(IntDir)\ + $(IntDir)\ + Level4 + true + true + + + _DEBUG;%(PreprocessorDefinitions) + + + $(OutDir)\AudioAppExample.exe + true + libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) + true + $(IntDir)\AudioAppExample.pdb + Windows + MachineX86 + false + true + + + true + $(IntDir)\AudioAppExample.bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + + + + MinSpace + ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;JUCER_VS2010_78A501D=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) + MultiThreaded + true + + $(IntDir)\ + $(IntDir)\ + $(IntDir)\ + Level4 + true + true + + + NDEBUG;%(PreprocessorDefinitions) + + + $(OutDir)\AudioAppExample.exe + true + %(IgnoreSpecificDefaultLibraries) + false + $(IntDir)\AudioAppExample.pdb + Windows + MachineX86 + true + true + true + + + true + $(IntDir)\AudioAppExample.bsc + + + + + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj.filters b/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj.filters new file mode 100644 index 0000000000..bbaedd9d9a --- /dev/null +++ b/Examples/AudioAppExample/Builds/VisualStudio2010/AudioAppExample.vcxproj.filters @@ -0,0 +1,2951 @@ + + + + + + {76BE4C13-8BB7-CC58-13E8-409DE2E7449E} + + + {02255145-4BF1-C420-1277-97A35963002B} + + + {422C46B7-0467-2DB0-BF3C-16DFCAFD69AC} + + + {3247ED97-A75A-F50B-8CCC-46155E895806} + + + {A33A1E1D-AC2C-6382-8681-48B0FC374C60} + + + {3FD908F5-98C8-9A61-FC03-0BAF8913CBB0} + + + {11A75801-B027-40BD-4993-023023ACCBF7} + + + {EF2CAB40-0432-429B-C517-86ADF136BB8A} + + + {8F7EC212-3168-AD81-5064-C45BA838C408} + + + {CACD7B50-4DB3-76AF-A6E8-90DF94F8F594} + + + {9D270B31-2425-8FDB-84A4-6A2288FF5B2F} + + + {0F766DD4-A277-CB86-5647-42498C8B41E1} + + + {D64942B4-6984-3623-3347-45D472AE1C61} + + + {45C2CE26-EC4B-BA52-58F3-297C408E1483} + + + {01603E05-423B-5FC3-1BEE-E15ED33B5688} + + + {65CB28F8-0422-A8F3-9A17-959E12A1F8E2} + + + {2FE25F4C-E9DF-04A5-CAED-6E4B7CF28C59} + + + {0CD9E281-DDD0-91EC-6F77-EA9D9D5E0E1A} + + + {40C5CA7C-AEBB-05B1-11CE-AE41D87B5CCB} + + + {0B0E7392-324B-088C-FBEB-5FE999D61782} + + + {77E2C34E-A4D6-EDB5-A107-7CB3CEF0E8EF} + + + {20254EFE-6CBD-31A7-2119-92B1E0E0E311} + + + {70796D73-6D30-8A1B-4732-7C021E47C05A} + + + {EB8DD942-E2CB-869F-D381-E02A65BA790B} + + + {B63F69FD-8A40-8E1E-E7ED-419B8DC1C12B} + + + {8167E753-09C7-5D1C-EF2B-32D297557443} + + + {AEDCB7F7-7A36-5392-8E9A-715F5BDE35CB} + + + {95CA1506-2B94-0DEE-0C8D-85EDEBBC4E88} + + + {244D11B0-2D68-3C08-A0B7-0D12469BC3AA} + + + {476C69CE-0B67-6B85-E888-45D91E37A29E} + + + {7C5AD030-F8CC-6E85-0AF6-196B3ED40AC6} + + + {0608ADE9-66EF-1A19-6D57-12D07F76EB53} + + + {05F3DB8A-499C-6ACA-282F-5BF8455A0DE1} + + + {C9F6D785-BF78-5AA1-B479-111C65397864} + + + {C8F726FC-26BF-2E6B-4ED5-55A7FE316D7D} + + + {DA0DC4AC-B511-A2D4-199A-C93454D6F114} + + + {91929C6F-7902-B87D-5260-2F6CBF8ACD93} + + + {C294408A-2005-2E9E-7AC0-8D3ABE8AC175} + + + {4634FFAE-9586-A970-364C-4FDDA635F99F} + + + {F2B2F310-F30F-7166-42A9-9BF9C230DA78} + + + {1B67A7C0-86E0-53F6-6AE3-7AD93B8DC95B} + + + {F03654BC-34D8-F975-BEA3-750CC2783D23} + + + {4927C7A1-9235-4AA1-93CD-B4E67E6F1E5F} + + + {FA891A58-9FDA-9651-43C4-714A19B5D08D} + + + {C79A4D23-7866-8F3E-AC39-BD68C52A9259} + + + {3C7C8F35-6C08-9866-6663-6FEFE2EFC9FC} + + + {7703D2CE-C32A-936A-0EEF-949FE6E52EB5} + + + {8D283B6C-13BA-9EF6-1B18-B1C393786943} + + + {928D8FCC-5E00-174B-6538-93E8D75AB396} + + + {1988E68A-A964-64CA-0E0C-26FF9BC5176C} + + + {3DF036EA-3B80-553B-2494-3AAC835CAE75} + + + {358AEA11-3F96-36AE-7B32-71373B5C5396} + + + {F2A38F45-6E55-E147-2E52-64A89FDD9D59} + + + {6172822C-01A5-E824-12DA-FA43FA934D35} + + + {41DC3BE3-D629-8A17-C32B-F5B4008B5FAD} + + + {B098BC87-3298-7E6B-12DC-D26C09CDCAED} + + + {6322B88F-984A-C3CD-6263-38D7AA49B6EC} + + + {73C1E759-AD90-59A3-942E-2D10FAA29107} + + + {EE1AE8C3-0908-8F53-A4E5-D930C7C97C26} + + + {4926B3FF-E797-F586-857A-69D9703FA2D1} + + + {EBC65085-3AD5-280C-1A29-2B1683643AA1} + + + {413F481F-075C-2958-115C-D8268682FCB7} + + + {69E1179D-76EC-26DC-C3E6-6602ED26D783} + + + {C1A1A236-AB01-173E-96C3-0706BFF93B1E} + + + {1182303F-ECA3-166D-AC0C-92C5E762CB93} + + + {26ECA2AF-7368-C6CC-58EF-017ECD1862D0} + + + {E37D25CD-4350-4614-055B-7ABC55E67895} + + + {FFC6E1CC-C772-75E6-5087-FB5D4E016799} + + + {8E43579F-C185-266D-DD67-F8B95BD80F2F} + + + {2CB59E7C-D0E4-7D27-2ACF-C7ABADEE936D} + + + {796B7886-44A7-34CC-9B95-BF4FB2C7B6F4} + + + {A92719C7-70BE-57C4-CE9E-A9BC9DFEB757} + + + {75F1F352-251A-75E0-D941-8431588F5C1E} + + + {DB6E3D09-66DA-12DA-BAE8-A5BFFA7A14AC} + + + {7BCEAB87-62FD-0327-EB5D-679E54EDB9B1} + + + {E980FADB-6E3F-B93C-DE02-CE4271C9BA93} + + + {C3B2EB8A-1A2F-306F-AA78-3E9D1593788B} + + + {7A53E6F1-1343-33B8-4CA8-1D7B714A0E76} + + + {5A0AA36E-3957-E413-14C6-31CBE15271DF} + + + {D7E3D10F-3ED8-DFC5-6DB3-E4ACBF8678FB} + + + {F408DCA2-D5E2-0A3A-A064-A1D045889BC1} + + + {5FDBD6B1-9BBD-392F-4DA5-FEA40A9370C4} + + + {46535B56-3737-2BE8-E3A0-571BCBEB2DA4} + + + {C2B9505B-27B4-F650-12BD-F477D4BBCBAA} + + + {61712B09-5783-ADFA-2001-5A0C3D7764EB} + + + {8A80BA78-D3A8-C0F8-7FFD-61AA028CE852} + + + {8EC9572F-3CCA-E930-74B6-CB6139DE0E17} + + + {C60A6FCA-9462-922E-AD8D-69F10C9049AF} + + + {D56498EE-E354-1F00-5EEE-8CF7944BEAFB} + + + {61B2920C-494D-D8CB-C0C7-5DBF3D76D164} + + + {66C9B809-8739-A217-C78D-A15D6089B8E3} + + + {C413328B-5D81-89EE-F4F3-75752E700DE4} + + + {639E16C5-DA8B-ADBA-6E24-7B596378EAB2} + + + {2D8D0E19-E676-83EB-38D9-F73500DD6B79} + + + {B3141847-8F13-F67D-45B2-E3ECF6E09088} + + + {9E586194-C056-101C-5311-F2AF5191AC80} + + + {151B49D8-6102-F802-1C07-D59931BC0574} + + + {72A923E2-C729-DB92-D7BF-A9D4AFAE5896} + + + {0E43EA8A-95EE-4253-E1B7-160F38ACBB00} + + + {7F11E7D2-54C0-2A36-5F15-BEC0A5374A08} + + + {EE985DEA-CD83-8132-7219-542BB1DAD560} + + + {8B4D1BAA-6DB4-CAEC-A0FA-271F354D5C61} + + + + + AudioAppExample\Source + + + AudioAppExample\Source + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\synthesisers + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\audio_cd + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\sampler + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\players + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\unit_tests + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_cryptography\encryption + + + Juce Modules\juce_cryptography\encryption + + + Juce Modules\juce_cryptography\encryption + + + Juce Modules\juce_cryptography\hashing + + + Juce Modules\juce_cryptography\hashing + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\undomanager + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\image_formats + + + Juce Modules\juce_graphics\image_formats + + + Juce Modules\juce_graphics\image_formats + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\placement + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\application + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\documents + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\utils + + + Juce Modules\juce_video\capture + + + Juce Modules\juce_video\native + + + Juce Modules\juce_video\native + + + Juce Modules\juce_video\native + + + Juce Modules\juce_video\native + + + Juce Modules\juce_video\native + + + Juce Modules\juce_video\native + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\synthesisers + + + Juce Modules\juce_audio_basics + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\audio_cd + + + Juce Modules\juce_audio_devices\audio_cd + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\sampler + + + Juce Modules\juce_audio_formats + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\players + + + Juce Modules\juce_audio_utils + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\unit_tests + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core\native + + + Juce Modules\juce_core + + + Juce Modules\juce_cryptography\encryption + + + Juce Modules\juce_cryptography\encryption + + + Juce Modules\juce_cryptography\encryption + + + Juce Modules\juce_cryptography\hashing + + + Juce Modules\juce_cryptography\hashing + + + Juce Modules\juce_cryptography + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\undomanager + + + Juce Modules\juce_data_structures\undomanager + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_data_structures + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\placement + + + Juce Modules\juce_graphics\placement + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\application + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\documents + + + Juce Modules\juce_gui_extra\embedding + + + Juce Modules\juce_gui_extra\embedding + + + Juce Modules\juce_gui_extra\embedding + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\opengl + + + Juce Modules\juce_opengl\geometry + + + Juce Modules\juce_opengl\geometry + + + Juce Modules\juce_opengl\geometry + + + Juce Modules\juce_opengl\geometry + + + Juce Modules\juce_opengl\utils + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl\native + + + Juce Modules\juce_opengl + + + Juce Modules\juce_video\playback + + + Juce Modules\juce_video\playback + + + Juce Modules\juce_video\capture + + + Juce Modules\juce_video + + + Juce Library Code + + + Juce Library Code + + + + + Juce Modules\juce_audio_basics + + + Juce Modules\juce_audio_devices + + + Juce Modules\juce_audio_formats + + + Juce Modules\juce_audio_processors + + + Juce Modules\juce_audio_utils + + + Juce Modules\juce_core + + + Juce Modules\juce_cryptography + + + Juce Modules\juce_data_structures + + + Juce Modules\juce_events + + + Juce Modules\juce_graphics + + + Juce Modules\juce_gui_basics + + + Juce Modules\juce_gui_extra + + + Juce Modules\juce_opengl + + + Juce Modules\juce_video + + + + + Juce Library Code + + + diff --git a/Examples/AudioAppExample/Builds/VisualStudio2010/resources.rc b/Examples/AudioAppExample/Builds/VisualStudio2010/resources.rc new file mode 100644 index 0000000000..249badce6e --- /dev/null +++ b/Examples/AudioAppExample/Builds/VisualStudio2010/resources.rc @@ -0,0 +1,29 @@ +#ifdef JUCE_USER_DEFINED_RC_FILE + #include JUCE_USER_DEFINED_RC_FILE +#else + +#undef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#include + +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,0,0,0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "FileDescription", "AudioAppExample\0" + VALUE "FileVersion", "1.0.0\0" + VALUE "ProductName", "AudioAppExample\0" + VALUE "ProductVersion", "1.0.0\0" + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 65001 + END +END + +#endif diff --git a/Examples/AudioAppExample/Builds/iOS/AudioAppExample.xcodeproj/project.pbxproj b/Examples/AudioAppExample/Builds/iOS/AudioAppExample.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..b852a368a6 --- /dev/null +++ b/Examples/AudioAppExample/Builds/iOS/AudioAppExample.xcodeproj/project.pbxproj @@ -0,0 +1,2142 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + + 3286435E3CC944A630866B89 = {isa = PBXBuildFile; fileRef = 92CABA9C9B5148FCA22A0503; }; + 7AC823C6BFA28E49D004E0E0 = {isa = PBXBuildFile; fileRef = BD70FA4626657FF1DEBB10DA; }; + F02410B634B6C9C29060A812 = {isa = PBXBuildFile; fileRef = 4286F1F40FC3E04B4AE701C2; }; + 26E4E22AC7196AC405E218B9 = {isa = PBXBuildFile; fileRef = 7C86E886C3FCB671004E1CA2; }; + DE32F1DDED355F817FCA16C4 = {isa = PBXBuildFile; fileRef = F5B5D441C4AB1D01509ACC8D; }; + 62AE0FBB5B9184FF94092D43 = {isa = PBXBuildFile; fileRef = D7867DB9C17425E3F05EB860; }; + C3F12DC7CA8C22C1853A7F08 = {isa = PBXBuildFile; fileRef = 712FD99244BEDA356A73A60D; }; + 291730DFE49E6AE97D4C8CEC = {isa = PBXBuildFile; fileRef = B06A9120276E8875161CFC7D; }; + D3AC61A0594DE1592920426F = {isa = PBXBuildFile; fileRef = 1D29F6A21F927F10EB8C5EEF; }; + 70EC04D8CFE012341DBC0A45 = {isa = PBXBuildFile; fileRef = 9B83CA7A03621F4DE0B0C3F5; }; + 5055109434B36CD6E0B6D360 = {isa = PBXBuildFile; fileRef = 2545022A0EE088A0C46EBD13; }; + 55A794809FECCB07D3C4D07D = {isa = PBXBuildFile; fileRef = D78365C74082A1253E12AF17; }; + 3621F85B854280F9027CE5CB = {isa = PBXBuildFile; fileRef = 5FF5EB14BABBB07DE73B3084; }; + 553D71A8359701FC2637AB1B = {isa = PBXBuildFile; fileRef = A7A5CB392CC227CDF5EA7E1E; }; + 202C2E7636BF065345A863BE = {isa = PBXBuildFile; fileRef = 0C45F05CF7EE8C0E36FACC7D; }; + 4D0CCBCD970506020B7B776D = {isa = PBXBuildFile; fileRef = A4545B5C8FFEC73F3BBB79D4; }; + A5F3236458D1B10A5380B56E = {isa = PBXBuildFile; fileRef = 0246069EEBDF0407AC74689B; }; + 32945D1B73F05E016A260623 = {isa = PBXBuildFile; fileRef = DE7823A252414C8CBA93C5C4; }; + 37A09B6DF2E96F97B97D4449 = {isa = PBXBuildFile; fileRef = 4C36BE67D1173F7989BE5F45; }; + 549F56B2B2C317F8825B1931 = {isa = PBXBuildFile; fileRef = CE21B3DE9134974FC3432234; }; + 497800EE8B1FCCF085363076 = {isa = PBXBuildFile; fileRef = 28BFBC2913988C2507DA643B; }; + EAB8E408DC76E022A6D68766 = {isa = PBXBuildFile; fileRef = F15FDAFFD05E09B75A756D84; }; + 9A41B21E365359ED2B2EA7C9 = {isa = PBXBuildFile; fileRef = 5CAC2512334C51B8BF104DD4; }; + D08237D0B93B3C2CE522A33E = {isa = PBXBuildFile; fileRef = 77DBA89F84EE6B4ABBCC1392; }; + 6DD90D5F07BB81EF033A8A20 = {isa = PBXBuildFile; fileRef = 0715CC6C99BA955AF2097BB6; }; + 7BAD1CE41A8101004D40A2BE = {isa = PBXBuildFile; fileRef = 88F83AF1ABFAE2A428714C4D; }; + 002827E70384CB5051DC2794 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LagrangeInterpolator.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 00F3FC287D7F986198A936F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LuaCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0115C9169A12F36DD8CEBB70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MountedVolumeListChangeDetector.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 01A4F028A63749CCAAE5DF55 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0246069EEBDF0407AC74689B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_utils.mm"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; }; + 025BB62BCFB9BC624B6C65EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Result.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp"; sourceTree = "SOURCE_ROOT"; }; + 027B826D8F1EC95E886648AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; }; + 02D59F4CAD8301ECCB3ED6C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 032DDE8B772727B97389F022 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h"; sourceTree = "SOURCE_ROOT"; }; + 0401AF6817AF1AEAC733714F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0425BD62DB67A184A8DCAF27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 043223EEE8D5CD1401F3BAA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0518D1089617C7B9598F35C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SelectedItemSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"; sourceTree = "SOURCE_ROOT"; }; + 056385085D79574486C0E69E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLTexture.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.h"; sourceTree = "SOURCE_ROOT"; }; + 058ACC9BACC273A0CD4AD526 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSourcePlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h"; sourceTree = "SOURCE_ROOT"; }; + 05F4D303872E30E0E100B178 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; }; + 0680C56908E9B9FC6E45C181 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ValueTree.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp"; sourceTree = "SOURCE_ROOT"; }; + 068CA344569622AC46399E24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DeletedAtShutdown.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp"; sourceTree = "SOURCE_ROOT"; }; + 06CCEC1EB7CB9296868ECC10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectShowComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_DirectShowComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0715CC6C99BA955AF2097BB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_opengl.mm"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; }; + 0744962768C86A35D6715A15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + 07E25F36485450F905114EB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 07F9A74E51473D1AEF083D7E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0859DE9EA0450BAFE24265C5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLPixelFormat.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 09221768D9AE08F3E84407EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComboBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 09435B89075BB6FA4CFD6724 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 09E6748FEA21346ED9524265 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_utils.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h"; sourceTree = "SOURCE_ROOT"; }; + 0A1661FABC94E6BC1CA583CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A3DFC5C47DC2472E34D9E73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A919F08E0442BC95072112F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; }; + 0AAD0F08AF5170AEB68F9191 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginListComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0B0A6273D0438F94A0C00793 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Memory.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Memory.h"; sourceTree = "SOURCE_ROOT"; }; + 0B10218E1440362CF414330C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageCollector.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0B8875740103D9A0E34317DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 0BE56E18575B1EAB8F889666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0C0C38F452969215F24776E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePoint.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0C16DC35F5044178F8D6FF3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Application.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h"; sourceTree = "SOURCE_ROOT"; }; + 0C45F05CF7EE8C0E36FACC7D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_formats.mm"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; }; + 0C9B17E257DF0D263890AC69 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; }; + 0CAB2AAF663F5DD90D95F05C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLContext.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.h"; sourceTree = "SOURCE_ROOT"; }; + 0D7137F7245CFB5DAA18A4FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableObjectResizer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h"; sourceTree = "SOURCE_ROOT"; }; + 0D9FFE7342AC6AA69831D982 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileLogger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0DB32EC20D82294C547A0316 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0DDC18CBD62470AE422E4571 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Socket.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.h"; sourceTree = "SOURCE_ROOT"; }; + 0E79750D244E5C95E94DAF88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST3PluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0F09FC5EE1D8696669386810 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPCompressorOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0F29F3A4AE661CEF5467732F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 0F2AA0311372228328A192D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0F40E9138B6D40184283AC89 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0F9C7DD8B8CA6807E02134AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 0FA2744FC75AA85A7B01AC72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferedInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 0FF1CB412E3C9ACEAFE41AB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RecentlyOpenedFilesList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 107DFA95B0EDBA20E6F491EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TreeView.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1095B29C706EA27F3345B1C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemClipboard.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h"; sourceTree = "SOURCE_ROOT"; }; + 10D3E511C1596A55D345E450 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 10FC26BFC760FDF31F7EF24D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; }; + 11684623C5BC9B99836F46E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; }; + 118158D6CA3C681B3C33CC49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1199E7838DDE8C2C910335E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorListener.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"; sourceTree = "SOURCE_ROOT"; }; + 11A4BF5B35CBCE630657C39B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Label.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h"; sourceTree = "SOURCE_ROOT"; }; + 11CFE8D169BB1FA1424C433C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ActionBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1207768208DE16246677EEB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ContainerDeletePolicy.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h"; sourceTree = "SOURCE_ROOT"; }; + 125FF844F4BED2DA55F1CB14 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferedInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 12AD997217C5B146DCE05DA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; }; + 12C4E2CEE622B2D83D4E08B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_osx.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_osx.h"; sourceTree = "SOURCE_ROOT"; }; + 13329E39CC18775B44F472FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1478ABF4E3D10AA709DDFD65 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + 14DC16A9C4FFE20764935170 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 159C514EC2AC5B7C89F19F37 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Thread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 15B818119E54576C2C7BE206 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 15BA4AEE0C0E22D7C8BE92CA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; }; + 165951595FE0F9FBDF8F1F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1664A35158FBA71AADCB379D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConnectedChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 16C069B1F73826D5E4EB1AA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_linux.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_linux.h"; sourceTree = "SOURCE_ROOT"; }; + 16E0712BBC4355F3D2854D5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 16ECD7B6A2A11154B3D86015 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnectionServer.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"; sourceTree = "SOURCE_ROOT"; }; + 16EFF69FC0A6DCCB8B386AD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 175536F3AD74DA7F99855C30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 178C4671AD0A7572A5C23B8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Line.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h"; sourceTree = "SOURCE_ROOT"; }; + 17C63BCBC9FC8596F5EBED8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 17E6C78A4D618FA739394B9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1804F385A9B946734797C612 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSubsectionReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h"; sourceTree = "SOURCE_ROOT"; }; + 18425E2A1A02A2F013266A5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DialogWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 18710CAA88A2662E51D49808 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; }; + 18D45688D8F8717DC47D1E83 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 190369B72311A50A82311CD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LuaCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 1957F896F4DDB12033F0E84D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 19ABD47BB707333435D2CF3F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 19C6E03C8D0761B9A3734BA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; + 1A5DF7BA39B40428260C31AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableHeaderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1A65D6E553E5548D50FA59F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h"; sourceTree = "SOURCE_ROOT"; }; + 1AC49D8536EA1C79ADF3F0E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TopLevelWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 1B103C1C32376CBF2394789A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MixerAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1B736A8E8EE2F4C270C8F2FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDescription.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1BC517563ED432D3E3033450 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; }; + 1BEE7899664040AC3C5866D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiOutput.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h"; sourceTree = "SOURCE_ROOT"; }; + 1C2F048BBDFE107360BBFA96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1C53C4F34A3547694B6DC964 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailCache.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h"; sourceTree = "SOURCE_ROOT"; }; + 1C98C9CED951E601931822FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 1CC58E8F3AF64BE9788945BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_devices.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h"; sourceTree = "SOURCE_ROOT"; }; + 1D29F6A21F927F10EB8C5EEF = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 1D90D583FA45AECD95ABCA46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrayAllocationBase.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h"; sourceTree = "SOURCE_ROOT"; }; + 1DBB7AD294F9BEB842690992 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LagrangeInterpolator.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h"; sourceTree = "SOURCE_ROOT"; }; + 1E1FBFEE80C3686ADE3B4F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1E7CA6A3A1C17F917A7F7E04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyboardFocusTraverser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"; sourceTree = "SOURCE_ROOT"; }; + 1ECCF86BD5C7ABBD8FBF6652 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1ED7F9F098974D1824E98397 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceSelectorComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1EF8CC1985D194D8B5FA91FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1F5AB21B8BB5572345F16D3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageCollector.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"; sourceTree = "SOURCE_ROOT"; }; + 1F87E9DB5370F34BDCA80E61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; }; + 1FDE5979B036F7ABC463E315 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LocalisedStrings.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp"; sourceTree = "SOURCE_ROOT"; }; + 201AAC61BD1439D0404CD52A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; + 204605387364B68F56B522C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_processors.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h"; sourceTree = "SOURCE_ROOT"; }; + 2086277583EAB1A771D6C6B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLTexture.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2091E99CE600D2CE4AB578ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Identifier.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.h"; sourceTree = "SOURCE_ROOT"; }; + 20C9FECB6515DEB13F3D0B12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Typeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 20D894CA430125D6180ACA0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatWriter.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h"; sourceTree = "SOURCE_ROOT"; }; + 21168FEE80959F178F1121D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadWithProgressWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 215188D87085D91B6C5FCD14 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TooltipWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 22602331F3048F760A57DF0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StandardHeader.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h"; sourceTree = "SOURCE_ROOT"; }; + 22F32B780E54AADD057330AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; }; + 2324CB42E9D6509A04EC7C2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_opengl.h"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_opengl.h"; sourceTree = "SOURCE_ROOT"; }; + 23497CEA84E011F94678DC68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 23EDC268BE997399F443A16F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_basics.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h"; sourceTree = "SOURCE_ROOT"; }; + 23FA7D4C4D291A54A41B05B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 244B7290EA0ADF1E7F5F95E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Justification.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h"; sourceTree = "SOURCE_ROOT"; }; + 247DBA4DAA228F551077F55D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 24D1CEB29BC23FB571BE0EC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 250858304ABC5EC4C5B9D876 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2545022A0EE088A0C46EBD13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; }; + 26666AFE34453D68EA1CD34C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ShapeButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h"; sourceTree = "SOURCE_ROOT"; }; + 2678394F8161FBC107B8426C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 2758DE812EF406E2AF60A9DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModifierKeys.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp"; sourceTree = "SOURCE_ROOT"; }; + 277DFD7724AA558ECBF9CD7C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 278905A514838BB05EF5BCC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallOutBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h"; sourceTree = "SOURCE_ROOT"; }; + 27E26A34A2A3DC9FBF6C6B74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FillType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 27E49EEFD8649E9F26DBF49E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDReader.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm"; sourceTree = "SOURCE_ROOT"; }; + 28050C6DE7011A70920E3F32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; + 2864CE464B03FFF3AD5A24F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 28697A80BA58B9660B88AA23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilterAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 28B1C5C6AFE41F19212BCBAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Drawable.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h"; sourceTree = "SOURCE_ROOT"; }; + 28BFBC2913988C2507DA643B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; + 28D9FE3711234F679FB41733 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 28EB7629415CAFD5EA443ADD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WildcardFileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 29936B840C21753D71B54BAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActiveXControlComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 29F0D7BF3731A741411D18A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OggVorbisAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 2ACD26FEA009C3FF00F6E124 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; }; + 2ACEEEDE012463EC66132BA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Strings.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm"; sourceTree = "SOURCE_ROOT"; }; + 2B17BC5C2C35FFFDDCB35B68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Network.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm"; sourceTree = "SOURCE_ROOT"; }; + 2B3407D0626D7910D74E5730 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LADSPAPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B397A82E7CBA92C8FA0131B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBasedDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B654CF3E5F53432E73B0D86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2BA8A348E24FA01FEDAA4FBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 2C09E22A2D6F69F847BE5296 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WavAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2C127393C75D45AC918B05CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScrollBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h"; sourceTree = "SOURCE_ROOT"; }; + 2C204E901887EE1AC09282FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODevice.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2C53D458935EDD6D74D4390A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBoundsConstrainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h"; sourceTree = "SOURCE_ROOT"; }; + 2C6D33A4B1F178774DA92636 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniserFunctions.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 2CB331F5BE20779E5AEBC540 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2D297AFC8E8E9B519D00CF26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; }; + 2D8778974C68084E97C85FEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h"; sourceTree = "SOURCE_ROOT"; }; + 2E2953742C1431A70048C873 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2E74287A8B3F00266B67AA83 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 2E7AE6E8520AA41965C96D58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2E8C5D25AB2D652B5691EB2D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2E90765D015EF5632C2D615B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MissingGLDefinitions.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_MissingGLDefinitions.h"; sourceTree = "SOURCE_ROOT"; }; + 2EDB0A77DEEF290EAA07A3E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_HiddenMessageWindow.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 2F67F63DB8A9E866D2E9A38E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LeakedObjectDetector.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 2F7E8902A1991455A1F5B963 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePointPath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2FB247186481F5110B579138 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 300F36848F2D4A79559B6D6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Toolbar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h"; sourceTree = "SOURCE_ROOT"; }; + 308A0C14FE5712ACF925AA17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; + 30A53BEDFFCEA0BF3C85C0B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CompilerSupport.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h"; sourceTree = "SOURCE_ROOT"; }; + 3105D7A9F6BA318B79DDC438 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; }; + 3187437331BDB6E116DFD5B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsSoftwareRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + 31C333E8B5461842ABD53A72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 31CB45A436EEF3A12214093C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooserDialogBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h"; sourceTree = "SOURCE_ROOT"; }; + 3210AE12F825D9CED282EC8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colour.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3226B9DE4C4E839CB4918EED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Range.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Range.h"; sourceTree = "SOURCE_ROOT"; }; + 32EBBC998E5AD83676410646 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; }; + 32F1879E6FF96C8BDE9C2EBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 331DB96552D8827A3531E620 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PopupMenu.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h"; sourceTree = "SOURCE_ROOT"; }; + 336617A6E385E55360312EF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + 33AAFC22439616A878D7024A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + 33C3EB30E1F7199E0BC8C099 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + 36063F6B7F9D00DAFFACC46B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Message.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Message.h"; sourceTree = "SOURCE_ROOT"; }; + 37E2B8D100CBDDEE568C9D82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReverbAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 37F722083290923E7CC45301 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3890B3CC99A7CF70767E86F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; }; + 38B7C06966C8B0E02ECD9611 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 393CFE634E767D7D67754605 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarModel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3946B6C3F4C5CF77AE29657C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 39ABB40231FE7BB0695CFF2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 39B341C6A96025DA8F67F7F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FilenameComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3A028505018E28D11D56FE59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3A320AE2ABD9443FAA57246B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3AAA6A680D5A6C01BACBB156 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 3AF9A6DA9497798FDF6D2FAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedXLock.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h"; sourceTree = "SOURCE_ROOT"; }; + 3B134E33FAF6A2D476C68EEB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageEffectFilter.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 3B1AB73B105D680E63D600EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; }; + 3B1E4039E71D8E5914733F30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringRef.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringRef.h"; sourceTree = "SOURCE_ROOT"; }; + 3B609DEA3235848EA822C8AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3B96138DDA824185B1B0CDC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3BF362FE18A7BC55816C4465 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; }; + 3C04C48B58867EA02A19DEB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF8.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h"; sourceTree = "SOURCE_ROOT"; }; + 3C539DCE1C0EE05849B234D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V3.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h"; sourceTree = "SOURCE_ROOT"; }; + 3C7C34849B551EF325EEA9BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CriticalSection.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h"; sourceTree = "SOURCE_ROOT"; }; + 3CA397FE5872CE6CB0F72442 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF16.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h"; sourceTree = "SOURCE_ROOT"; }; + 3D5DB95456FD73DF6EF38C62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3DF2F5F789876541B73EA0A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MarkerList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h"; sourceTree = "SOURCE_ROOT"; }; + 3EA94E228D9E4956494DEC53 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3EAFFA56F2F43A1058B3218D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 3EC17246B581310C23EA5F63 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConnectedChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 3EFA5C3DC025E618DAD14A83 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_video/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 3F01FA0D9D23B3A8D322CD03 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Vector3D.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Vector3D.h"; sourceTree = "SOURCE_ROOT"; }; + 3F4BF347280692C4AD70F2D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiFile.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3F56498672689348F97FE1FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyMappingEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FCA25C4DC0E7E70CFC17B37 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FCBFAAF81329700C9160C94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationProperties.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h"; sourceTree = "SOURCE_ROOT"; }; + 3FCCE49E2927562C037B9502 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FFEA694C92E8634104DEF64 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 4026AF7C01AE98E51C186FF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLImage.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.h"; sourceTree = "SOURCE_ROOT"; }; + 40416019EE08694C50FEEB1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MainMenu.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm"; sourceTree = "SOURCE_ROOT"; }; + 4063612DB3C6EFC5F0A2F2C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLPixelFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 40ACDFD1FA477AF57EC46DE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AlertWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 40BD3111FD3F59098D84C7BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.h"; sourceTree = "SOURCE_ROOT"; }; + 40CE01EAB7B475FFDB7B2E27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDBurner.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h"; sourceTree = "SOURCE_ROOT"; }; + 40E81296E8405B6DB08D1A48 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 41249AFDA317DF598918C5CB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 4286F1F40FC3E04B4AE701C2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 42A9118A046157BA8286F106 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BooleanPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 42E8113E2578AA7A73BC5A1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadower.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp"; sourceTree = "SOURCE_ROOT"; }; + 42FDBC613302FACA9FDA8686 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 43023E9280CA4864EC92D5E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilter.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 430BC76CC982DBD7BA922C07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; }; + 439CD9F942C3BEB5F038C381 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 43BE8B9E5193679AA753D8AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 43FDB7EF4E52DAE9FF6D162B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_ComSmartPtr.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h"; sourceTree = "SOURCE_ROOT"; }; + 4499B2E19EEA40B3C258C462 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4503340D22E0C1A30491A805 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XMLCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 4503ADFFDC985C61C84B5577 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LAMEEncoderAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 4510ED9DACF956CD26701FF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PopupMenu.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp"; sourceTree = "SOURCE_ROOT"; }; + 457A44F589184417BEEC66C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPathListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 45BE7811D6EF62D3ACB56906 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODeviceType.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45DD32716673D626B8F2C36D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToggleButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45DDC719491D8A5DF2742D87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CameraDevice.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_CameraDevice.mm"; sourceTree = "SOURCE_ROOT"; }; + 460020F474D8AD5AFA450072 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ZipFile.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h"; sourceTree = "SOURCE_ROOT"; }; + 464DA97D2978A2CA768B8245 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; }; + 46A0CCA7CD813904C9B38AD6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsMediaAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 475280BA3A8D59845C56B2BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableComposite.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"; sourceTree = "SOURCE_ROOT"; }; + 47CB49E5D140AD7BC5E7EA6C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 47CFAC810A119132A9B210A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDBurner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp"; sourceTree = "SOURCE_ROOT"; }; + 48695857FE992FD343D3EFF4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 486C18005FCEA3E0FC43A3D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49800024EAD8F8D3238A90D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AlertWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49D0EA14738CACC0F306EE52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreMidi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49E5420AF938D076F5E962C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; sourceTree = "SOURCE_ROOT"; }; + 49F2DE82396CA941290096FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 49F330138E609BC0B2FCA34C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReaderSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A0B9707656C06AA2DF98695 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A2E5A69C7177BADB85213F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A461606855E42B876AA960F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A7FA27B8AA27DB409E034B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreAudio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AC22D39210D3189BF3C6305 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4ACC11DF3E3FAD545226B517 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 4AE5D614B7AFCAB583208759 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AF88AC28F3B17223B71ADE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4BE79606E126522A5FFCA28A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawablePath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h"; sourceTree = "SOURCE_ROOT"; }; + 4C0C45AA79B864C0AB7B79F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPCompressorOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 4C1559D44A5474E65356E7DD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_formats.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h"; sourceTree = "SOURCE_ROOT"; }; + 4C2A9FBE4440A4885A8E85B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FillType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h"; sourceTree = "SOURCE_ROOT"; }; + 4C36BE67D1173F7989BE5F45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_cryptography.mm"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; }; + 4C4AD880BD869C2D5B9224A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Sampler.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D0E742ECB7DB1F70BF615FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D9D135A8094707A4386F0D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TimeSliceThread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4DAE9FA9C8EC7493491FDEA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; }; + 4DF7445B3EB54343A00CC25C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Slider.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E0D6764579E37009B0A63D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LADSPAPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 4E49D3DFA722AF35FAC2ADEE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageManager.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E6E46FC7CC57977CDEFF7EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLFrameBuffer.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 4E805C7465B906764FDCC079 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PreferencesPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 4EE687A57FE874A6A2386F90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_SystemStats.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm"; sourceTree = "SOURCE_ROOT"; }; + 4FDD1C063357EE9737EED677 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 503B205A90B3DE3B0698F302 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ASIO.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5051361BA7E00F1DC38E5917 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioFormatReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 50FCEB2875B2FCF29C690911 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WindowsMediaAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 51304425CA1B8E486172E4BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Logger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.h"; sourceTree = "SOURCE_ROOT"; }; + 51585B78DC89C3B8C60FB051 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; }; + 523E4436EB863D6DE0298B96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeMovieComponent.h"; path = "../../JuceLibraryCode/modules/juce_video/playback/juce_QuickTimeMovieComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 5301D83E07FBC894AD2458DA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5341780B2FA0848C000E0E78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 536CDDD56182947C118F00FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h"; sourceTree = "SOURCE_ROOT"; }; + 539A97B08CE5685F52310C66 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MACAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h"; sourceTree = "SOURCE_ROOT"; }; + 540011D30E5C05255D2F9F58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SplashScreen.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp"; sourceTree = "SOURCE_ROOT"; }; + 543AABF5A9378ECC67318D8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; + 5591F52441CBA977CBE18BEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5659F3E5E387D79D667939BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentPeer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 568DBF7F795FF57A1DCA7A0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DocumentWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 56CAC3C965D4937837CE291C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; }; + 56FD90C9B255C9842E1DE6E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; }; + 570B0C815598550D71518FB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KnownPluginList.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5742F3D06FFAE3F44F6B7DDA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; }; + 57800AC773D879C937EFFFB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChannelRemappingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 580051596DD113F78E262642 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UndoManager.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 58C6BBACBF0FB679757A6CC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MouseCursor.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm"; sourceTree = "SOURCE_ROOT"; }; + 58E83747D5DAC8B6A43E07E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileLogger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h"; sourceTree = "SOURCE_ROOT"; }; + 595A4B842DF683AB9EA79DB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ZipFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5981B71FC0A50C72374F7114 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 59C362E42C5EF3F3D40F38F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBuilder.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h"; sourceTree = "SOURCE_ROOT"; }; + 5A3068DBC997E07FD8AB7989 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5A4CAD8AC21BEA6913ADCA4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5AFACEA211E6D5FD20E05486 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AiffAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B5933C960929059FBAE8885 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ArrowButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B937EC199DBC45A407C603C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B98A0AA65983E10EBD10268 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ByteOrder.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h"; sourceTree = "SOURCE_ROOT"; }; + 5BA48D2E6A144E1105C70292 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h"; sourceTree = "SOURCE_ROOT"; }; + 5BFF939FEACE52CFB95AA8ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 5C5D51EC34D374F2405AD2D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_ASCII.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h"; sourceTree = "SOURCE_ROOT"; }; + 5C60278796530C3DA50276C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BorderSize.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h"; sourceTree = "SOURCE_ROOT"; }; + 5CA0F3D05AD800921797035C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 5CAC2512334C51B8BF104DD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_basics.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 5CE19C97928B677F84758FD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TimeSliceThread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h"; sourceTree = "SOURCE_ROOT"; }; + 5E7FF52478337A319B91DE48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioUnitPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 5E89580C8BBEEE0ED5E1D442 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessage.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h"; sourceTree = "SOURCE_ROOT"; }; + 5EDD94865096ED9F708C3C59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiDataConcatenator.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"; sourceTree = "SOURCE_ROOT"; }; + 5F67D2D514B5D47933082E8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessage.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FA71CC7ECD6246187689CFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FDBE725B1D50CE6927CBF90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FE6EF8557574AE95CDEBDCA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FF5EB14BABBB07DE73B3084 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_basics.mm"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 6031083E4E57E154D327DA8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageFileFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 60381DB055903614A261149B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDBurner.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm"; sourceTree = "SOURCE_ROOT"; }; + 60441B6BC9A414FFBDEE3FCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 60525010BB1C88CF6C61E37C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 60643938F8115C4B9C64B3EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Value.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h"; sourceTree = "SOURCE_ROOT"; }; + 6105790D35DB968ACBDED81B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 616B784FCB645D3F2616B3E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + 61E2C2900EB986229D82026C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 62524F170AA5B50F631AC2BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; }; + 625FE12CCC970962EE1EC536 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChannelRemappingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 62B12DB571E5AC1A5A5742DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryBlock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp"; sourceTree = "SOURCE_ROOT"; }; + 62B74684D8983778FB42B8C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; }; + 62E8A57D8A56097060C92FB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 62F4498F48F1C7EF813E51C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; }; + 6353AD6AB18E11D61EB6B6B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemPalette.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h"; sourceTree = "SOURCE_ROOT"; }; + 6382DAC327D5E3173D6181B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RSAKey.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6393A472E16D29D70C0734E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 63B6DFA1DCF2656DF1AED8E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathIterator.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h"; sourceTree = "SOURCE_ROOT"; }; + 640CFFA7187DEE068F7C0753 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V1.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6423E0F4C4005A16375EDEB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; }; + 647F2177AEE7083291491B01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; }; + 64AE756DF9D13327062B5CB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilterAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 64E1EEF02B157E8DC3C242BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 663ABFD081965E7CA27A92BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6688F08F6C632F118C44F6DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LinkedListPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 66C7B3330BFC5043D3DDBB07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 68E8FE815DF6E2C80022845F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageListener.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h"; sourceTree = "SOURCE_ROOT"; }; + 6930876C15958A3ECDD37704 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPosition.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h"; sourceTree = "SOURCE_ROOT"; }; + 6943B698E1ED12866C3801EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 6A1833288C936779BEBCF1E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6A972BA75B3E0AEF10002FC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SharedResourcePointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h"; sourceTree = "SOURCE_ROOT"; }; + 6AD2950DCA3BE8F0254A7BCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 6AD481C2B30E01BFEA7A58C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h"; sourceTree = "SOURCE_ROOT"; }; + 6B49B5DFDC05F282422237A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 6B67A8471D27DEDC4814E03D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseEvent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h"; sourceTree = "SOURCE_ROOT"; }; + 6BD68AEA29A058378C87C8F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; }; + 6C67E93B6C5835F8C56C4D99 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Primes.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6D393956AEDE148D19351B48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorGraph.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6D426654FEF78C4A3F5210AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6DCAB9D9819230FBBDC77775 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 6E7E3CCDA1B9DCDF6ADAA206 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextInputTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 6E9ACB572E3F6EC33F1718BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6EDEFBC59811FE7A3C062C76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 6F29FF53262F391E1BCE9081 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_JackAudio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6F4DEF59A671D169B8F05260 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AudioUnitPluginFormat.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"; sourceTree = "SOURCE_ROOT"; }; + 6FD7AEB33E370BE902A5FAE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResamplingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 712FD99244BEDA356A73A60D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 722D1A061B25E3FBA9675BE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h"; sourceTree = "SOURCE_ROOT"; }; + 7285A22D6FF07D252D791F10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 7348654A7CCCA4801FBB3EFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 739B11A050C45AF258B06387 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageManager.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h"; sourceTree = "SOURCE_ROOT"; }; + 73D7E3361C9F1DE5D8264E52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DeletedAtShutdown.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h"; sourceTree = "SOURCE_ROOT"; }; + 74432C5237AEAEAD4E57A807 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiOutput.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"; sourceTree = "SOURCE_ROOT"; }; + 749977704AA15A0D6FA3B11B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTMidiEventList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"; sourceTree = "SOURCE_ROOT"; }; + 74D66A66106B1B8915E67A6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PerformanceCounter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 74D8E7D66C117C36874EE01D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 74DEE32EAF63AB159CB78CCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7505DBC3BDE5012BB93961BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInactivityDetector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp"; sourceTree = "SOURCE_ROOT"; }; + 753A34F64B6F73A234F98929 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Atomic.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h"; sourceTree = "SOURCE_ROOT"; }; + 757A8B98F9B75716D85DF54B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReadWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 75F1705A66786F7665E5D95B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; }; + 76F6FE05DE3CD997025CC52B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RSAKey.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h"; sourceTree = "SOURCE_ROOT"; }; + 77DBA89F84EE6B4ABBCC1392 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_extra.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; }; + 784B8A83FD421680BC516E53 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; }; + 788905256655086DF636DD96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7915D0307004CB1848CEBF67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CoreGraphicsContext.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm"; sourceTree = "SOURCE_ROOT"; }; + 7917F2616381CBD80F54713B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; }; + 7932BB2CDF0BBDB550253B6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; }; + 7951C7C50178ACD194B54EAB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiFile.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h"; sourceTree = "SOURCE_ROOT"; }; + 79E1F731992D801351BECC77 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LiveConstantEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 79F1D358726869315DBCC398 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7A468C67367399CD22A58BEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7A48CB105C5EE20B2AAA3491 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B1D859AB5CE56CB8E6A7A4A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B274A56879F4B2FF235D6D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_events.h"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.h"; sourceTree = "SOURCE_ROOT"; }; + 7B4708510F9CF37DBFCBCB9B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B6963B7C229C4AD0DE95058 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3PluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 7C677CA8CE54B378D929796D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlElement.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h"; sourceTree = "SOURCE_ROOT"; }; + 7C832E30FE9BFBEFAE887F8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; }; + 7C86E886C3FCB671004E1CA2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; + 7CF9048281002D8D75F98E1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryIterator.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h"; sourceTree = "SOURCE_ROOT"; }; + 7D01F2D239C0CCAE25928D26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D2590A39618C876E14DF353 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7DA009176BAA3DAD1B35F5F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; }; + 7DA7642888744B79CAB96BC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Point.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h"; sourceTree = "SOURCE_ROOT"; }; + 7DD99D2BC48E1E19710A258D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_win32.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h"; sourceTree = "SOURCE_ROOT"; }; + 7E0083C78E047CACACAFB8AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseCursor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7E9286C0B1EF625BE9B1795F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiInput.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h"; sourceTree = "SOURCE_ROOT"; }; + 7E9C5924EB87C1AFD7E48B60 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V2.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EA68D693EC63E5AD1B51FF3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 7EB3ECB111689947FA58FAFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyboardFocusTraverser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EEF7CA291E889AFE6C0384D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colours.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EF48AEB39EA3783BB388FCB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SubregionStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h"; sourceTree = "SOURCE_ROOT"; }; + 7EF6686711E9C204C92847B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 7F515A5C01BF1E9F1425DC3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F5DE79ABF9B521118C290F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Identifier.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F85DDE9A5D21D9ED2AC344C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseEvent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7FF5DA77AE30BCDFA2A8B774 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedReadLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h"; sourceTree = "SOURCE_ROOT"; }; + 7FFFC87F068D320D1F98AB72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 800C7B1CC1FFFCD17C8F29B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 80CC3A04767718A98EF73C6A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; }; + 80F49A74411A436E02B91E27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; }; + 813D0754B88F11BEF7E5F9B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 81A363C999CB90C9740E389D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; }; + 81F4BB6ED7E34DC3C55BDA51 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_core/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 82082D02470579C3970E1319 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_QuickTimeMovieComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 82780256661660A08EA18510 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MixerAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 8373BE8898318D58E01ED237 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_video.h"; path = "../../JuceLibraryCode/modules/juce_video/juce_video.h"; sourceTree = "SOURCE_ROOT"; }; + 83786BF097A3C08DF18DFEF4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 839ED2804072F1F4A49795C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableBorderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 83C9D49A4F81FA401E41784E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationProperties.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8406E1E4147F9AC6DFE0D5AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandID.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h"; sourceTree = "SOURCE_ROOT"; }; + 840FE63195B137B03D9D94BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MP3AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 843939FBC4BC176E9C2C909C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h"; sourceTree = "SOURCE_ROOT"; }; + 844707F81B86A6ECFF9D8971 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 844E060288C67CAB524751E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85615ED90EAA77242E8CDED1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 8571CD08413C205569405EFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + 85C0B0A9A2E9011A381F4B6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; }; + 85C576E54AFB35C156C9C831 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPressMappingSet.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85CACE02CBBD24F62F26B2A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedButtonBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85E37A3DAB080D6B242D79BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CharacterFunctions.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp"; sourceTree = "SOURCE_ROOT"; }; + 860657C1D332EB6DA4FA0A21 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSubsectionReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 862FF5E7777476A7D3E98CDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + 866A93C4479BDE4577F5E7B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Font.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h"; sourceTree = "SOURCE_ROOT"; }; + 8684EB51D3FCE5D754454C88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModalComponentManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h"; sourceTree = "SOURCE_ROOT"; }; + 86EE91DC473C33C6434AE0D2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 87119953571F038DDDD7F9BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectangleList.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h"; sourceTree = "SOURCE_ROOT"; }; + 8713AAF990526009F3497D8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8814927B0C28EA1063EEB553 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 88841EBB57CD023273C1B011 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 88AA4521917545383C769507 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 88B96C6E76F7B08D38F859F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_MessageQueue.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h"; sourceTree = "SOURCE_ROOT"; }; + 88F83AF1ABFAE2A428714C4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../JuceLibraryCode/modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; }; + 892492AF888E54878EBDF2A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IPAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h"; sourceTree = "SOURCE_ROOT"; }; + 8A1440773B4C39E9F9BD3B76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_FileChooser.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm"; sourceTree = "SOURCE_ROOT"; }; + 8A4309D233D97D00F33632CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_graphics.h"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.h"; sourceTree = "SOURCE_ROOT"; }; + 8ABADD47FC9A02CFCF692C5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; }; + 8AEE85FD33BBE1492B96A865 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SHA256.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8B24AAB5524D9D206BCCCCDB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableComposite.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h"; sourceTree = "SOURCE_ROOT"; }; + 8B3A7567DB62DF8CAFCB5530 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableShape.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8B62E15410E8C49EEF12207A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AffineTransform.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8BBF100D5672619427BE1FA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TreeView.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h"; sourceTree = "SOURCE_ROOT"; }; + 8BC61A14226B424351065683 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; }; + 8BDD89CC09A6A9A6D525AA03 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LAMEEncoderAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8BF1E2514857E7161B0B5A24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 8C16B3A744FCB89C241242B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V3.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8C38E93442136FBB225D6B60 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BooleanPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8C54EA0E09130998E1F1990F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_URL.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.h"; sourceTree = "SOURCE_ROOT"; }; + 8D007FFA9CCC8CFC8CFA710F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; }; + 8DFBEB59A237F3A6C0C8401F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; }; + 8E9126330B355156F8790C70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageFileFormat.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 8ECCFF38491F5691C77F2FAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorParameter.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"; sourceTree = "SOURCE_ROOT"; }; + 8F23010B5687CC84D5618D94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F25EC17852F450782DB5F6B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPDecompressorInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F37C35FD44479FF319138E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlElement.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F6230411A3D641AA0BD002E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LassoComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8F8508660223DBC2BBDDF0DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemAudioVolume.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"; sourceTree = "SOURCE_ROOT"; }; + 90B68551E96B0F8464427C04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9116D0ADA9D6CF88E29651A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 9176D4AFF29A2331048159E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Javascript.cpp"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp"; sourceTree = "SOURCE_ROOT"; }; + 919BAECE150A694462A66B0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectShowComponent.h"; path = "../../JuceLibraryCode/modules/juce_video/playback/juce_DirectShowComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 92268C4E4F2D4051D5EA1A16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V2.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h"; sourceTree = "SOURCE_ROOT"; }; + 92AD2CC241921A7624BBDD04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NSViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 92CABA9C9B5148FCA22A0503 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + 938F57CE18456266C6E99FC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 93A609B77BEEAFD352361D7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinate.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"; sourceTree = "SOURCE_ROOT"; }; + 93F7CB7B38CB41F67A542FA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 93FB3181F01650023DC78145 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; + 951CBABFDEE3D2B3D9B4B5AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MD5.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h"; sourceTree = "SOURCE_ROOT"; }; + 951F9F842B6D39ACA7107024 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h"; sourceTree = "SOURCE_ROOT"; }; + 954B1EAA307AD2C0889EBBD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; }; + 956FB59B79B022DB0559F9E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_URL.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9598CB11B13DE1EDB5E9621D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 95BAAE8ABA96F23E47FE028D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; }; + 95E4BBD9EA8C59D2DEA56E5E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; }; + 967BE7DD4F2AA7AA8F9738CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + 96E32E150CC5E45E6067077F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9757D7FBF6613C9CB3ADD0CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPressMappingSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h"; sourceTree = "SOURCE_ROOT"; }; + 9762A585C1D71C4F94400DCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 97632D4A7623F329325575B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationBase.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97AA55E057EA63A841B7D8D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97B159555E69DE49F7320D32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97BB49D283A8D63ED258EFC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SubregionStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9822306575C85835E5FE9BCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; }; + 982EAE63C76A2B3D14AE71C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CarbonViewWrapperComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 98459CAB4F58A66FC938D5E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiDocumentPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9867AEE9DE17D49C8D178DED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; }; + 9949FC28A43624DCA6E72AB2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleMessageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 99B77DD42E04FF0406D09889 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageSequence.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h"; sourceTree = "SOURCE_ROOT"; }; + 99BB5424E0582BC9F57DEC0C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLHelpers.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9A31450E90F82EE417285AA4 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = "SOURCE_ROOT"; }; + 9A92AF90D2DE11B7228156DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 9AA91D1ED0BC9774E7CB390F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_CommonFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9B43C25A5A9D794511B62DE9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NormalisableRange.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h"; sourceTree = "SOURCE_ROOT"; }; + 9B83CA7A03621F4DE0B0C3F5 = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioAppExample/Images.xcassets; sourceTree = "SOURCE_ROOT"; }; + 9B922474922B177945F847E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9C5945E0DC5A478CD297A376 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h"; sourceTree = "SOURCE_ROOT"; }; + 9C5DA61556665B8C43C75766 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9CCC3B66878D449D2DCDC072 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; + 9DC2B8E2EDAC6F936794F104 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; }; + 9E2DA063D5F5732154FA5695 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9E641791FABF2F1A03D78D88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Sampler.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h"; sourceTree = "SOURCE_ROOT"; }; + 9ECBD7383597DCB0BA7E6C4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; }; + 9EFF96B9B3A23A7C056B0581 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9F6E4A7EDED0BD437EA25530 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 9F8D6C1ABD279ED354B62B08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9F96C238E158C87719F9FB28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsSoftwareRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9FD68FE75C0CBD0896E4EBCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + A08D898FA47DA70C12397B24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandInfo.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"; sourceTree = "SOURCE_ROOT"; }; + A0E313527F80F4583588DDB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImagePreviewComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + A19ACE84BA53D03B2616C50E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + A2057629D84C356687762D52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; }; + A24F8BB798A8E2C170DC8518 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoManager.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h"; sourceTree = "SOURCE_ROOT"; }; + A331D72512A603E04C52418A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h"; sourceTree = "SOURCE_ROOT"; }; + A4096A02463E8B010F9C59C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableEdgeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + A4545B5C8FFEC73F3BBB79D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; }; + A481F43C38871D9458B86F28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChangeBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + A57A0737C8A86F58F2027B07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageConvolutionKernel.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h"; sourceTree = "SOURCE_ROOT"; }; + A58BA491BD292B245D238175 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; }; + A6CFE6A91CA9226F18A49047 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Typeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h"; sourceTree = "SOURCE_ROOT"; }; + A6DC6B697FE764CC8C71A353 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WavAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + A7414C940C8F954895DD635B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + A7486D0AE6A75CB00582B51C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + A7A5CB392CC227CDF5EA7E1E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; }; + A7EE468F62EBFEF5E321277F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponentPeer.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + A861457F5ADA0DF46036D910 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODevice.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h"; sourceTree = "SOURCE_ROOT"; }; + A86D67E68CFAD9B334F516D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TargetPlatform.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h"; sourceTree = "SOURCE_ROOT"; }; + A8C62A3036CF6C50780F502A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModalComponentManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + A8F70411AAD4401197959817 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; + A91EC6BEEDB3A81DB243C7AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + A91FB8F8BEB8F27DFE68530C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; }; + A9A0D3FDAD0313E1A77E2D49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Clipboard.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp"; sourceTree = "SOURCE_ROOT"; }; + A9BA788E9221207C0E3DD4FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginInstance.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h"; sourceTree = "SOURCE_ROOT"; }; + A9DEBF10F4F5CCD5F66E0BA1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; }; + AA246BE1680359142F137B21 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_android.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_android.h"; sourceTree = "SOURCE_ROOT"; }; + AA373E7C7118660F103ADE1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BasicNativeHeaders.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h"; sourceTree = "SOURCE_ROOT"; }; + AA8DECA06405D75F5B11AD35 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_posix_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + AAB733F168F8456A393AF5DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB1D06FA6F324B4EF0F64315 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB3926902813D7BFAAEDC63E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h"; sourceTree = "SOURCE_ROOT"; }; + AB57B8C265A51D69103BE0A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AnimatedAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB76CA14B22B4705C37C98F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GenericAudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + AB7A36EE23451E5D75C7177B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DragAndDropContainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + ABAEF348E52D72E922D48549 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_ios.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_ios.h"; sourceTree = "SOURCE_ROOT"; }; + ABDC257562E695849038BFF1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MD5.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC1F2D3AD5013F289045A73D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FlacAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC67DBAF871C7E7FADCBD638 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AC816BF89888674E19241E6F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardState.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp"; sourceTree = "SOURCE_ROOT"; }; + ACB76D7E2C25A4817C8FDCBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentPeer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h"; sourceTree = "SOURCE_ROOT"; }; + ACFA5D787D7AA1BA428CE54F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SplashScreen.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h"; sourceTree = "SOURCE_ROOT"; }; + AD151BCF6658FF033B9789AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + ADD90AB47B68EADAD7D3F725 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ActiveXComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + ADECBEF533CED2D774B99350 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; }; + AE6F386520C5A4619B22B213 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathStrokeType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h"; sourceTree = "SOURCE_ROOT"; }; + AE73ADAC40A64E228056B48D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailBase.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h"; sourceTree = "SOURCE_ROOT"; }; + AE852683DCFF55237FB62351 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageListener.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + AEA4CD32C4FE456E56506C23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Matrix3D.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Matrix3D.h"; sourceTree = "SOURCE_ROOT"; }; + AEA83A85BDD39CEC3FBD9176 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; }; + AF3CEE3137EE41BEECC78DF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Font.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp"; sourceTree = "SOURCE_ROOT"; }; + AF542737B98F49AD978433DA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BlowFish.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h"; sourceTree = "SOURCE_ROOT"; }; + AF761727AC666D34DCB621A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableBorderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AFEDC927801DC56DF3222349 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; }; + B01992821789AFF657A25A95 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentAnimator.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp"; sourceTree = "SOURCE_ROOT"; }; + B06A9120276E8875161CFC7D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + B0A56FF4F9C81D030BD6451E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + B0B31336947A0323C5C4FC62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDirectoryScanner.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h"; sourceTree = "SOURCE_ROOT"; }; + B0CBCE56504234420DE443DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"; sourceTree = "SOURCE_ROOT"; }; + B0E0C7BC1C51A5AB11B8939A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; }; + B1662FEBC72BD0D6D068E213 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsPostScriptRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B176F86F3C87EEE822E2F155 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NotificationType.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h"; sourceTree = "SOURCE_ROOT"; }; + B17EE731C57CDAAA661BD735 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h"; sourceTree = "SOURCE_ROOT"; }; + B18908C24779B2DC62D8C08B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AbstractFifo.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h"; sourceTree = "SOURCE_ROOT"; }; + B1DACCEFB2AE44E4BB214303 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; }; + B2261516B51551B88412A38C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HashMap.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h"; sourceTree = "SOURCE_ROOT"; }; + B22CB865D154CC006269A7AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; }; + B2B86A2F102CFD8E8488FC63 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VSTPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + B2D68A91A110274673CE3A35 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FloatVectorOperations.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"; sourceTree = "SOURCE_ROOT"; }; + B33B4C53CBF14DDD6E19F8C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinate.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp"; sourceTree = "SOURCE_ROOT"; }; + B33D87EF6A59AC05F1B4251F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_data_structures.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h"; sourceTree = "SOURCE_ROOT"; }; + B49C928BA4089911E571B50C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSampleBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B4BE33CAEF343E0FD4B10103 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePointPath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h"; sourceTree = "SOURCE_ROOT"; }; + B5165CA4DFC958B7185475D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; }; + B597558E965007A285B6BA6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPositionBehaviours.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h"; sourceTree = "SOURCE_ROOT"; }; + B5B7E1F6324C6FD60A297F4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h"; sourceTree = "SOURCE_ROOT"; }; + B622AB21181705574D25C112 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AttributedString.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp"; sourceTree = "SOURCE_ROOT"; }; + B624AE4FAFD32FBF417CACB0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Files.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm"; sourceTree = "SOURCE_ROOT"; }; + B673500427558C93AF003B49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPath.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h"; sourceTree = "SOURCE_ROOT"; }; + B6C9C5BEA347D048018E3C3D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_QuickTimeAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + B723FCD7D774BA8C2004A66C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + B78BF0336B88A8417A36789C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLFrameBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B78F210CBEC98DC3927F6279 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + B7AC44300255D3234F62D5BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B7CDEAD8A6351A5E844D7C49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + B7E426E1537A9A4C368F77B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h"; sourceTree = "SOURCE_ROOT"; }; + B7FC0F16FE7E00A23076CFB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; }; + B83E98C1E52484053B83DF16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; }; + B84ADDD01BAB1B1E21DDFF07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; }; + B8919AC8BD1D96967D930C30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + B89336F07FA245BCF095469D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandTarget.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp"; sourceTree = "SOURCE_ROOT"; }; + B89C7A3A8EB390F6E84BF882 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; }; + B8A3E8BB179C8B50164D615B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooserDialogBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + B9146449549D87B1DAA4C0B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListenerList.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h"; sourceTree = "SOURCE_ROOT"; }; + B978D74769BDCFDB114870D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorPlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B99ECC1A59ABBFAD154DBF9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Draggable3DOrientation.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h"; sourceTree = "SOURCE_ROOT"; }; + B9BB092F62BADC4763052242 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorGraph.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"; sourceTree = "SOURCE_ROOT"; }; + BA1B1CEFBFF576EAF0692B46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + BABE3E04A41600A763AC8AF5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + BACEE7DB80647D962F0DBDF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; }; + BAFE4394BEC0E150AF48BF9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PlatformDefs.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h"; sourceTree = "SOURCE_ROOT"; }; + BB3684BF46B63D81675D0BE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + BD70FA4626657FF1DEBB10DA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + BD8165288D223488734845AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + BD9613A2555B6D5D4C42736A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DragAndDrop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp"; sourceTree = "SOURCE_ROOT"; }; + BDCE808BFAD59C06CBBFE776 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + BDE2EEE22C37170F8CEA8797 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterProcessLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h"; sourceTree = "SOURCE_ROOT"; }; + BFA5DC7CE5598B5C2FE149D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + BFC744DB1B385F6C0E8D1554 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageConvolutionKernel.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFEB19DB1777D4B340693547 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFF612E6000CE9DEEF603615 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModifierKeys.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h"; sourceTree = "SOURCE_ROOT"; }; + C0064E220804A2A4403BF25B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Uuid.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h"; sourceTree = "SOURCE_ROOT"; }; + C021346BE9368A629B49F866 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; }; + C02D3205CC47AD84F51D9A15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; }; + C02E818DF9C25E072E3F245B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + C0BE59402927B0E12AEB7014 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; }; + C12DBAE88C51C89932CDFDDC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; }; + C2530AB0D290282604A86AFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + C25C525D2EDBC5EFD75C4339 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + C28E74456B994CBEFF443477 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Desktop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp"; sourceTree = "SOURCE_ROOT"; }; + C2B58C343A6660A0323EDE06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Viewport.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h"; sourceTree = "SOURCE_ROOT"; }; + C2C0A562597168B80B601578 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Misc.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp"; sourceTree = "SOURCE_ROOT"; }; + C306A51355C1AB54D28E16F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AffineTransform.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h"; sourceTree = "SOURCE_ROOT"; }; + C3111CF603075D3ECED9F226 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableCornerComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C35FAD80CDE9225FE8939818 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBoundsConstrainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + C361A86BBF930196D9EEF24E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SparseSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h"; sourceTree = "SOURCE_ROOT"; }; + C37008FE99C11BB796974235 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextDiff.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp"; sourceTree = "SOURCE_ROOT"; }; + C3B6F57443BFFA1E5631B596 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentAnimator.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h"; sourceTree = "SOURCE_ROOT"; }; + C3DBF05F1066720451E2078D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + C425F930263580F64831D9F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C46B214480995750981835A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WASAPI.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp"; sourceTree = "SOURCE_ROOT"; }; + C529D64EFD3FFC856653E03C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; }; + C58464A1705EB8BA0C4C67B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResamplingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + C5F759D80F99D4781D8CAB2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; }; + C6427BB39C1B2EE3044ACD0C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + C6A2C9D09ED83DAC671EBE58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourSelector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp"; sourceTree = "SOURCE_ROOT"; }; + C6D29AF6D9C958518FDD217D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_File.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.h"; sourceTree = "SOURCE_ROOT"; }; + C750C5923B4766263329A9C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + C77007B23C05C06BD0C869B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicObject.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h"; sourceTree = "SOURCE_ROOT"; }; + C784E011BA017F188F2064C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + C7FE38B73D4465AFF7A6DE68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInactivityDetector.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h"; sourceTree = "SOURCE_ROOT"; }; + C93A3A190653E956062C3664 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextLayout.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h"; sourceTree = "SOURCE_ROOT"; }; + C95DDDFEA9D017C9AFEBCF48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + C96F3FE78CB92F428474CBE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PixelFormats.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h"; sourceTree = "SOURCE_ROOT"; }; + C9C6E93243BC759D11517CC2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C9E66024B6626A70FC3BB359 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_String.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.h"; sourceTree = "SOURCE_ROOT"; }; + CA090BCA3BA1590142295E0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CA09B7EB9B9E4E867280F85E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XMLCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + CA11F6F4E56E77470FE8D09E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CA8A586B734D80BEADCAD8CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; + CB2089CB6FCE772E8BEDB0A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CB4D18D09CC768F84665E259 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; }; + CB4F3175207004E4E368DED7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; + CB5B87D094112699DB091CAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UIViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CB821AF522BE03A84EA7C92B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedAudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + CBC7832A02C0137078518DC5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; }; + CC18CE89819CC8D1218EE462 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; + CC567FAD26B9E394A678C1EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + CD0CD22666E6AC88E35F01BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Synthesiser.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"; sourceTree = "SOURCE_ROOT"; }; + CD1B5B3A90067C61ED51B3B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + CE21B3DE9134974FC3432234 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; }; + CE29883C83A0CF37463E7944 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + CE40D5629763EC3C551CA1BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; + CE89263BBF56D5FEC9AB8867 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NativeMessageBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h"; sourceTree = "SOURCE_ROOT"; }; + CE94014A314EE7D89859551E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + CEAA216C55B19BDA0EC8CEE7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CEF724781B62A0C66F89313F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF0EDBCB4673BF9FFD4C933C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsPostScriptRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + CF49EF512FC567BB9429E378 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF4C39DEDE3B5A8D188838EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF6F2D6D175E7BD93D969A64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePoint.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h"; sourceTree = "SOURCE_ROOT"; }; + CFB45934EB9FA463FA984F6F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + CFD132190F1F02F6241F4546 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + CFE07619476ED38EAC6F9647 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D0036D9FA73138C1E5EDF333 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardState.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h"; sourceTree = "SOURCE_ROOT"; }; + D0EB5A8457B29149A94236FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; }; + D1541A8D28A7E2DA898DB59D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Viewport.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp"; sourceTree = "SOURCE_ROOT"; }; + D15914EEFE2CA042E302C786 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + D190465EBAD29EA6160F4127 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + D19DEFE723E50138AC8ED9BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; }; + D1BB52076C130046B5415EF4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OptionalScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + D2026CB37FFDE5628F9F2744 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D22534A41E9BE6B47C9D7174 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsRegistry.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h"; sourceTree = "SOURCE_ROOT"; }; + D2542778D9FD06E8EA7A9588 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleMessageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D316E361296F28165ED17FBA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AiffAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + D3733B6D3F7076FFBD78E7D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPairArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + D37F73F569826C561E9E3CAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D3B2355F44296AD9D95EB818 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLImage.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + D3B9F06E8AB5BDEA5E7D40FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; }; + D3BFF0E11D3F9A7418ECA895 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemFactory.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"; sourceTree = "SOURCE_ROOT"; }; + D3E6E10241BBF62F012DE17B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableCornerComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D415AB806C286DA891754669 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HeapBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h"; sourceTree = "SOURCE_ROOT"; }; + D495C8AEA9C425AEAD4C4C71 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KnownPluginList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h"; sourceTree = "SOURCE_ROOT"; }; + D4B969973C0512F6EB6FA8F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPress.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"; sourceTree = "SOURCE_ROOT"; }; + D4C1710FD87D3FA13578AB06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + D5330C75A79D3FD00D88FF09 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D5963FFBD0218E61EEF08DB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + D5C686A4A13CFB91BF5D9872 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_QuickTimeMovieComponent.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + D61868F31EC3C8263BE5B245 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + D62F91E1F9DEB23A673CC1F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; }; + D63F2AC41A283C157196FB86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; }; + D66DBA597A75CF2493B59196 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; }; + D67366CBC83982075998AA7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemStats.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h"; sourceTree = "SOURCE_ROOT"; }; + D78365C74082A1253E12AF17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; }; + D7867DB9C17425E3F05EB860 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + D7D4FEB8E7079BF5B134D6B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationBase.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h"; sourceTree = "SOURCE_ROOT"; }; + D7F68D8960AACA6245520A48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponentPeer.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + D80D581E223759749FE8D070 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; }; + D8D8E59CC4906683F54E9E47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + D93E3D50064EC0D791C9B0EA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + D94DE0E3A7E3FD8EC33DFEFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; }; + D9E19C612A4FA1C4A7B46527 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToneGeneratorAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + D9E7F3EEF988179D04967CCA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLRenderer.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + DA2FFAF8C0EB7C47B430EE81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImagePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + DA50A3FF89D3196E58D52B67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Reverb.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h"; sourceTree = "SOURCE_ROOT"; }; + DB4FC6CEF47E8B3D7CB815B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + DB56D9790F29378B0216B337 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPress.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h"; sourceTree = "SOURCE_ROOT"; }; + DC0CA22BBBC628E6EBDE0E82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDirectoryScanner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC304B5B9D28E460FA25A508 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioTransportSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC3AF8B79000B8358A770D0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC7DDDB1C5B1333B6B9BF16E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + DD85A7C7C7CBE5563E68D702 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + DD98635CE638C144FA2E242A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BlowFish.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp"; sourceTree = "SOURCE_ROOT"; }; + DE3F83973A82BDECF6ECFFAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceSelectorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + DE7823A252414C8CBA93C5C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; }; + DED4BF9B00F268737A022927 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BigInteger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF65288A6A46308AC0BA2DE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentMovementWatcher.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF6AF4691ADCCB658CDDD3A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CPlusPlusCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF8341365E508EF7C920EC8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h"; sourceTree = "SOURCE_ROOT"; }; + DF8CA42CB14C9E5364E95A15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF8D7EE925553441ABDF0CAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + DFD91A1BE91582A859C4670E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourGradient.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp"; sourceTree = "SOURCE_ROOT"; }; + E0C8E29DC24A765B2E5933B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Audio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; + E0CB2F2E31EC9D0016BD85D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_ALSA.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp"; sourceTree = "SOURCE_ROOT"; }; + E16D622EC9DA6421FFD576F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDiff.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h"; sourceTree = "SOURCE_ROOT"; }; + E17497C4AB8166E29E150D3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDataConverters.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"; sourceTree = "SOURCE_ROOT"; }; + E1BCCD17CADC08D4D9A04EB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MarkerList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp"; sourceTree = "SOURCE_ROOT"; }; + E1D5C29A0E7FAD3D57ECAC13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; + E212786B086F213B7CA4ED6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + E21819B823D258F2BBBF2E26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTouchMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h"; sourceTree = "SOURCE_ROOT"; }; + E2769AA38838844A6522E4FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + E2E9CC735C960A8973F4392C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + E2EC1BD03575EB805C4B596C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E30662968DCE42D8335E2018 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E359F912B3AA352526540013 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageCache.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h"; sourceTree = "SOURCE_ROOT"; }; + E4235522A4F43044A5C38CA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; }; + E44572B81F6B4EAC081E43C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HyperlinkButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h"; sourceTree = "SOURCE_ROOT"; }; + E49DAB373744B917B597168F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + E4B21BCB36AC68D6C668C71A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_events/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + E4CA9545347A800A6C1ED958 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; }; + E4CD3BB664E6B293A11DCB79 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; }; + E5368BA7395DEF8CE20D015C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ProgressBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h"; sourceTree = "SOURCE_ROOT"; }; + E6C669BDC1B76977D02A4496 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; }; + E73FE1D1751A2D585498CD1F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + E77B60A2AAFFB97BEE8787DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLShaderProgram.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp"; sourceTree = "SOURCE_ROOT"; }; + E7D854EC010D103AD186C045 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V1.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h"; sourceTree = "SOURCE_ROOT"; }; + E8DB4F9E74B0A892FF6BCEA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E92C83774EC4A9A14E22109C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrowButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h"; sourceTree = "SOURCE_ROOT"; }; + E9466E9B4B931B30614DB451 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + E994488A0B4220B5CA064DCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; }; + E9C5BFCDB8C13234747AFC36 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Threads.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm"; sourceTree = "SOURCE_ROOT"; }; + E9E0DFA8D3086DFC49FE9BC8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnection.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h"; sourceTree = "SOURCE_ROOT"; }; + E9E561D369DDD9CD345B6EFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + EA5429B693398BBF8E0F2989 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; }; + EB170E698EB7CDECEC5CE6F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h"; sourceTree = "SOURCE_ROOT"; }; + EB344019F1D9C39FFB25E0ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLHelpers.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + EBA666E871E270CD6F91D93A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + EBC68EA7DFAFD1C3480B9795 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; }; + EE2BA717DB664BADF933F60B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + EE945B4782B670634758BC5A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReaderSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h"; sourceTree = "SOURCE_ROOT"; }; + F5B5D441C4AB1D01509ACC8D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; + 4B8E8BD3DEAE0C479D04F571 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioAppExample.app; sourceTree = "BUILT_PRODUCTS_DIR"; }; + E17B9162F7ADAC361931FBAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; }; + E20FCEA20002673DAB213DE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPath.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + E9E3B13731D22B3D6F3D2CFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPlayHead.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h"; sourceTree = "SOURCE_ROOT"; }; + E9E841ADBBC042392915FEFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + EA208A14CC3F7F4FFE7D8962 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; }; + EC8BBDB5C2602261C54A51C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; }; + ECB835BD3A66AC09C9A2373E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutResizerBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"; sourceTree = "SOURCE_ROOT"; }; + ED33A2B09FF895FD2AFA55E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + ED3EEE79647EE49BBBE6D88F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemPalette.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"; sourceTree = "SOURCE_ROOT"; }; + ED8229C37893B6CB49A015E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; + ED8538AE8303587EA5EF8583 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ios_Audio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; + EDDCF64D7E3D1071D1A4456C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectSound.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"; sourceTree = "SOURCE_ROOT"; }; + EDFC0BBD478F8BD69086818D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoableAction.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h"; sourceTree = "SOURCE_ROOT"; }; + EE65A722876EAC5535E2E1B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + EEE5278B630EFE1E15E5293B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PerformanceCounter.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h"; sourceTree = "SOURCE_ROOT"; }; + EF14EE3000D22F77D8EF4AA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF29698E99DE8B5E351EF371 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharacterFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + EF2FF8917F057B26DD01D313 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentDragger.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h"; sourceTree = "SOURCE_ROOT"; }; + EF4C6DC600C1ACC3FCC13164 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF6D81709098F6089B9C09F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TopLevelWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF723B3B26FFC52C7DF6E6FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF8E221F84DBFB90BA0D2121 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + EFDD51F6A181F486AF703F0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h"; sourceTree = "SOURCE_ROOT"; }; + F05F461001AD96C6FC4B5C1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarModel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h"; sourceTree = "SOURCE_ROOT"; }; + F11E22ECFEDD82EB6AE31B39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F12DB648151CB7EEE41E3582 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Expression.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.h"; sourceTree = "SOURCE_ROOT"; }; + F151FE866ECF5DD08EF23B48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ElementComparator.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h"; sourceTree = "SOURCE_ROOT"; }; + F15FDAFFD05E09B75A756D84 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; }; + F1913401D136456F4AF1CBAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertiesFile.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h"; sourceTree = "SOURCE_ROOT"; }; + F1B8D70C8902891CB3FDEFA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; }; + F1F86FFAF4BCB107ED39562B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; + F2269D1A1B850D15450A5006 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; }; + F29D4C985EBD26195FDE1F33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + F2C0E342185658E546F7F142 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h"; sourceTree = "SOURCE_ROOT"; }; + F2D3BDC0E875579221855867 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlyphArrangement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"; sourceTree = "SOURCE_ROOT"; }; + F31D86BA24EC2678D56947E7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + F3236AAEA9276CA4B633DE8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GenericAudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + F323DA193037B345B8B91B77 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + F38318C3981F03CA0DCB810C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F3B5B1EA1A0F1FA07B06B163 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CaretComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F3FBF9B8D43CD49F6284731F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + F4232A519854A8076D1B9222 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipClient.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h"; sourceTree = "SOURCE_ROOT"; }; + F51D8294D9047C68D2B9C27F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + F60198B5239A2A70FBDD83CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilenameComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F66D18E475FEF3DB6F568285 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BigInteger.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h"; sourceTree = "SOURCE_ROOT"; }; + F67B20BDC3763E7C26257339 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; }; + F6CA7D8756206BDEB26554FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDescription.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h"; sourceTree = "SOURCE_ROOT"; }; + F70BCFFF8A0FCDDDB8B8E4BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + F752AE98467F8E7D4CEA7C43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Quaternion.h"; path = "../../JuceLibraryCode/modules/juce_opengl/geometry/juce_Quaternion.h"; sourceTree = "SOURCE_ROOT"; }; + F78B51284578A0A67A33F2EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Button.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7A7C95D6FE1A72B58188DE4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7C1341B3E7AE121F6890199 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7F2A8C5CE190B9E1EC47F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F84CFFCD3ADC99BBA44596EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToneGeneratorAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + F8747A84949D635402589C34 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UnitTest.h"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h"; sourceTree = "SOURCE_ROOT"; }; + F8C0B0742DB274931684B5D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + F9081A768B4EB35F3D61E8DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CoreAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + F91867A7117E05D031730E9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Time.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.h"; sourceTree = "SOURCE_ROOT"; }; + F96F6A11BD1D60CAEB22A3F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Fonts.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm"; sourceTree = "SOURCE_ROOT"; }; + F9A8389F52F21B93248B1E86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLExtensions.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGLExtensions.h"; sourceTree = "SOURCE_ROOT"; }; + F9E8B1F179E908E5A74EE145 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageSequence.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp"; sourceTree = "SOURCE_ROOT"; }; + F9FD00F994947C4396D857C5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditorKeyMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"; sourceTree = "SOURCE_ROOT"; }; + FA051E65BFEBED1313E7AD16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + FA9676810AF2F38EBD37199C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AttributedString.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h"; sourceTree = "SOURCE_ROOT"; }; + FAAE7C83BF1CFD11D34A04FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + FACDCE3863025B8A344171CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + FAF51CBC640AA4E56CC7E959 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeTime.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h"; sourceTree = "SOURCE_ROOT"; }; + FB17443A29A0BFCE1499C18E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_freetype_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + FB744E5DA149818A9ED58B6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + FB80D16B738E90DE96B8E361 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + FBBB399A45139BD4F9ED91C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + FBE7E25D937712E9B0F7DE0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Value.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp"; sourceTree = "SOURCE_ROOT"; }; + FD71F052D94248F16F02B388 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableObjectResizer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE52A4CBC9C8CF6D6130DB56 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PreferencesPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE7F21B2C968EDD120A18B00 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GroupComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE8B5BD29D8F426DC6320B17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF805A59A17E6F6F579F0F67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + C366FD2226833583ECDE68D2 = {isa = PBXGroup; children = ( + 2545022A0EE088A0C46EBD13, + D78365C74082A1253E12AF17, ); name = Source; sourceTree = ""; }; + 24BF2D05D134C386864C4C7D = {isa = PBXGroup; children = ( + C366FD2226833583ECDE68D2, ); name = AudioAppExample; sourceTree = ""; }; + F2E49DBAE98ABA5E5C031BCF = {isa = PBXGroup; children = ( + 788905256655086DF636DD96, + E17497C4AB8166E29E150D3B, + B49C928BA4089911E571B50C, + 2FB247186481F5110B579138, + 32EBBC998E5AD83676410646, + B2D68A91A110274673CE3A35, ); name = buffers; sourceTree = ""; }; + 20B9CD59936ECA4363FCCCA8 = {isa = PBXGroup; children = ( + B7AC44300255D3234F62D5BC, + 3AAA6A680D5A6C01BACBB156, + 3F4BF347280692C4AD70F2D3, + 7951C7C50178ACD194B54EAB, + AC816BF89888674E19241E6F, + D0036D9FA73138C1E5EDF333, + 5F67D2D514B5D47933082E8C, + 5E89580C8BBEEE0ED5E1D442, + F9E8B1F179E908E5A74EE145, + 99B77DD42E04FF0406D09889, ); name = midi; sourceTree = ""; }; + 0986D33A60CD7179F02B9913 = {isa = PBXGroup; children = ( + E17B9162F7ADAC361931FBAC, + 0BE56E18575B1EAB8F889666, + 43023E9280CA4864EC92D5E8, + 002827E70384CB5051DC2794, + 1DBB7AD294F9BEB842690992, + DA50A3FF89D3196E58D52B67, ); name = effects; sourceTree = ""; }; + EFE5C5B22FE69C3D3F927196 = {isa = PBXGroup; children = ( + 6AD2950DCA3BE8F0254A7BCE, + 5591F52441CBA977CBE18BEF, + BFA5DC7CE5598B5C2FE149D9, + 625FE12CCC970962EE1EC536, + 57800AC773D879C937EFFFB5, + 64AE756DF9D13327062B5CB1, + 28697A80BA58B9660B88AA23, + 1B103C1C32376CBF2394789A, + 82780256661660A08EA18510, + E9E841ADBBC042392915FEFE, + 6FD7AEB33E370BE902A5FAE2, + C58464A1705EB8BA0C4C67B5, + 37E2B8D100CBDDEE568C9D82, + 85615ED90EAA77242E8CDED1, + D9E19C612A4FA1C4A7B46527, + F84CFFCD3ADC99BBA44596EE, ); name = sources; sourceTree = ""; }; + DA41D3DA8DDD60C67A4A2AE9 = {isa = PBXGroup; children = ( + 2B654CF3E5F53432E73B0D86, + CD0CD22666E6AC88E35F01BA, ); name = synthesisers; sourceTree = ""; }; + 42D107F741897BBB52B61202 = {isa = PBXGroup; children = ( + F2E49DBAE98ABA5E5C031BCF, + 20B9CD59936ECA4363FCCCA8, + 0986D33A60CD7179F02B9913, + EFE5C5B22FE69C3D3F927196, + DA41D3DA8DDD60C67A4A2AE9, + 0F29F3A4AE661CEF5467732F, + 23EDC268BE997399F443A16F, ); name = "juce_audio_basics"; sourceTree = ""; }; + CB1B7A138B91EEBE7BFE8C37 = {isa = PBXGroup; children = ( + 3B96138DDA824185B1B0CDC8, + EFDD51F6A181F486AF703F0D, + 2C204E901887EE1AC09282FF, + A861457F5ADA0DF46036D910, + 45BE7811D6EF62D3ACB56906, + 8DFBEB59A237F3A6C0C8401F, + 8F8508660223DBC2BBDDF0DE, ); name = "audio_io"; sourceTree = ""; }; + 11FB0A16BC11F8811563E23C = {isa = PBXGroup; children = ( + 7E9286C0B1EF625BE9B1795F, + 0B10218E1440362CF414330C, + 1F5AB21B8BB5572345F16D3A, + 74432C5237AEAEAD4E57A807, + 1BEE7899664040AC3C5866D0, ); name = "midi_io"; sourceTree = ""; }; + FA179D6940326B16EA8F4EBE = {isa = PBXGroup; children = ( + AAB733F168F8456A393AF5DC, + 058ACC9BACC273A0CD4AD526, + DC304B5B9D28E460FA25A508, + 05F4D303872E30E0E100B178, ); name = sources; sourceTree = ""; }; + DB3BC4FF9BBE474A50B1BD39 = {isa = PBXGroup; children = ( + 40CE01EAB7B475FFDB7B2E27, + FB80D16B738E90DE96B8E361, + F2C0E342185658E546F7F142, ); name = "audio_cd"; sourceTree = ""; }; + 75059FB5256785C4D9234524 = {isa = PBXGroup; children = ( + E0C8E29DC24A765B2E5933B7, + C95DDDFEA9D017C9AFEBCF48, + 4A2E5A69C7177BADB85213F1, + ED8538AE8303587EA5EF8583, + E0CB2F2E31EC9D0016BD85D5, + 1E1FBFEE80C3686ADE3B4F0A, + 6F29FF53262F391E1BCE9081, + 8713AAF990526009F3497D8B, + 60381DB055903614A261149B, + 27E49EEFD8649E9F26DBF49E, + 4A7FA27B8AA27DB409E034B6, + 49D0EA14738CACC0F306EE52, + 5EDD94865096ED9F708C3C59, + 503B205A90B3DE3B0698F302, + 47CFAC810A119132A9B210A5, + 0F40E9138B6D40184283AC89, + EDDCF64D7E3D1071D1A4456C, + 9E2DA063D5F5732154FA5695, + C46B214480995750981835A8, ); name = native; sourceTree = ""; }; + C1CFAF0419BB789AA0E38629 = {isa = PBXGroup; children = ( + CB1B7A138B91EEBE7BFE8C37, + 11FB0A16BC11F8811563E23C, + FA179D6940326B16EA8F4EBE, + DB3BC4FF9BBE474A50B1BD39, + 75059FB5256785C4D9234524, + 86EE91DC473C33C6434AE0D2, + 1CC58E8F3AF64BE9788945BD, ); name = "juce_audio_devices"; sourceTree = ""; }; + A829EEC7C9D388964229DE57 = {isa = PBXGroup; children = ( + 23497CEA84E011F94678DC68, + D93E3D50064EC0D791C9B0EA, + CFB45934EB9FA463FA984F6F, + ED33A2B09FF895FD2AFA55E8, + FF805A59A17E6F6F579F0F67, + DB4FC6CEF47E8B3D7CB815B6, + 49F330138E609BC0B2FCA34C, + EE945B4782B670634758BC5A, + A2057629D84C356687762D52, + 20D894CA430125D6180ACA0B, + 860657C1D332EB6DA4FA0A21, + 1804F385A9B946734797C612, + 5051361BA7E00F1DC38E5917, + B78F210CBEC98DC3927F6279, + CB821AF522BE03A84EA7C92B, ); name = format; sourceTree = ""; }; + FA1254B776BFC3471DB96D0E = {isa = PBXGroup; children = ( + 5AFACEA211E6D5FD20E05486, + D316E361296F28165ED17FBA, + 42FDBC613302FACA9FDA8686, + F9081A768B4EB35F3D61E8DE, + AC1F2D3AD5013F289045A73D, + 0B8875740103D9A0E34317DE, + 8BDD89CC09A6A9A6D525AA03, + 4503ADFFDC985C61C84B5577, + 1ECCF86BD5C7ABBD8FBF6652, + 840FE63195B137B03D9D94BA, + 17C63BCBC9FC8596F5EBED8E, + 29F0D7BF3731A741411D18A3, + B6C9C5BEA347D048018E3C3D, + 31C333E8B5461842ABD53A72, + 2C09E22A2D6F69F847BE5296, + A6DC6B697FE764CC8C71A353, + 50FCEB2875B2FCF29C690911, + 46A0CCA7CD813904C9B38AD6, ); name = codecs; sourceTree = ""; }; + 2A60CB51A3C591E01CB900F8 = {isa = PBXGroup; children = ( + 4C4AD880BD869C2D5B9224A8, + 9E641791FABF2F1A03D78D88, ); name = sampler; sourceTree = ""; }; + BCC969C3BC478853FD7E336F = {isa = PBXGroup; children = ( + A829EEC7C9D388964229DE57, + FA1254B776BFC3471DB96D0E, + 2A60CB51A3C591E01CB900F8, + 47CB49E5D140AD7BC5E7EA6C, + 4C1559D44A5474E65356E7DD, ); name = "juce_audio_formats"; sourceTree = ""; }; + F94E85FEB3110173DE42317B = {isa = PBXGroup; children = ( + E9E3B13731D22B3D6F3D2CFB, + A9BA788E9221207C0E3DD4FA, + 3D5DB95456FD73DF6EF38C62, + 722D1A061B25E3FBA9675BE8, + 24D1CEB29BC23FB571BE0EC8, + 6B49B5DFDC05F282422237A3, + 6D393956AEDE148D19351B48, + B9BB092F62BADC4763052242, + 1199E7838DDE8C2C910335E6, + 8ECCFF38491F5691C77F2FAD, + F3236AAEA9276CA4B633DE8C, + AB76CA14B22B4705C37C98F3, + 1B736A8E8EE2F4C270C8F2FB, + F6CA7D8756206BDEB26554FD, ); name = processors; sourceTree = ""; }; + 9EEB441FDDAE7DD5F3E24041 = {isa = PBXGroup; children = ( + 19ABD47BB707333435D2CF3F, + 2678394F8161FBC107B8426C, + D5963FFBD0218E61EEF08DB3, + CC567FAD26B9E394A678C1EC, ); name = format; sourceTree = ""; }; + 2897EA058D69BF9B0C8A446D = {isa = PBXGroup; children = ( + 5E7FF52478337A319B91DE48, + 6F4DEF59A671D169B8F05260, + 2B3407D0626D7910D74E5730, + 4E0D6764579E37009B0A63D9, + 308A0C14FE5712ACF925AA17, + CA8A586B734D80BEADCAD8CB, + 0E79750D244E5C95E94DAF88, + 7B6963B7C229C4AD0DE95058, + 749977704AA15A0D6FA3B11B, + B2B86A2F102CFD8E8488FC63, + 0F9C7DD8B8CA6807E02134AA, ); name = "format_types"; sourceTree = ""; }; + 83B7987F50AC8F2EE5E1C2A0 = {isa = PBXGroup; children = ( + 570B0C815598550D71518FB8, + D495C8AEA9C425AEAD4C4C71, + DC0CA22BBBC628E6EBDE0E82, + B0B31336947A0323C5C4FC62, + CF4C39DEDE3B5A8D188838EB, + 0AAD0F08AF5170AEB68F9191, ); name = scanning; sourceTree = ""; }; + 0F1330B9E634C8C1D2A19EAD = {isa = PBXGroup; children = ( + F94E85FEB3110173DE42317B, + 9EEB441FDDAE7DD5F3E24041, + 2897EA058D69BF9B0C8A446D, + 83B7987F50AC8F2EE5E1C2A0, + 48695857FE992FD343D3EFF4, + 204605387364B68F56B522C1, ); name = "juce_audio_processors"; sourceTree = ""; }; + 785AC00FC0793B0127274AAB = {isa = PBXGroup; children = ( + 4499B2E19EEA40B3C258C462, + 9598CB11B13DE1EDB5E9621D, + DE3F83973A82BDECF6ECFFAA, + 1ED7F9F098974D1824E98397, + F2269D1A1B850D15450A5006, + CC18CE89819CC8D1218EE462, + AE73ADAC40A64E228056B48D, + 7A48CB105C5EE20B2AAA3491, + 1C53C4F34A3547694B6DC964, + 64E1EEF02B157E8DC3C242BB, + D37F73F569826C561E9E3CAF, ); name = gui; sourceTree = ""; }; + 7B29609B00A97DB47552F081 = {isa = PBXGroup; children = ( + B978D74769BDCFDB114870D6, + 7DA009176BAA3DAD1B35F5F0, ); name = players; sourceTree = ""; }; + DCA2C59535A97CCC2E7E5D5B = {isa = PBXGroup; children = ( + 785AC00FC0793B0127274AAB, + 7B29609B00A97DB47552F081, + D190465EBAD29EA6160F4127, + 09E6748FEA21346ED9524265, ); name = "juce_audio_utils"; sourceTree = ""; }; + D4AD8131D5DDC542D8D8462D = {isa = PBXGroup; children = ( + 85E37A3DAB080D6B242D79BF, + EF29698E99DE8B5E351EF371, + 5C5D51EC34D374F2405AD2D6, + 3C04C48B58867EA02A19DEB9, + 3CA397FE5872CE6CB0F72442, + 62B74684D8983778FB42B8C3, + 7F5DE79ABF9B521118C290F4, + 2091E99CE600D2CE4AB578ED, + 1FDE5979B036F7ABC463E315, + 80F49A74411A436E02B91E27, + 464DA97D2978A2CA768B8245, + 5A3068DBC997E07FD8AB7989, + C9E66024B6626A70FC3BB359, + 7B4708510F9CF37DBFCBCB9B, + E4235522A4F43044A5C38CA9, + D3733B6D3F7076FFBD78E7D6, + 6BD68AEA29A058378C87C8F0, + 0744962768C86A35D6715A15, + 8D007FFA9CCC8CFC8CFA710F, + 3B1E4039E71D8E5914733F30, + C37008FE99C11BB796974235, + E16D622EC9DA6421FFD576F3, ); name = text; sourceTree = ""; }; + 66CEC72801EF9BE77D39B19F = {isa = PBXGroup; children = ( + DED4BF9B00F268737A022927, + F66D18E475FEF3DB6F568285, + 7D01F2D239C0CCAE25928D26, + F12DB648151CB7EEE41E3582, + 7EF6686711E9C204C92847B7, + 9B43C25A5A9D794511B62DE9, + 17E6C78A4D618FA739394B9A, + 40BD3111FD3F59098D84C7BE, + 3226B9DE4C4E839CB4918EED, ); name = maths; sourceTree = ""; }; + 9C56D83D3BDD05DEF239F71C = {isa = PBXGroup; children = ( + 753A34F64B6F73A234F98929, + 5B98A0AA65983E10EBD10268, + 1207768208DE16246677EEB7, + D415AB806C286DA891754669, + 2F67F63DB8A9E866D2E9A38E, + 0B0A6273D0438F94A0C00793, + 62B12DB571E5AC1A5A5742DC, + 032DDE8B772727B97389F022, + D1BB52076C130046B5415EF4, + 0C9B17E257DF0D263890AC69, + 39ABB40231FE7BB0695CFF2A, + 6A972BA75B3E0AEF10002FC9, + 9CCC3B66878D449D2DCDC072, + 81A363C999CB90C9740E389D, ); name = memory; sourceTree = ""; }; + 7F38B22DBF6D9255AD0FF626 = {isa = PBXGroup; children = ( + 14DC16A9C4FFE20764935170, + B18908C24779B2DC62D8C08B, + 1F87E9DB5370F34BDCA80E61, + 1D90D583FA45AECD95ABCA46, + 5FDBE725B1D50CE6927CBF90, + C77007B23C05C06BD0C869B5, + F151FE866ECF5DD08EF23B48, + B2261516B51551B88412A38C, + 6688F08F6C632F118C44F6DF, + 7F515A5C01BF1E9F1425DC3A, + E4CA9545347A800A6C1ED958, + 7C832E30FE9BFBEFAE887F8E, + F1B8D70C8902891CB3FDEFA3, + B0E0C7BC1C51A5AB11B8939A, + C02D3205CC47AD84F51D9A15, + 5742F3D06FFAE3F44F6B7DDA, + 62F4498F48F1C7EF813E51C6, + C361A86BBF930196D9EEF24E, + EA5429B693398BBF8E0F2989, + EBC68EA7DFAFD1C3480B9795, ); name = containers; sourceTree = ""; }; + 0AB06DB5C2631EB668C528A2 = {isa = PBXGroup; children = ( + 250858304ABC5EC4C5B9D876, + 49F2DE82396CA941290096FA, + 3C7C34849B551EF325EEA9BC, + B1DACCEFB2AE44E4BB214303, + C02E818DF9C25E072E3F245B, + 3105D7A9F6BA318B79DDC438, + BDE2EEE22C37170F8CEA8797, + 9822306575C85835E5FE9BCF, + 5FA71CC7ECD6246187689CFF, + 757A8B98F9B75716D85DF54B, + 7932BB2CDF0BBDB550253B6C, + 7FF5DA77AE30BCDFA2A8B774, + 938F57CE18456266C6E99FC4, + 8BC61A14226B424351065683, + 159C514EC2AC5B7C89F19F37, + 9DC2B8E2EDAC6F936794F104, + EC8BBDB5C2602261C54A51C3, + B0A56FF4F9C81D030BD6451E, + 9ECBD7383597DCB0BA7E6C4F, + 4D9D135A8094707A4386F0D3, + 5CE19C97928B677F84758FD1, + C0BE59402927B0E12AEB7014, ); name = threads; sourceTree = ""; }; + 403635C774A6BBC0F6980B64 = {isa = PBXGroup; children = ( + 74D66A66106B1B8915E67A6E, + EEE5278B630EFE1E15E5293B, + 4AC22D39210D3189BF3C6305, + FAF51CBC640AA4E56CC7E959, + B5165CA4DFC958B7185475D2, + F91867A7117E05D031730E9F, ); name = time; sourceTree = ""; }; + BC7512A77A4AB71F889C67BE = {isa = PBXGroup; children = ( + 3EA94E228D9E4956494DEC53, + 7CF9048281002D8D75F98E1C, + D80D581E223759749FE8D070, + C6D29AF6D9C958518FDD217D, + 37F722083290923E7CC45301, + 16E0712BBC4355F3D2854D5D, + 60525010BB1C88CF6C61E37C, + F323DA193037B345B8B91B77, + 6A1833288C936779BEBCF1E7, + 6943B698E1ED12866C3801EF, + E20FCEA20002673DAB213DE6, + B673500427558C93AF003B49, + 9C5945E0DC5A478CD297A376, + FE8B5BD29D8F426DC6320B17, + 9867AEE9DE17D49C8D178DED, + B7CDEAD8A6351A5E844D7C49, + 28EB7629415CAFD5EA443ADD, ); name = files; sourceTree = ""; }; + 8BBFA220942050CA89C4222B = {isa = PBXGroup; children = ( + 90B68551E96B0F8464427C04, + 892492AF888E54878EBDF2A8, + 7B1D859AB5CE56CB8E6A7A4A, + 539A97B08CE5685F52310C66, + 7D2590A39618C876E14DF353, + C021346BE9368A629B49F866, + AFEDC927801DC56DF3222349, + 0DDC18CBD62470AE422E4571, + 956FB59B79B022DB0559F9E2, + 8C54EA0E09130998E1F1990F, ); name = network; sourceTree = ""; }; + 50B1E864B2356E8572B9A62F = {isa = PBXGroup; children = ( + 125FF844F4BED2DA55F1CB14, + 0FA2744FC75AA85A7B01AC72, + 439CD9F942C3BEB5F038C381, + 5BFF939FEACE52CFB95AA8ED, + C12DBAE88C51C89932CDFDDC, + C750C5923B4766263329A9C0, + 9A92AF90D2DE11B7228156DE, + 6393A472E16D29D70C0734E6, + E9E561D369DDD9CD345B6EFE, + 3A028505018E28D11D56FE59, + 247DBA4DAA228F551077F55D, + F7C1341B3E7AE121F6890199, + 83786BF097A3C08DF18DFEF4, + 97BB49D283A8D63ED258EFC9, + 7EF48AEB39EA3783BB388FCB, ); name = streams; sourceTree = ""; }; + 401A32949AE4A75BF94D58BF = {isa = PBXGroup; children = ( + 0D9FFE7342AC6AA69831D982, + 58E83747D5DAC8B6A43E07E7, + A91FB8F8BEB8F27DFE68530C, + 51304425CA1B8E486172E4BB, ); name = logging; sourceTree = ""; }; + 8C087A97055FFF267ADC28DA = {isa = PBXGroup; children = ( + 30A53BEDFFCEA0BF3C85C0B8, + BAFE4394BEC0E150AF48BF9D, + 22602331F3048F760A57DF0A, + 74D8E7D66C117C36874EE01D, + D67366CBC83982075998AA7F, + A86D67E68CFAD9B334F516D3, ); name = system; sourceTree = ""; }; + 03A962E8ACDBD0C24CD014AB = {isa = PBXGroup; children = ( + EE2BA717DB664BADF933F60B, + 4ACC11DF3E3FAD545226B517, + 8F37C35FD44479FF319138E5, + 7C677CA8CE54B378D929796D, ); name = xml; sourceTree = ""; }; + 1F04306E8F4BD6AA8AFA3185 = {isa = PBXGroup; children = ( + 9176D4AFF29A2331048159E3, + 1A65D6E553E5548D50FA59F8, + 784B8A83FD421680BC516E53, + E6C669BDC1B76977D02A4496, ); name = javascript; sourceTree = ""; }; + EB6A51E5AA5A5C974F82075F = {isa = PBXGroup; children = ( + 0F09FC5EE1D8696669386810, + 4C0C45AA79B864C0AB7B79F3, + 8F25EC17852F450782DB5F6B, + 61E2C2900EB986229D82026C, + 595A4B842DF683AB9EA79DB6, + 460020F474D8AD5AFA450072, ); name = zip; sourceTree = ""; }; + D31BDA28674C941530C73CA9 = {isa = PBXGroup; children = ( + 79F1D358726869315DBCC398, + F8747A84949D635402589C34, ); name = "unit_tests"; sourceTree = ""; }; + C9B1F8F814FE5B552A67C83D = {isa = PBXGroup; children = ( + 025BB62BCFB9BC624B6C65EC, + 3BF362FE18A7BC55816C4465, + 6E9ACB572E3F6EC33F1718BE, + C0064E220804A2A4403BF25B, + D22534A41E9BE6B47C9D7174, ); name = misc; sourceTree = ""; }; + D9B6523138F19B60DEABC1CA = {isa = PBXGroup; children = ( + D61868F31EC3C8263BE5B245, + 2E74287A8B3F00266B67AA83, + C2C0A562597168B80B601578, + 6D426654FEF78C4A3F5210AF, + E9466E9B4B931B30614DB451, + DF8CA42CB14C9E5364E95A15, + AA373E7C7118660F103ADE1D, + 9AA91D1ED0BC9774E7CB390F, + DC7DDDB1C5B1333B6B9BF16E, + 813D0754B88F11BEF7E5F9B0, + 2CB331F5BE20779E5AEBC540, + 3B609DEA3235848EA822C8AD, + B624AE4FAFD32FBF417CACB0, + 2B17BC5C2C35FFFDDCB35B68, + 2ACEEEDE012463EC66132BA6, + 4EE687A57FE874A6A2386F90, + E9C5BFCDB8C13234747AFC36, + FAAE7C83BF1CFD11D34A04FD, + AA8DECA06405D75F5B11AD35, + CBC7832A02C0137078518DC5, + 43FDB7EF4E52DAE9FF6D162B, + 2E2953742C1431A70048C873, + AD151BCF6658FF033B9789AD, + 1EF8CC1985D194D8B5FA91FC, + 1957F896F4DDB12033F0E84D, + 18D45688D8F8717DC47D1E83, ); name = native; sourceTree = ""; }; + 134363737026CC80D69F48A5 = {isa = PBXGroup; children = ( + D4AD8131D5DDC542D8D8462D, + 66CEC72801EF9BE77D39B19F, + 9C56D83D3BDD05DEF239F71C, + 7F38B22DBF6D9255AD0FF626, + 0AB06DB5C2631EB668C528A2, + 403635C774A6BBC0F6980B64, + BC7512A77A4AB71F889C67BE, + 8BBFA220942050CA89C4222B, + 50B1E864B2356E8572B9A62F, + 401A32949AE4A75BF94D58BF, + 8C087A97055FFF267ADC28DA, + 03A962E8ACDBD0C24CD014AB, + 1F04306E8F4BD6AA8AFA3185, + EB6A51E5AA5A5C974F82075F, + D31BDA28674C941530C73CA9, + C9B1F8F814FE5B552A67C83D, + D9B6523138F19B60DEABC1CA, + 81F4BB6ED7E34DC3C55BDA51, + 543AABF5A9378ECC67318D8B, ); name = "juce_core"; sourceTree = ""; }; + D7FE02721660A0F1ADDE0BED = {isa = PBXGroup; children = ( + DD98635CE638C144FA2E242A, + AF542737B98F49AD978433DA, + 6C67E93B6C5835F8C56C4D99, + 18710CAA88A2662E51D49808, + 6382DAC327D5E3173D6181B9, + 76F6FE05DE3CD997025CC52B, ); name = encryption; sourceTree = ""; }; + 12A6E418E243AFC94B96A6E1 = {isa = PBXGroup; children = ( + ABDC257562E695849038BFF1, + 951CBABFDEE3D2B3D9B4B5AA, + 8AEE85FD33BBE1492B96A865, + B17EE731C57CDAAA661BD735, ); name = hashing; sourceTree = ""; }; + 367D3E7B1A3582D5693B9FC3 = {isa = PBXGroup; children = ( + D7FE02721660A0F1ADDE0BED, + 12A6E418E243AFC94B96A6E1, + 3FFEA694C92E8634104DEF64, + 19C6E03C8D0761B9A3734BA7, ); name = "juce_cryptography"; sourceTree = ""; }; + 1DD90061ACEAF4356BC3D3CE = {isa = PBXGroup; children = ( + FBE7E25D937712E9B0F7DE0B, + 60643938F8115C4B9C64B3EE, + 0680C56908E9B9FC6E45C181, + 51585B78DC89C3B8C60FB051, ); name = values; sourceTree = ""; }; + C283CAA3B222E566D9C79EC2 = {isa = PBXGroup; children = ( + EDFC0BBD478F8BD69086818D, + 580051596DD113F78E262642, + A24F8BB798A8E2C170DC8518, ); name = undomanager; sourceTree = ""; }; + 723121B288F8EB847FF98DE0 = {isa = PBXGroup; children = ( + 83C9D49A4F81FA401E41784E, + 3FCBFAAF81329700C9160C94, + BFEB19DB1777D4B340693547, + F1913401D136456F4AF1CBAA, ); name = "app_properties"; sourceTree = ""; }; + 6BF9D16DF121408ADF8D243D = {isa = PBXGroup; children = ( + 1DD90061ACEAF4356BC3D3CE, + C283CAA3B222E566D9C79EC2, + 723121B288F8EB847FF98DE0, + 41249AFDA317DF598918C5CB, + B33D87EF6A59AC05F1B4251F, ); name = "juce_data_structures"; sourceTree = ""; }; + 017E9B99D428699F1C6D5087 = {isa = PBXGroup; children = ( + 97632D4A7623F329325575B5, + D7D4FEB8E7079BF5B134D6B3, + BACEE7DB80647D962F0DBDF7, + 068CA344569622AC46399E24, + 73D7E3361C9F1DE5D8264E52, + 6423E0F4C4005A16375EDEB3, + 36063F6B7F9D00DAFFACC46B, + AE852683DCFF55237FB62351, + 68E8FE815DF6E2C80022845F, + 4E49D3DFA722AF35FAC2ADEE, + 739B11A050C45AF258B06387, + 0115C9169A12F36DD8CEBB70, + B176F86F3C87EEE822E2F155, ); name = messages; sourceTree = ""; }; + 39D10AF212D901043F60E411 = {isa = PBXGroup; children = ( + 23FA7D4C4D291A54A41B05B9, + 201AAC61BD1439D0404CD52A, + 9C5DA61556665B8C43C75766, + D66DBA597A75CF2493B59196, ); name = timers; sourceTree = ""; }; + FA63A4FEAF47A149B05B2D7B = {isa = PBXGroup; children = ( + 11CFE8D169BB1FA1424C433C, + 862FF5E7777476A7D3E98CDF, + 5BA48D2E6A144E1105C70292, + F7A7C95D6FE1A72B58188DE4, + 954B1EAA307AD2C0889EBBD4, + A481F43C38871D9458B86F28, + 967BE7DD4F2AA7AA8F9738CB, + 951F9F842B6D39ACA7107024, + B9146449549D87B1DAA4C0B3, ); name = broadcasters; sourceTree = ""; }; + 5F95B461A46B124271F4D4C2 = {isa = PBXGroup; children = ( + 1664A35158FBA71AADCB379D, + 3EC17246B581310C23EA5F63, + CE40D5629763EC3C551CA1BA, + E9E0DFA8D3086DFC49FE9BC8, + 2864CE464B03FFF3AD5A24F5, + 16ECD7B6A2A11154B3D86015, ); name = interprocess; sourceTree = ""; }; + 259A4043A2C33A2F7542D782 = {isa = PBXGroup; children = ( + 844E060288C67CAB524751E6, + 8571CD08413C205569405EFC, + 15B818119E54576C2C7BE206, + 336617A6E385E55360312EF8, + 88B96C6E76F7B08D38F859F5, + 3AF9A6DA9497798FDF6D2FAA, + 2EDB0A77DEEF290EAA07A3E1, + 4D0E742ECB7DB1F70BF615FA, ); name = native; sourceTree = ""; }; + FB86CB37A490EC9DB740D91C = {isa = PBXGroup; children = ( + 017E9B99D428699F1C6D5087, + 39D10AF212D901043F60E411, + FA63A4FEAF47A149B05B2D7B, + 5F95B461A46B124271F4D4C2, + 259A4043A2C33A2F7542D782, + E4B21BCB36AC68D6C668C71A, + 7B274A56879F4B2FF235D6D5, ); name = "juce_events"; sourceTree = ""; }; + E969A83F4C0CF83A078F47F3 = {isa = PBXGroup; children = ( + 3210AE12F825D9CED282EC8E, + B83E98C1E52484053B83DF16, + DFD91A1BE91582A859C4670E, + D63F2AC41A283C157196FB86, + 7EEF7CA291E889AFE6C0384D, + 1BC517563ED432D3E3033450, + 27E26A34A2A3DC9FBF6C6B74, + 4C2A9FBE4440A4885A8E85B9, + C96F3FE78CB92F428474CBE6, ); name = colour; sourceTree = ""; }; + B886B1B89D7773E4E0B443C0 = {isa = PBXGroup; children = ( + C3DBF05F1066720451E2078D, + 5CA0F3D05AD800921797035C, + 62E8A57D8A56097060C92FB3, + B1662FEBC72BD0D6D068E213, + CF0EDBCB4673BF9FFD4C933C, + 9F96C238E158C87719F9FB28, + 3187437331BDB6E116DFD5B7, ); name = contexts; sourceTree = ""; }; + F309B3269E76DE120143DD91 = {isa = PBXGroup; children = ( + F67B20BDC3763E7C26257339, + 95BAAE8ABA96F23E47FE028D, + 3A320AE2ABD9443FAA57246B, + E359F912B3AA352526540013, + BFC744DB1B385F6C0E8D1554, + A57A0737C8A86F58F2027B07, + 6031083E4E57E154D327DA8B, + 8E9126330B355156F8790C70, ); name = images; sourceTree = ""; }; + F59D71157F4D41C4D4816141 = {isa = PBXGroup; children = ( + EF14EE3000D22F77D8EF4AA7, + 486C18005FCEA3E0FC43A3D0, + 74DEE32EAF63AB159CB78CCE, ); name = "image_formats"; sourceTree = ""; }; + 6E98284B2337B8ACB6DB657C = {isa = PBXGroup; children = ( + 8B62E15410E8C49EEF12207A, + C306A51355C1AB54D28E16F0, + 5C60278796530C3DA50276C6, + 2E7AE6E8520AA41965C96D58, + EA208A14CC3F7F4FFE7D8962, + 178C4671AD0A7572A5C23B8B, + 75F1705A66786F7665E5D95B, + 0A919F08E0442BC95072112F, + CF49EF512FC567BB9429E378, + 63B6DFA1DCF2656DF1AED8E4, + 02D59F4CAD8301ECCB3ED6C8, + AE6F386520C5A4619B22B213, + 7DA7642888744B79CAB96BC7, + 2D297AFC8E8E9B519D00CF26, + 87119953571F038DDDD7F9BD, ); name = geometry; sourceTree = ""; }; + 2E6FA1D06FBF4A4F13B37ACE = {isa = PBXGroup; children = ( + 244B7290EA0ADF1E7F5F95E5, + 10FC26BFC760FDF31F7EF24D, + E4CD3BB664E6B293A11DCB79, ); name = placement; sourceTree = ""; }; + 6018A5E91B7A26DA24103F9F = {isa = PBXGroup; children = ( + B622AB21181705574D25C112, + FA9676810AF2F38EBD37199C, + 07E25F36485450F905114EB6, + B89C7A3A8EB390F6E84BF882, + AF3CEE3137EE41BEECC78DF8, + 866A93C4479BDE4577F5E7B1, + F2D3BDC0E875579221855867, + CB4D18D09CC768F84665E259, + 96E32E150CC5E45E6067077F, + C93A3A190653E956062C3664, + 20C9FECB6515DEB13F3D0B12, + A6CFE6A91CA9226F18A49047, ); name = fonts; sourceTree = ""; }; + AD6C56A11E3F985F7C7AA351 = {isa = PBXGroup; children = ( + CD1B5B3A90067C61ED51B3B8, + 1478ABF4E3D10AA709DDFD65, + CEF724781B62A0C66F89313F, + E2E9CC735C960A8973F4392C, + 3B134E33FAF6A2D476C68EEB, ); name = effects; sourceTree = ""; }; + 44131CDF742706D6C0E9EC66 = {isa = PBXGroup; children = ( + 5FE6EF8557574AE95CDEBDCA, + EF8E221F84DBFB90BA0D2121, + FB17443A29A0BFCE1499C18E, + 844707F81B86A6ECFF9D8971, + 2BA8A348E24FA01FEDAA4FBB, + 7915D0307004CB1848CEBF67, + F29D4C985EBD26195FDE1F33, + F96F6A11BD1D60CAEB22A3F6, + 1C98C9CED951E601931822FF, + 7348654A7CCCA4801FBB3EFD, + 01A4F028A63749CCAAE5DF55, + 32F1879E6FF96C8BDE9C2EBE, + E49DAB373744B917B597168F, ); name = native; sourceTree = ""; }; + F7DD1006ED325822934CE941 = {isa = PBXGroup; children = ( + E969A83F4C0CF83A078F47F3, + B886B1B89D7773E4E0B443C0, + F309B3269E76DE120143DD91, + F59D71157F4D41C4D4816141, + 6E98284B2337B8ACB6DB657C, + 2E6FA1D06FBF4A4F13B37ACE, + 6018A5E91B7A26DA24103F9F, + AD6C56A11E3F985F7C7AA351, + 44131CDF742706D6C0E9EC66, + BDCE808BFAD59C06CBBFE776, + 8A4309D233D97D00F33632CD, ); name = "juce_graphics"; sourceTree = ""; }; + 2F1041C065A0A50307F614ED = {isa = PBXGroup; children = ( + ED8229C37893B6CB49A015E8, + 80CC3A04767718A98EF73C6A, + CB4F3175207004E4E368DED7, + 28D9FE3711234F679FB41733, + 2D8778974C68084E97C85FEA, + C28E74456B994CBEFF443477, + 12AD997217C5B146DCE05DA8, + A8C62A3036CF6C50780F502A, + 8684EB51D3FCE5D754454C88, ); name = components; sourceTree = ""; }; + 1F27292979CA7D0A6E999F3D = {isa = PBXGroup; children = ( + 8F23010B5687CC84D5618D94, + EF2FF8917F057B26DD01D313, + AB7A36EE23451E5D75C7177B, + 56FD90C9B255C9842E1DE6E3, + BABE3E04A41600A763AC8AF5, + 7285A22D6FF07D252D791F10, + 8F6230411A3D641AA0BD002E, + 7E0083C78E047CACACAFB8AB, + 2ACD26FEA009C3FF00F6E124, + 7F85DDE9A5D21D9ED2AC344C, + 6B67A8471D27DEDC4814E03D, + 7505DBC3BDE5012BB93961BF, + C7FE38B73D4465AFF7A6DE68, + 13329E39CC18775B44F472FA, + 800C7B1CC1FFFCD17C8F29B5, + D8D8E59CC4906683F54E9E47, + 6AD481C2B30E01BFEA7A58C7, + 0518D1089617C7B9598F35C6, + DD85A7C7C7CBE5563E68D702, + F4232A519854A8076D1B9222, ); name = mouse; sourceTree = ""; }; + 88897071E8E741ABDB94C057 = {isa = PBXGroup; children = ( + F3B5B1EA1A0F1FA07B06B163, + B22CB865D154CC006269A7AE, + 7EB3ECB111689947FA58FAFA, + 1E7CA6A3A1C17F917A7F7E04, + CFD132190F1F02F6241F4546, + B5B7E1F6324C6FD60A297F4B, + D4B969973C0512F6EB6FA8F1, + DB56D9790F29378B0216B337, + 2758DE812EF406E2AF60A9DF, + BFF612E6000CE9DEEF603615, + 1095B29C706EA27F3345B1C0, + F9FD00F994947C4396D857C5, + 6E7E3CCDA1B9DCDF6ADAA206, ); name = keyboard; sourceTree = ""; }; + B1F5418A24C949EF1EDCC5CC = {isa = PBXGroup; children = ( + 09221768D9AE08F3E84407EB, + 027B826D8F1EC95E886648AB, + F7F2A8C5CE190B9E1EC47F8B, + 118158D6CA3C681B3C33CC49, + 165951595FE0F9FBDF8F1F76, + 11A4BF5B35CBCE630657C39B, + 0A1661FABC94E6BC1CA583CC, + 6EDEFBC59811FE7A3C062C76, + E73FE1D1751A2D585498CD1F, + E5368BA7395DEF8CE20D015C, + 4DF7445B3EB54343A00CC25C, + 85C0B0A9A2E9011A381F4B6D, + C425F930263580F64831D9F6, + 1A5DF7BA39B40428260C31AF, + E2769AA38838844A6522E4FF, + 277DFD7724AA558ECBF9CD7C, + 88841EBB57CD023273C1B011, + E994488A0B4220B5CA064DCC, + 3946B6C3F4C5CF77AE29657C, + 300F36848F2D4A79559B6D6C, + 9EFF96B9B3A23A7C056B0581, + 9762A585C1D71C4F94400DCC, + D3BFF0E11D3F9A7418ECA895, + ED3EEE79647EE49BBBE6D88F, + 6353AD6AB18E11D61EB6B6B5, + 107DFA95B0EDBA20E6F491EC, + 8BBF100D5672619427BE1FA6, ); name = widgets; sourceTree = ""; }; + 20C66850D35C2F7AADD7EA64 = {isa = PBXGroup; children = ( + 49800024EAD8F8D3238A90D2, + 40ACDFD1FA477AF57EC46DE8, + 9FD68FE75C0CBD0896E4EBCE, + 278905A514838BB05EF5BCC7, + 5659F3E5E387D79D667939BD, + ACB76D7E2C25A4817C8FDCBB, + 18425E2A1A02A2F013266A5C, + C5F759D80F99D4781D8CAB2C, + F51D8294D9047C68D2B9C27F, + 568DBF7F795FF57A1DCA7A0B, + CE89263BBF56D5FEC9AB8867, + 2E8C5D25AB2D652B5691EB2D, + 66C7B3330BFC5043D3DDBB07, + E212786B086F213B7CA4ED6C, + 21168FEE80959F178F1121D3, + 215188D87085D91B6C5FCD14, + DF8341365E508EF7C920EC8B, + EF6D81709098F6089B9C09F2, + 1AC49D8536EA1C79ADF3F0E4, ); name = windows; sourceTree = ""; }; + F30B7D8CE97DE5606AE6DC8E = {isa = PBXGroup; children = ( + 10D3E511C1596A55D345E450, + E30662968DCE42D8335E2018, + 393CFE634E767D7D67754605, + F05F461001AD96C6FC4B5C1D, + 4510ED9DACF956CD26701FF0, + 331DB96552D8827A3531E620, ); name = menus; sourceTree = ""; }; + 4C272B3754B014AC08B0E033 = {isa = PBXGroup; children = ( + 6930876C15958A3ECDD37704, + B597558E965007A285B6BA6D, + B01992821789AFF657A25A95, + C3B6F57443BFFA1E5631B596, + C35FAD80CDE9225FE8939818, + 2C53D458935EDD6D74D4390A, + AB1D06FA6F324B4EF0F64315, + 59C362E42C5EF3F3D40F38F3, + DF65288A6A46308AC0BA2DE2, + D94DE0E3A7E3FD8EC33DFEFC, + B723FCD7D774BA8C2004A66C, + ADECBEF533CED2D774B99350, + FE7F21B2C968EDD120A18B00, + CA11F6F4E56E77470FE8D09E, + 98459CAB4F58A66FC938D5E6, + 9F6E4A7EDED0BD437EA25530, + 839ED2804072F1F4A49795C4, + AF761727AC666D34DCB621A7, + C3111CF603075D3ECED9F226, + D3E6E10241BBF62F012DE17B, + 09435B89075BB6FA4CFD6724, + A4096A02463E8B010F9C59C2, + C2530AB0D290282604A86AFF, + 2C127393C75D45AC918B05CD, + FACDCE3863025B8A344171CC, + A331D72512A603E04C52418A, + 07F9A74E51473D1AEF083D7E, + ECB835BD3A66AC09C9A2373E, + FD71F052D94248F16F02B388, + 0D7137F7245CFB5DAA18A4FE, + 85CACE02CBBD24F62F26B2A8, + 430BC76CC982DBD7BA922C07, + 97B159555E69DE49F7320D32, + CFE07619476ED38EAC6F9647, + D1541A8D28A7E2DA898DB59D, + C2B58C343A6660A0323EDE06, ); name = layout; sourceTree = ""; }; + A0A794A5F17590D11359544E = {isa = PBXGroup; children = ( + 5B5933C960929059FBAE8885, + E92C83774EC4A9A14E22109C, + F78B51284578A0A67A33F2EB, + 8ABADD47FC9A02CFCF692C5F, + DC3AF8B79000B8358A770D0D, + AB3926902813D7BFAAEDC63E, + 4A0B9707656C06AA2DF98695, + E44572B81F6B4EAC081E43C7, + A7414C940C8F954895DD635B, + 22F32B780E54AADD057330AC, + 88AA4521917545383C769507, + 26666AFE34453D68EA1CD34C, + 4FDD1C063357EE9737EED677, + B7E426E1537A9A4C368F77B8, + 45DD32716673D626B8F2C36D, + 3B1AB73B105D680E63D600EC, + 5341780B2FA0848C000E0E78, + 843939FBC4BC176E9C2C909C, ); name = buttons; sourceTree = ""; }; + 0CE1F0AC5B7735D5C59D065E = {isa = PBXGroup; children = ( + E1BCCD17CADC08D4D9A04EB5, + 3DF2F5F789876541B73EA0A2, + B33B4C53CBF14DDD6E19F8C8, + 93A609B77BEEAFD352361D7F, + EF723B3B26FFC52C7DF6E6FE, + A8F70411AAD4401197959817, + B7FC0F16FE7E00A23076CFB8, + 28050C6DE7011A70920E3F32, + 0C0C38F452969215F24776E4, + CF6F2D6D175E7BD93D969A64, + 2F7E8902A1991455A1F5B963, + B4BE33CAEF343E0FD4B10103, + A7486D0AE6A75CB00582B51C, + EBA666E871E270CD6F91D93A, ); name = positioning; sourceTree = ""; }; + 1011BBE9304BAFF95A476125 = {isa = PBXGroup; children = ( + A9DEBF10F4F5CCD5F66E0BA1, + 28B1C5C6AFE41F19212BCBAF, + 475280BA3A8D59845C56B2BF, + 8B24AAB5524D9D206BCCCCDB, + F3FBF9B8D43CD49F6284731F, + 95E4BBD9EA8C59D2DEA56E5E, + D19DEFE723E50138AC8ED9BF, + 4BE79606E126522A5FFCA28A, + BD8165288D223488734845AC, + CE94014A314EE7D89859551E, + 8B3A7567DB62DF8CAFCB5530, + 7917F2616381CBD80F54713B, + A58BA491BD292B245D238175, + D62F91E1F9DEB23A673CC1F6, + 0425BD62DB67A184A8DCAF27, ); name = drawables; sourceTree = ""; }; + 7B851D47EEB0A51D2C32C5FB = {isa = PBXGroup; children = ( + 42A9118A046157BA8286F106, + 8C38E93442136FBB225D6B60, + 0DB32EC20D82294C547A0316, + 0F2AA0311372228328A192D3, + 5A4CAD8AC21BEA6913ADCA4B, + 43BE8B9E5193679AA753D8AC, + CEAA216C55B19BDA0EC8CEE7, + E2EC1BD03575EB805C4B596C, + A91EC6BEEDB3A81DB243C7AC, + 6DCAB9D9819230FBBDC77775, + 97AA55E057EA63A841B7D8D9, + FA051E65BFEBED1313E7AD16, + 9B922474922B177945F847E5, + D5330C75A79D3FD00D88FF09, ); name = properties; sourceTree = ""; }; + 43B0193D1C7DEF84D41B69A4 = {isa = PBXGroup; children = ( + 663ABFD081965E7CA27A92BB, + F1F86FFAF4BCB107ED39562B, + 640CFFA7187DEE068F7C0753, + E7D854EC010D103AD186C045, + 7E9C5924EB87C1AFD7E48B60, + 92268C4E4F2D4051D5EA1A16, + 8C16B3A744FCB89C241242B1, + 3C539DCE1C0EE05849B234D9, ); name = lookandfeel; sourceTree = ""; }; + FC94936E6781852E6A5F5AAF = {isa = PBXGroup; children = ( + EF4C6DC600C1ACC3FCC13164, + 93F7CB7B38CB41F67A542FA4, + 3FCCE49E2927562C037B9502, + 62524F170AA5B50F631AC2BD, + 1C2F048BBDFE107360BBFA96, + CB2089CB6FCE772E8BEDB0A0, + B0CBCE56504234420DE443DE, + 9F8D6C1ABD279ED354B62B08, + EB170E698EB7CDECEC5CE6F9, + B8A3E8BB179C8B50164D615B, + 31CB45A436EEF3A12214093C, + F11E22ECFEDD82EB6AE31B39, + 0401AF6817AF1AEAC733714F, + 39B341C6A96025DA8F67F7F4, + F60198B5239A2A70FBDD83CB, + BB3684BF46B63D81675D0BE3, + F38318C3981F03CA0DCB810C, + 457A44F589184417BEEC66C6, + 7FFFC87F068D320D1F98AB72, + C6427BB39C1B2EE3044ACD0C, + A0E313527F80F4583588DDB3, + DA2FFAF8C0EB7C47B430EE81, ); name = filebrowser; sourceTree = ""; }; + 76533D71441DB73BC581D584 = {isa = PBXGroup; children = ( + 8406E1E4147F9AC6DFE0D5AF, + 0A3DFC5C47DC2472E34D9E73, + A08D898FA47DA70C12397B24, + 4A461606855E42B876AA960F, + 536CDDD56182947C118F00FA, + B89336F07FA245BCF095469D, + 8BF1E2514857E7161B0B5A24, + 85C576E54AFB35C156C9C831, + 9757D7FBF6613C9CB3ADD0CF, ); name = commands; sourceTree = ""; }; + A16C13AC925F01E513BC0632 = {isa = PBXGroup; children = ( + CA090BCA3BA1590142295E0F, + 4AF88AC28F3B17223B71ADE8, + 42E8113E2578AA7A73BC5A1D, + 56CAC3C965D4937837CE291C, ); name = misc; sourceTree = ""; }; + C25E9058EE7B0F2E900E3433 = {isa = PBXGroup; children = ( + 647F2177AEE7083291491B01, + 0C16DC35F5044178F8D6FF3C, ); name = application; sourceTree = ""; }; + 49D064C5B2141BD8D14AE294 = {isa = PBXGroup; children = ( + 4AE5D614B7AFCAB583208759, + 33C3EB30E1F7199E0BC8C099, + D7F68D8960AACA6245520A48, + 93FB3181F01650023DC78145, + A9A0D3FDAD0313E1A77E2D49, + C784E011BA017F188F2064C6, + FB744E5DA149818A9ED58B6E, + 8A1440773B4C39E9F9BD3B76, + 40416019EE08694C50FEEB1C, + 58C6BBACBF0FB679757A6CC8, + A7EE468F62EBFEF5E321277F, + E1D5C29A0E7FAD3D57ECAC13, + E21819B823D258F2BBBF2E26, + BD9613A2555B6D5D4C42736A, + 38B7C06966C8B0E02ECD9611, + FBBB399A45139BD4F9ED91C4, ); name = native; sourceTree = ""; }; + 2727A6D234211D5EEFE67B2D = {isa = PBXGroup; children = ( + 2F1041C065A0A50307F614ED, + 1F27292979CA7D0A6E999F3D, + 88897071E8E741ABDB94C057, + B1F5418A24C949EF1EDCC5CC, + 20C66850D35C2F7AADD7EA64, + F30B7D8CE97DE5606AE6DC8E, + 4C272B3754B014AC08B0E033, + A0A794A5F17590D11359544E, + 0CE1F0AC5B7735D5C59D065E, + 1011BBE9304BAFF95A476125, + 7B851D47EEB0A51D2C32C5FB, + 43B0193D1C7DEF84D41B69A4, + FC94936E6781852E6A5F5AAF, + 76533D71441DB73BC581D584, + A16C13AC925F01E513BC0632, + C25E9058EE7B0F2E900E3433, + 49D064C5B2141BD8D14AE294, + F31D86BA24EC2678D56947E7, + D3B9F06E8AB5BDEA5E7D40FB, ); name = "juce_gui_basics"; sourceTree = ""; }; + 7DEF87B9C8D847F2840BF97D = {isa = PBXGroup; children = ( + 7A468C67367399CD22A58BEF, + 7EA68D693EC63E5AD1B51FF3, + 175536F3AD74DA7F99855C30, + E8DB4F9E74B0A892FF6BCEA6, + 16EFF69FC0A6DCCB8B386AD4, + DF6AF4691ADCCB658CDDD3A8, + BA1B1CEFBFF576EAF0692B46, + 2C6D33A4B1F178774DA92636, + 00F3FC287D7F986198A936F8, + 190369B72311A50A82311CD1, + CA09B7EB9B9E4E867280F85E, + 4503340D22E0C1A30491A805, ); name = "code_editor"; sourceTree = ""; }; + 276BB424622D00B2F6D6EF05 = {isa = PBXGroup; children = ( + 2B397A82E7CBA92C8FA0131B, + 8814927B0C28EA1063EEB553, ); name = documents; sourceTree = ""; }; + 66D132EDB56154912C007BA8 = {isa = PBXGroup; children = ( + 29936B840C21753D71B54BAA, + 92AD2CC241921A7624BBDD04, + CB5B87D094112699DB091CAF, ); name = embedding; sourceTree = ""; }; + A53F5FF344A1D95EBBBDF3DC = {isa = PBXGroup; children = ( + AB57B8C265A51D69103BE0A3, + EE65A722876EAC5535E2E1B8, + 11684623C5BC9B99836F46E9, + D2542778D9FD06E8EA7A9588, + 9949FC28A43624DCA6E72AB2, + C6A2C9D09ED83DAC671EBE58, + AEA83A85BDD39CEC3FBD9176, + 3F56498672689348F97FE1FF, + A19ACE84BA53D03B2616C50E, + 79E1F731992D801351BECC77, + 9116D0ADA9D6CF88E29651A1, + FE52A4CBC9C8CF6D6130DB56, + 4E805C7465B906764FDCC079, + 0FF1CB412E3C9ACEAFE41AB5, + 4DAE9FA9C8EC7493491FDEA7, + 540011D30E5C05255D2F9F58, + ACFA5D787D7AA1BA428CE54F, + 5301D83E07FBC894AD2458DA, + D2026CB37FFDE5628F9F2744, + AC67DBAF871C7E7FADCBD638, ); name = misc; sourceTree = ""; }; + DFD4E790D5E34260219E3AF7 = {isa = PBXGroup; children = ( + 5B937EC199DBC45A407C603C, + F8C0B0742DB274931684B5D9, + DF8D7EE925553441ABDF0CAA, + C9C6E93243BC759D11517CC2, + 49E5420AF938D076F5E962C9, + 982EAE63C76A2B3D14AE71C1, + 616B784FCB645D3F2616B3E9, + 33AAFC22439616A878D7024A, + CE29883C83A0CF37463E7944, + ADD90AB47B68EADAD7D3F725, + 3FCA25C4DC0E7E70CFC17B37, + 043223EEE8D5CD1401F3BAA8, ); name = native; sourceTree = ""; }; + F60E760717F10C7C5B1BFB7B = {isa = PBXGroup; children = ( + 7DEF87B9C8D847F2840BF97D, + 276BB424622D00B2F6D6EF05, + 66D132EDB56154912C007BA8, + A53F5FF344A1D95EBBBDF3DC, + DFD4E790D5E34260219E3AF7, + 40E81296E8405B6DB08D1A48, + 3890B3CC99A7CF70767E86F5, ); name = "juce_gui_extra"; sourceTree = ""; }; + 6EB5B0C74A683FD9E8F67118 = {isa = PBXGroup; children = ( + C25C525D2EDBC5EFD75C4339, + 0CAB2AAF663F5DD90D95F05C, + B78BF0336B88A8417A36789C, + 4E6E46FC7CC57977CDEFF7EB, + F70BCFFF8A0FCDDDB8B8E4BE, + D4C1710FD87D3FA13578AB06, + 99BB5424E0582BC9F57DEC0C, + EB344019F1D9C39FFB25E0ED, + D3B2355F44296AD9D95EB818, + 4026AF7C01AE98E51C186FF7, + 4063612DB3C6EFC5F0A2F2C2, + 0859DE9EA0450BAFE24265C5, + D9E7F3EEF988179D04967CCA, + E77B60A2AAFFB97BEE8787DF, + D0EB5A8457B29149A94236FD, + 2086277583EAB1A771D6C6B0, + 056385085D79574486C0E69E, ); name = opengl; sourceTree = ""; }; + 8EEFFBC75F21B6E21D802A38 = {isa = PBXGroup; children = ( + B99ECC1A59ABBFAD154DBF9C, + AEA4CD32C4FE456E56506C23, + F752AE98467F8E7D4CEA7C43, + 3F01FA0D9D23B3A8D322CD03, ); name = geometry; sourceTree = ""; }; + 72D293A3B38BAD3129DF1940 = {isa = PBXGroup; children = ( + 60441B6BC9A414FFBDEE3FCF, + B8919AC8BD1D96967D930C30, ); name = utils; sourceTree = ""; }; + 4527369C4DAB2CE60232DE94 = {isa = PBXGroup; children = ( + 2E90765D015EF5632C2D615B, + AA246BE1680359142F137B21, + ABAEF348E52D72E922D48549, + 16C069B1F73826D5E4EB1AA6, + 12C4E2CEE622B2D83D4E08B6, + 7DD99D2BC48E1E19710A258D, + F9A8389F52F21B93248B1E86, ); name = native; sourceTree = ""; }; + F60314F08ACFDB997F502781 = {isa = PBXGroup; children = ( + 6EB5B0C74A683FD9E8F67118, + 8EEFFBC75F21B6E21D802A38, + 72D293A3B38BAD3129DF1940, + 4527369C4DAB2CE60232DE94, + 3EAFFA56F2F43A1058B3218D, + 2324CB42E9D6509A04EC7C2C, ); name = "juce_opengl"; sourceTree = ""; }; + ABEEA81A9680F6A4F8ECA0EA = {isa = PBXGroup; children = ( + 919BAECE150A694462A66B0F, + 523E4436EB863D6DE0298B96, ); name = playback; sourceTree = ""; }; + 1C67C665FD3B6D5133151E2D = {isa = PBXGroup; children = ( + 6105790D35DB968ACBDED81B, + C529D64EFD3FFC856653E03C, ); name = capture; sourceTree = ""; }; + 5CBF586DCC30079B9463982A = {isa = PBXGroup; children = ( + D15914EEFE2CA042E302C786, + 45DDC719491D8A5DF2742D87, + D5C686A4A13CFB91BF5D9872, + 5981B71FC0A50C72374F7114, + 06CCEC1EB7CB9296868ECC10, + 82082D02470579C3970E1319, ); name = native; sourceTree = ""; }; + CC319022914B6972D2B91A23 = {isa = PBXGroup; children = ( + ABEEA81A9680F6A4F8ECA0EA, + 1C67C665FD3B6D5133151E2D, + 5CBF586DCC30079B9463982A, + 3EFA5C3DC025E618DAD14A83, + 8373BE8898318D58E01ED237, ); name = "juce_video"; sourceTree = ""; }; + E697CF5985AC7D206A214CE1 = {isa = PBXGroup; children = ( + 42D107F741897BBB52B61202, + C1CFAF0419BB789AA0E38629, + BCC969C3BC478853FD7E336F, + 0F1330B9E634C8C1D2A19EAD, + DCA2C59535A97CCC2E7E5D5B, + 134363737026CC80D69F48A5, + 367D3E7B1A3582D5693B9FC3, + 6BF9D16DF121408ADF8D243D, + FB86CB37A490EC9DB740D91C, + F7DD1006ED325822934CE941, + 2727A6D234211D5EEFE67B2D, + F60E760717F10C7C5B1BFB7B, + F60314F08ACFDB997F502781, + CC319022914B6972D2B91A23, ); name = "Juce Modules"; sourceTree = ""; }; + C94E97E4A3CB628A675EE05C = {isa = PBXGroup; children = ( + B84ADDD01BAB1B1E21DDFF07, + 5FF5EB14BABBB07DE73B3084, + A7A5CB392CC227CDF5EA7E1E, + 0C45F05CF7EE8C0E36FACC7D, + A4545B5C8FFEC73F3BBB79D4, + 0246069EEBDF0407AC74689B, + DE7823A252414C8CBA93C5C4, + 4C36BE67D1173F7989BE5F45, + CE21B3DE9134974FC3432234, + 28BFBC2913988C2507DA643B, + F15FDAFFD05E09B75A756D84, + 5CAC2512334C51B8BF104DD4, + 77DBA89F84EE6B4ABBCC1392, + 0715CC6C99BA955AF2097BB6, + 88F83AF1ABFAE2A428714C4D, + 15BA4AEE0C0E22D7C8BE92CA, ); name = "Juce Library Code"; sourceTree = ""; }; + 094FA973096AF6FDD5A75280 = {isa = PBXGroup; children = ( + 9A31450E90F82EE417285AA4, + 9B83CA7A03621F4DE0B0C3F5, ); name = Resources; sourceTree = ""; }; + B679234897D9AEB22E892566 = {isa = PBXGroup; children = ( + 92CABA9C9B5148FCA22A0503, + BD70FA4626657FF1DEBB10DA, + 4286F1F40FC3E04B4AE701C2, + 7C86E886C3FCB671004E1CA2, + F5B5D441C4AB1D01509ACC8D, + D7867DB9C17425E3F05EB860, + 712FD99244BEDA356A73A60D, + B06A9120276E8875161CFC7D, + 1D29F6A21F927F10EB8C5EEF, ); name = Frameworks; sourceTree = ""; }; + 6F245D0C169B0E9060BD1033 = {isa = PBXGroup; children = ( + 4B8E8BD3DEAE0C479D04F571, ); name = Products; sourceTree = ""; }; + 41A4B977F5588A439A066455 = {isa = PBXGroup; children = ( + 24BF2D05D134C386864C4C7D, + E697CF5985AC7D206A214CE1, + C94E97E4A3CB628A675EE05C, + 094FA973096AF6FDD5A75280, + B679234897D9AEB22E892566, + 6F245D0C169B0E9060BD1033, ); name = Source; sourceTree = ""; }; + 993A56BA093F4D3C2556398E = {isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_LINK_OBJC_RUNTIME = NO; + COMBINE_HIDPI_IMAGES = YES; + CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_DEBUG=1", + "DEBUG=1", + "JUCER_XCODE_IPHONE_5BC26AE3=1", + "JUCE_APP_VERSION=1.0.0", + "JUCE_APP_VERSION_HEX=0x10000", ); + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../JuceLibraryCode/modules", "$(inherited)"); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; }; name = Debug; }; + EA0243E56EC3EAF286B53CA6 = {isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_LINK_OBJC_RUNTIME = NO; + COMBINE_HIDPI_IMAGES = YES; + CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; + DEAD_CODE_STRIPPING = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_NDEBUG=1", + "NDEBUG=1", + "JUCER_XCODE_IPHONE_5BC26AE3=1", + "JUCE_APP_VERSION=1.0.0", + "JUCE_APP_VERSION_HEX=0x10000", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../JuceLibraryCode/modules", "$(inherited)"); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; }; name = Release; }; + 2DDD1A3A56EAB02179D1CFB6 = {isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_MODEL_TUNING = G5; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "AudioAppExample"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + WARNING_CFLAGS = -Wreorder; + ZERO_LINK = NO; }; name = Debug; }; + BE32D9CFAA27D791B2181C7F = {isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_MODEL_TUNING = G5; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = "AudioAppExample"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + WARNING_CFLAGS = -Wreorder; + ZERO_LINK = NO; }; name = Release; }; + 074FE87A26471418B3AC0921 = {isa = XCConfigurationList; buildConfigurations = ( + 2DDD1A3A56EAB02179D1CFB6, + BE32D9CFAA27D791B2181C7F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + FF720F7C44675347E5E0EB5A = {isa = XCConfigurationList; buildConfigurations = ( + 993A56BA093F4D3C2556398E, + EA0243E56EC3EAF286B53CA6, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 6480A9A75122084E426BEF0C = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 70EC04D8CFE012341DBC0A45, ); runOnlyForDeploymentPostprocessing = 0; }; + EE26AB6336CDF8E778B3DA86 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5055109434B36CD6E0B6D360, + 55A794809FECCB07D3C4D07D, + 3621F85B854280F9027CE5CB, + 553D71A8359701FC2637AB1B, + 202C2E7636BF065345A863BE, + 4D0CCBCD970506020B7B776D, + A5F3236458D1B10A5380B56E, + 32945D1B73F05E016A260623, + 37A09B6DF2E96F97B97D4449, + 549F56B2B2C317F8825B1931, + 497800EE8B1FCCF085363076, + EAB8E408DC76E022A6D68766, + 9A41B21E365359ED2B2EA7C9, + D08237D0B93B3C2CE522A33E, + 6DD90D5F07BB81EF033A8A20, + 7BAD1CE41A8101004D40A2BE, ); runOnlyForDeploymentPostprocessing = 0; }; + B6DD28580BC7A7F690EF4B49 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3286435E3CC944A630866B89, + 7AC823C6BFA28E49D004E0E0, + F02410B634B6C9C29060A812, + 26E4E22AC7196AC405E218B9, + DE32F1DDED355F817FCA16C4, + 62AE0FBB5B9184FF94092D43, + C3F12DC7CA8C22C1853A7F08, + 291730DFE49E6AE97D4C8CEC, + D3AC61A0594DE1592920426F, ); runOnlyForDeploymentPostprocessing = 0; }; + EDF214F1951D7745347EA1D1 = {isa = PBXNativeTarget; buildConfigurationList = FF720F7C44675347E5E0EB5A; buildPhases = ( + 6480A9A75122084E426BEF0C, + EE26AB6336CDF8E778B3DA86, + B6DD28580BC7A7F690EF4B49, ); buildRules = ( ); dependencies = ( ); name = AudioAppExample; productName = AudioAppExample; productReference = 4B8E8BD3DEAE0C479D04F571; productInstallPath = "$(HOME)/Applications"; productType = "com.apple.product-type.application"; }; + 0E00FEF4A999DE35888889AE = {isa = PBXProject; buildConfigurationList = 074FE87A26471418B3AC0921; attributes = { LastUpgradeCheck = 0440; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 41A4B977F5588A439A066455; projectDirPath = ""; projectRoot = ""; targets = ( EDF214F1951D7745347EA1D1 ); }; + }; + rootObject = 0E00FEF4A999DE35888889AE; +} diff --git a/Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/AppIcon.appiconset/Contents.json b/Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..765c4780a5 --- /dev/null +++ b/Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images": [ + { + "idiom": "iphone", + "size": "29x29", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "40x40", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "60x60", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "60x60", + "scale": "3x" + }, + { + "idiom": "ipad", + "size": "29x29", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "29x29", + "scale": "2x" + }, + { + "idiom": "ipad", + "size": "40x40", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "40x40", + "scale": "2x" + }, + { + "idiom": "ipad", + "size": "76x76", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "76x76", + "scale": "2x" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} \ No newline at end of file diff --git a/Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/LaunchImage.launchimage/Contents.json b/Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..c805626cce --- /dev/null +++ b/Examples/AudioAppExample/Builds/iOS/AudioAppExample/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,50 @@ +{ + "images": [ + { + "orientation": "portrait", + "idiom": "iphone", + "extent": "full-screen", + "minimum-system-version": "7.0", + "scale": "2x" + }, + { + "orientation": "portrait", + "idiom": "iphone", + "extent": "full-screen", + "minimum-system-version": "7.0", + "scale": "2x" + }, + { + "orientation": "portrait", + "idiom": "ipad", + "extent": "full-screen", + "minimum-system-version": "7.0", + "scale": "1x" + }, + { + "orientation": "landscape", + "idiom": "ipad", + "extent": "full-screen", + "minimum-system-version": "7.0", + "scale": "1x" + }, + { + "orientation": "portrait", + "idiom": "ipad", + "extent": "full-screen", + "minimum-system-version": "7.0", + "scale": "2x" + }, + { + "orientation": "landscape", + "idiom": "ipad", + "extent": "full-screen", + "minimum-system-version": "7.0", + "scale": "2x" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} \ No newline at end of file diff --git a/Examples/AudioAppExample/Builds/iOS/Info.plist b/Examples/AudioAppExample/Builds/iOS/Info.plist new file mode 100644 index 0000000000..00278da42a --- /dev/null +++ b/Examples/AudioAppExample/Builds/iOS/Info.plist @@ -0,0 +1,29 @@ + + + + + + LSRequiresIPhoneOS + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.yourcompany.AudioAppExample + CFBundleName + AudioAppExample + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0.0 + CFBundleVersion + 1.0.0 + NSHumanReadableCopyright + + NSHighResolutionCapable + + + diff --git a/Examples/AudioAppExample/JuceLibraryCode/AppConfig.h b/Examples/AudioAppExample/JuceLibraryCode/AppConfig.h new file mode 100644 index 0000000000..c2075106c1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/AppConfig.h @@ -0,0 +1,197 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + + There's a section below where you can add your own custom code safely, and the + Introjucer will preserve the contents of that block, but the best way to change + any of these definitions is by using the Introjucer's project settings. + + Any commented-out settings will assume their default values. + +*/ + +#ifndef __JUCE_APPCONFIG_PANJXP__ +#define __JUCE_APPCONFIG_PANJXP__ + +//============================================================================== +// [BEGIN_USER_CODE_SECTION] + +// (You can add your own code in this section, and the Introjucer will not overwrite it) + +// [END_USER_CODE_SECTION] + +//============================================================================== +#define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_devices 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_formats 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_processors 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_utils 1 +#define JUCE_MODULE_AVAILABLE_juce_core 1 +#define JUCE_MODULE_AVAILABLE_juce_cryptography 1 +#define JUCE_MODULE_AVAILABLE_juce_data_structures 1 +#define JUCE_MODULE_AVAILABLE_juce_events 1 +#define JUCE_MODULE_AVAILABLE_juce_graphics 1 +#define JUCE_MODULE_AVAILABLE_juce_gui_basics 1 +#define JUCE_MODULE_AVAILABLE_juce_gui_extra 1 +#define JUCE_MODULE_AVAILABLE_juce_opengl 1 +#define JUCE_MODULE_AVAILABLE_juce_video 1 + +//============================================================================== +// juce_audio_devices flags: + +#ifndef JUCE_ASIO + //#define JUCE_ASIO +#endif + +#ifndef JUCE_WASAPI + //#define JUCE_WASAPI +#endif + +#ifndef JUCE_DIRECTSOUND + //#define JUCE_DIRECTSOUND +#endif + +#ifndef JUCE_ALSA + //#define JUCE_ALSA +#endif + +#ifndef JUCE_JACK + //#define JUCE_JACK +#endif + +#ifndef JUCE_USE_ANDROID_OPENSLES + //#define JUCE_USE_ANDROID_OPENSLES +#endif + +#ifndef JUCE_USE_CDREADER + //#define JUCE_USE_CDREADER +#endif + +#ifndef JUCE_USE_CDBURNER + //#define JUCE_USE_CDBURNER +#endif + +//============================================================================== +// juce_audio_formats flags: + +#ifndef JUCE_USE_FLAC + //#define JUCE_USE_FLAC +#endif + +#ifndef JUCE_USE_OGGVORBIS + //#define JUCE_USE_OGGVORBIS +#endif + +#ifndef JUCE_USE_MP3AUDIOFORMAT + //#define JUCE_USE_MP3AUDIOFORMAT +#endif + +#ifndef JUCE_USE_LAME_AUDIO_FORMAT + //#define JUCE_USE_LAME_AUDIO_FORMAT +#endif + +#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT + //#define JUCE_USE_WINDOWS_MEDIA_FORMAT +#endif + +//============================================================================== +// juce_audio_processors flags: + +#ifndef JUCE_PLUGINHOST_VST + //#define JUCE_PLUGINHOST_VST +#endif + +#ifndef JUCE_PLUGINHOST_VST3 + //#define JUCE_PLUGINHOST_VST3 +#endif + +#ifndef JUCE_PLUGINHOST_AU + //#define JUCE_PLUGINHOST_AU +#endif + +//============================================================================== +// juce_core flags: + +#ifndef JUCE_FORCE_DEBUG + //#define JUCE_FORCE_DEBUG +#endif + +#ifndef JUCE_LOG_ASSERTIONS + //#define JUCE_LOG_ASSERTIONS +#endif + +#ifndef JUCE_CHECK_MEMORY_LEAKS + //#define JUCE_CHECK_MEMORY_LEAKS +#endif + +#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES + //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES +#endif + +#ifndef JUCE_INCLUDE_ZLIB_CODE + //#define JUCE_INCLUDE_ZLIB_CODE +#endif + +//============================================================================== +// juce_graphics flags: + +#ifndef JUCE_USE_COREIMAGE_LOADER + //#define JUCE_USE_COREIMAGE_LOADER +#endif + +#ifndef JUCE_USE_DIRECTWRITE + //#define JUCE_USE_DIRECTWRITE +#endif + +//============================================================================== +// juce_gui_basics flags: + +#ifndef JUCE_ENABLE_REPAINT_DEBUGGING + //#define JUCE_ENABLE_REPAINT_DEBUGGING +#endif + +#ifndef JUCE_USE_XSHM + //#define JUCE_USE_XSHM +#endif + +#ifndef JUCE_USE_XRENDER + //#define JUCE_USE_XRENDER +#endif + +#ifndef JUCE_USE_XCURSOR + //#define JUCE_USE_XCURSOR +#endif + +//============================================================================== +// juce_gui_extra flags: + +#ifndef JUCE_WEB_BROWSER + //#define JUCE_WEB_BROWSER +#endif + +#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR + //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR +#endif + +//============================================================================== +// juce_video flags: + +#ifndef JUCE_DIRECTSHOW + //#define JUCE_DIRECTSHOW +#endif + +#ifndef JUCE_MEDIAFOUNDATION + //#define JUCE_MEDIAFOUNDATION +#endif + +#ifndef JUCE_QUICKTIME + //#define JUCE_QUICKTIME +#endif + +#ifndef JUCE_USE_CAMERA + //#define JUCE_USE_CAMERA +#endif + + +#endif // __JUCE_APPCONFIG_PANJXP__ diff --git a/Examples/AudioAppExample/JuceLibraryCode/JuceHeader.h b/Examples/AudioAppExample/JuceLibraryCode/JuceHeader.h new file mode 100644 index 0000000000..80978b88f8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/JuceHeader.h @@ -0,0 +1,47 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + + This is the header file that your files should include in order to get all the + JUCE library headers. You should avoid including the JUCE headers directly in + your own source files, because that wouldn't pick up the correct configuration + options for your app. + +*/ + +#ifndef __APPHEADERFILE_PANJXP__ +#define __APPHEADERFILE_PANJXP__ + +#include "AppConfig.h" +#include "modules/juce_audio_basics/juce_audio_basics.h" +#include "modules/juce_audio_devices/juce_audio_devices.h" +#include "modules/juce_audio_formats/juce_audio_formats.h" +#include "modules/juce_audio_processors/juce_audio_processors.h" +#include "modules/juce_audio_utils/juce_audio_utils.h" +#include "modules/juce_core/juce_core.h" +#include "modules/juce_cryptography/juce_cryptography.h" +#include "modules/juce_data_structures/juce_data_structures.h" +#include "modules/juce_events/juce_events.h" +#include "modules/juce_graphics/juce_graphics.h" +#include "modules/juce_gui_basics/juce_gui_basics.h" +#include "modules/juce_gui_extra/juce_gui_extra.h" +#include "modules/juce_opengl/juce_opengl.h" +#include "modules/juce_video/juce_video.h" + +#if ! DONT_SET_USING_JUCE_NAMESPACE + // If your code uses a lot of JUCE classes, then this will obviously save you + // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE. + using namespace juce; +#endif + +#if ! JUCE_DONT_DECLARE_PROJECTINFO +namespace ProjectInfo +{ + const char* const projectName = "AudioAppExample"; + const char* const versionString = "1.0.0"; + const int versionNumber = 0x10000; +} +#endif + +#endif // __APPHEADERFILE_PANJXP__ diff --git a/Examples/AudioAppExample/JuceLibraryCode/ReadMe.txt b/Examples/AudioAppExample/JuceLibraryCode/ReadMe.txt new file mode 100644 index 0000000000..f6c3564e99 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/ReadMe.txt @@ -0,0 +1,12 @@ + + Important Note!! + ================ + +The purpose of this folder is to contain files that are auto-generated by the Introjucer, +and ALL files in this folder will be mercilessly DELETED and completely re-written whenever +the Introjucer saves your project. + +Therefore, it's a bad idea to make any manual changes to the files in here, or to +put any of your own files in here if you don't want to lose them. (Of course you may choose +to add the folder's contents to your version-control system so that you can re-merge your own +modifications after the Introjucer has saved its changes). diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp new file mode 100644 index 0000000000..a78b3956b4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp @@ -0,0 +1,600 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +void AudioDataConverters::convertFloatToInt16LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + const double maxVal = (double) 0x7fff; + char* intData = static_cast (dest); + + if (dest != (void*) source || destBytesPerSample <= 4) + { + for (int i = 0; i < numSamples; ++i) + { + *(uint16*) intData = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + intData += destBytesPerSample; + } + } + else + { + intData += destBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= destBytesPerSample; + *(uint16*) intData = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + } + } +} + +void AudioDataConverters::convertFloatToInt16BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + const double maxVal = (double) 0x7fff; + char* intData = static_cast (dest); + + if (dest != (void*) source || destBytesPerSample <= 4) + { + for (int i = 0; i < numSamples; ++i) + { + *(uint16*) intData = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + intData += destBytesPerSample; + } + } + else + { + intData += destBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= destBytesPerSample; + *(uint16*) intData = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + } + } +} + +void AudioDataConverters::convertFloatToInt24LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + const double maxVal = (double) 0x7fffff; + char* intData = static_cast (dest); + + if (dest != (void*) source || destBytesPerSample <= 4) + { + for (int i = 0; i < numSamples; ++i) + { + ByteOrder::littleEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); + intData += destBytesPerSample; + } + } + else + { + intData += destBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= destBytesPerSample; + ByteOrder::littleEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); + } + } +} + +void AudioDataConverters::convertFloatToInt24BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + const double maxVal = (double) 0x7fffff; + char* intData = static_cast (dest); + + if (dest != (void*) source || destBytesPerSample <= 4) + { + for (int i = 0; i < numSamples; ++i) + { + ByteOrder::bigEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); + intData += destBytesPerSample; + } + } + else + { + intData += destBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= destBytesPerSample; + ByteOrder::bigEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); + } + } +} + +void AudioDataConverters::convertFloatToInt32LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + const double maxVal = (double) 0x7fffffff; + char* intData = static_cast (dest); + + if (dest != (void*) source || destBytesPerSample <= 4) + { + for (int i = 0; i < numSamples; ++i) + { + *(uint32*)intData = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + intData += destBytesPerSample; + } + } + else + { + intData += destBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= destBytesPerSample; + *(uint32*)intData = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + } + } +} + +void AudioDataConverters::convertFloatToInt32BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + const double maxVal = (double) 0x7fffffff; + char* intData = static_cast (dest); + + if (dest != (void*) source || destBytesPerSample <= 4) + { + for (int i = 0; i < numSamples; ++i) + { + *(uint32*)intData = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + intData += destBytesPerSample; + } + } + else + { + intData += destBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= destBytesPerSample; + *(uint32*)intData = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); + } + } +} + +void AudioDataConverters::convertFloatToFloat32LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + jassert (dest != (void*) source || destBytesPerSample <= 4); // This op can't be performed on in-place data! + + char* d = static_cast (dest); + + for (int i = 0; i < numSamples; ++i) + { + *(float*) d = source[i]; + + #if JUCE_BIG_ENDIAN + *(uint32*) d = ByteOrder::swap (*(uint32*) d); + #endif + + d += destBytesPerSample; + } +} + +void AudioDataConverters::convertFloatToFloat32BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) +{ + jassert (dest != (void*) source || destBytesPerSample <= 4); // This op can't be performed on in-place data! + + char* d = static_cast (dest); + + for (int i = 0; i < numSamples; ++i) + { + *(float*) d = source[i]; + + #if JUCE_LITTLE_ENDIAN + *(uint32*) d = ByteOrder::swap (*(uint32*) d); + #endif + + d += destBytesPerSample; + } +} + +//============================================================================== +void AudioDataConverters::convertInt16LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const float scale = 1.0f / 0x7fff; + const char* intData = static_cast (source); + + if (source != (void*) dest || srcBytesPerSample >= 4) + { + for (int i = 0; i < numSamples; ++i) + { + dest[i] = scale * (short) ByteOrder::swapIfBigEndian (*(uint16*)intData); + intData += srcBytesPerSample; + } + } + else + { + intData += srcBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= srcBytesPerSample; + dest[i] = scale * (short) ByteOrder::swapIfBigEndian (*(uint16*)intData); + } + } +} + +void AudioDataConverters::convertInt16BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const float scale = 1.0f / 0x7fff; + const char* intData = static_cast (source); + + if (source != (void*) dest || srcBytesPerSample >= 4) + { + for (int i = 0; i < numSamples; ++i) + { + dest[i] = scale * (short) ByteOrder::swapIfLittleEndian (*(uint16*)intData); + intData += srcBytesPerSample; + } + } + else + { + intData += srcBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= srcBytesPerSample; + dest[i] = scale * (short) ByteOrder::swapIfLittleEndian (*(uint16*)intData); + } + } +} + +void AudioDataConverters::convertInt24LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const float scale = 1.0f / 0x7fffff; + const char* intData = static_cast (source); + + if (source != (void*) dest || srcBytesPerSample >= 4) + { + for (int i = 0; i < numSamples; ++i) + { + dest[i] = scale * (short) ByteOrder::littleEndian24Bit (intData); + intData += srcBytesPerSample; + } + } + else + { + intData += srcBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= srcBytesPerSample; + dest[i] = scale * (short) ByteOrder::littleEndian24Bit (intData); + } + } +} + +void AudioDataConverters::convertInt24BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const float scale = 1.0f / 0x7fffff; + const char* intData = static_cast (source); + + if (source != (void*) dest || srcBytesPerSample >= 4) + { + for (int i = 0; i < numSamples; ++i) + { + dest[i] = scale * (short) ByteOrder::bigEndian24Bit (intData); + intData += srcBytesPerSample; + } + } + else + { + intData += srcBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= srcBytesPerSample; + dest[i] = scale * (short) ByteOrder::bigEndian24Bit (intData); + } + } +} + +void AudioDataConverters::convertInt32LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const float scale = 1.0f / 0x7fffffff; + const char* intData = static_cast (source); + + if (source != (void*) dest || srcBytesPerSample >= 4) + { + for (int i = 0; i < numSamples; ++i) + { + dest[i] = scale * (int) ByteOrder::swapIfBigEndian (*(uint32*) intData); + intData += srcBytesPerSample; + } + } + else + { + intData += srcBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= srcBytesPerSample; + dest[i] = scale * (int) ByteOrder::swapIfBigEndian (*(uint32*) intData); + } + } +} + +void AudioDataConverters::convertInt32BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const float scale = 1.0f / 0x7fffffff; + const char* intData = static_cast (source); + + if (source != (void*) dest || srcBytesPerSample >= 4) + { + for (int i = 0; i < numSamples; ++i) + { + dest[i] = scale * (int) ByteOrder::swapIfLittleEndian (*(uint32*) intData); + intData += srcBytesPerSample; + } + } + else + { + intData += srcBytesPerSample * numSamples; + + for (int i = numSamples; --i >= 0;) + { + intData -= srcBytesPerSample; + dest[i] = scale * (int) ByteOrder::swapIfLittleEndian (*(uint32*) intData); + } + } +} + +void AudioDataConverters::convertFloat32LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const char* s = static_cast (source); + + for (int i = 0; i < numSamples; ++i) + { + dest[i] = *(float*)s; + + #if JUCE_BIG_ENDIAN + uint32* const d = (uint32*) (dest + i); + *d = ByteOrder::swap (*d); + #endif + + s += srcBytesPerSample; + } +} + +void AudioDataConverters::convertFloat32BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) +{ + const char* s = static_cast (source); + + for (int i = 0; i < numSamples; ++i) + { + dest[i] = *(float*)s; + + #if JUCE_LITTLE_ENDIAN + uint32* const d = (uint32*) (dest + i); + *d = ByteOrder::swap (*d); + #endif + + s += srcBytesPerSample; + } +} + + +//============================================================================== +void AudioDataConverters::convertFloatToFormat (const DataFormat destFormat, + const float* const source, + void* const dest, + const int numSamples) +{ + switch (destFormat) + { + case int16LE: convertFloatToInt16LE (source, dest, numSamples); break; + case int16BE: convertFloatToInt16BE (source, dest, numSamples); break; + case int24LE: convertFloatToInt24LE (source, dest, numSamples); break; + case int24BE: convertFloatToInt24BE (source, dest, numSamples); break; + case int32LE: convertFloatToInt32LE (source, dest, numSamples); break; + case int32BE: convertFloatToInt32BE (source, dest, numSamples); break; + case float32LE: convertFloatToFloat32LE (source, dest, numSamples); break; + case float32BE: convertFloatToFloat32BE (source, dest, numSamples); break; + default: jassertfalse; break; + } +} + +void AudioDataConverters::convertFormatToFloat (const DataFormat sourceFormat, + const void* const source, + float* const dest, + const int numSamples) +{ + switch (sourceFormat) + { + case int16LE: convertInt16LEToFloat (source, dest, numSamples); break; + case int16BE: convertInt16BEToFloat (source, dest, numSamples); break; + case int24LE: convertInt24LEToFloat (source, dest, numSamples); break; + case int24BE: convertInt24BEToFloat (source, dest, numSamples); break; + case int32LE: convertInt32LEToFloat (source, dest, numSamples); break; + case int32BE: convertInt32BEToFloat (source, dest, numSamples); break; + case float32LE: convertFloat32LEToFloat (source, dest, numSamples); break; + case float32BE: convertFloat32BEToFloat (source, dest, numSamples); break; + default: jassertfalse; break; + } +} + +//============================================================================== +void AudioDataConverters::interleaveSamples (const float** const source, + float* const dest, + const int numSamples, + const int numChannels) +{ + for (int chan = 0; chan < numChannels; ++chan) + { + int i = chan; + const float* src = source [chan]; + + for (int j = 0; j < numSamples; ++j) + { + dest [i] = src [j]; + i += numChannels; + } + } +} + +void AudioDataConverters::deinterleaveSamples (const float* const source, + float** const dest, + const int numSamples, + const int numChannels) +{ + for (int chan = 0; chan < numChannels; ++chan) + { + int i = chan; + float* dst = dest [chan]; + + for (int j = 0; j < numSamples; ++j) + { + dst [j] = source [i]; + i += numChannels; + } + } +} + + +//============================================================================== +#if JUCE_UNIT_TESTS + +class AudioConversionTests : public UnitTest +{ +public: + AudioConversionTests() : UnitTest ("Audio data conversion") {} + + template + struct Test5 + { + static void test (UnitTest& unitTest, Random& r) + { + test (unitTest, false, r); + test (unitTest, true, r); + } + + static void test (UnitTest& unitTest, bool inPlace, Random& r) + { + const int numSamples = 2048; + int32 original [numSamples], converted [numSamples], reversed [numSamples]; + + { + AudioData::Pointer d (original); + bool clippingFailed = false; + + for (int i = 0; i < numSamples / 2; ++i) + { + d.setAsFloat (r.nextFloat() * 2.2f - 1.1f); + + if (! d.isFloatingPoint()) + clippingFailed = d.getAsFloat() > 1.0f || d.getAsFloat() < -1.0f || clippingFailed; + + ++d; + d.setAsInt32 (r.nextInt()); + ++d; + } + + unitTest.expect (! clippingFailed); + } + + // convert data from the source to dest format.. + ScopedPointer conv (new AudioData::ConverterInstance , + AudioData::Pointer >()); + conv->convertSamples (inPlace ? reversed : converted, original, numSamples); + + // ..and back again.. + conv = new AudioData::ConverterInstance , + AudioData::Pointer >(); + if (! inPlace) + zeromem (reversed, sizeof (reversed)); + + conv->convertSamples (reversed, inPlace ? reversed : converted, numSamples); + + { + int biggestDiff = 0; + AudioData::Pointer d1 (original); + AudioData::Pointer d2 (reversed); + + const int errorMargin = 2 * AudioData::Pointer::get32BitResolution() + + AudioData::Pointer::get32BitResolution(); + + for (int i = 0; i < numSamples; ++i) + { + biggestDiff = jmax (biggestDiff, std::abs (d1.getAsInt32() - d2.getAsInt32())); + ++d1; + ++d2; + } + + unitTest.expect (biggestDiff <= errorMargin); + } + } + }; + + template + struct Test3 + { + static void test (UnitTest& unitTest, Random& r) + { + Test5 ::test (unitTest, r); + Test5 ::test (unitTest, r); + } + }; + + template + struct Test2 + { + static void test (UnitTest& unitTest, Random& r) + { + Test3 ::test (unitTest, r); + Test3 ::test (unitTest, r); + Test3 ::test (unitTest, r); + Test3 ::test (unitTest, r); + Test3 ::test (unitTest, r); + Test3 ::test (unitTest, r); + } + }; + + template + struct Test1 + { + static void test (UnitTest& unitTest, Random& r) + { + Test2 ::test (unitTest, r); + Test2 ::test (unitTest, r); + } + }; + + void runTest() + { + Random r = getRandom(); + beginTest ("Round-trip conversion: Int8"); + Test1 ::test (*this, r); + beginTest ("Round-trip conversion: Int16"); + Test1 ::test (*this, r); + beginTest ("Round-trip conversion: Int24"); + Test1 ::test (*this, r); + beginTest ("Round-trip conversion: Int32"); + Test1 ::test (*this, r); + beginTest ("Round-trip conversion: Float32"); + Test1 ::test (*this, r); + } +}; + +static AudioConversionTests audioConversionUnitTests; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h new file mode 100644 index 0000000000..b3f49a63df --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h @@ -0,0 +1,710 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIODATACONVERTERS_H_INCLUDED +#define JUCE_AUDIODATACONVERTERS_H_INCLUDED + + +//============================================================================== +/** + This class a container which holds all the classes pertaining to the AudioData::Pointer + audio sample format class. + + @see AudioData::Pointer. +*/ +class JUCE_API AudioData +{ +public: + //============================================================================== + // These types can be used as the SampleFormat template parameter for the AudioData::Pointer class. + + class Int8; /**< Used as a template parameter for AudioData::Pointer. Indicates an 8-bit integer packed data format. */ + class UInt8; /**< Used as a template parameter for AudioData::Pointer. Indicates an 8-bit unsigned integer packed data format. */ + class Int16; /**< Used as a template parameter for AudioData::Pointer. Indicates an 16-bit integer packed data format. */ + class Int24; /**< Used as a template parameter for AudioData::Pointer. Indicates an 24-bit integer packed data format. */ + class Int32; /**< Used as a template parameter for AudioData::Pointer. Indicates an 32-bit integer packed data format. */ + class Float32; /**< Used as a template parameter for AudioData::Pointer. Indicates an 32-bit float data format. */ + + //============================================================================== + // These types can be used as the Endianness template parameter for the AudioData::Pointer class. + + class BigEndian; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored in big-endian order. */ + class LittleEndian; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored in little-endian order. */ + class NativeEndian; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored in the CPU's native endianness. */ + + //============================================================================== + // These types can be used as the InterleavingType template parameter for the AudioData::Pointer class. + + class NonInterleaved; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored contiguously. */ + class Interleaved; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are interleaved with a number of other channels. */ + + //============================================================================== + // These types can be used as the Constness template parameter for the AudioData::Pointer class. + + class NonConst; /**< Used as a template parameter for AudioData::Pointer. Indicates that the pointer can be used for non-const data. */ + class Const; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples can only be used for const data.. */ + + #ifndef DOXYGEN + //============================================================================== + class BigEndian + { + public: + template static inline float getAsFloat (SampleFormatType& s) noexcept { return s.getAsFloatBE(); } + template static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatBE (newValue); } + template static inline int32 getAsInt32 (SampleFormatType& s) noexcept { return s.getAsInt32BE(); } + template static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32BE (newValue); } + template static inline void copyFrom (DestType& dest, SourceType& source) noexcept { dest.copyFromBE (source); } + enum { isBigEndian = 1 }; + }; + + class LittleEndian + { + public: + template static inline float getAsFloat (SampleFormatType& s) noexcept { return s.getAsFloatLE(); } + template static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatLE (newValue); } + template static inline int32 getAsInt32 (SampleFormatType& s) noexcept { return s.getAsInt32LE(); } + template static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32LE (newValue); } + template static inline void copyFrom (DestType& dest, SourceType& source) noexcept { dest.copyFromLE (source); } + enum { isBigEndian = 0 }; + }; + + #if JUCE_BIG_ENDIAN + class NativeEndian : public BigEndian {}; + #else + class NativeEndian : public LittleEndian {}; + #endif + + //============================================================================== + class Int8 + { + public: + inline Int8 (void* d) noexcept : data (static_cast (d)) {} + + inline void advance() noexcept { ++data; } + inline void skip (int numSamples) noexcept { data += numSamples; } + inline float getAsFloatLE() const noexcept { return (float) (*data * (1.0 / (1.0 + maxValue))); } + inline float getAsFloatBE() const noexcept { return getAsFloatLE(); } + inline void setAsFloatLE (float newValue) noexcept { *data = (int8) jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue))); } + inline void setAsFloatBE (float newValue) noexcept { setAsFloatLE (newValue); } + inline int32 getAsInt32LE() const noexcept { return (int) (*data << 24); } + inline int32 getAsInt32BE() const noexcept { return getAsInt32LE(); } + inline void setAsInt32LE (int newValue) noexcept { *data = (int8) (newValue >> 24); } + inline void setAsInt32BE (int newValue) noexcept { setAsInt32LE (newValue); } + inline void clear() noexcept { *data = 0; } + inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} + template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } + inline void copyFromSameType (Int8& source) noexcept { *data = *source.data; } + + int8* data; + enum { bytesPerSample = 1, maxValue = 0x7f, resolution = (1 << 24), isFloat = 0 }; + }; + + class UInt8 + { + public: + inline UInt8 (void* d) noexcept : data (static_cast (d)) {} + + inline void advance() noexcept { ++data; } + inline void skip (int numSamples) noexcept { data += numSamples; } + inline float getAsFloatLE() const noexcept { return (float) ((*data - 128) * (1.0 / (1.0 + maxValue))); } + inline float getAsFloatBE() const noexcept { return getAsFloatLE(); } + inline void setAsFloatLE (float newValue) noexcept { *data = (uint8) jlimit (0, 255, 128 + roundToInt (newValue * (1.0 + maxValue))); } + inline void setAsFloatBE (float newValue) noexcept { setAsFloatLE (newValue); } + inline int32 getAsInt32LE() const noexcept { return (int) ((*data - 128) << 24); } + inline int32 getAsInt32BE() const noexcept { return getAsInt32LE(); } + inline void setAsInt32LE (int newValue) noexcept { *data = (uint8) (128 + (newValue >> 24)); } + inline void setAsInt32BE (int newValue) noexcept { setAsInt32LE (newValue); } + inline void clear() noexcept { *data = 128; } + inline void clearMultiple (int num) noexcept { memset (data, 128, (size_t) num) ;} + template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } + inline void copyFromSameType (UInt8& source) noexcept { *data = *source.data; } + + uint8* data; + enum { bytesPerSample = 1, maxValue = 0x7f, resolution = (1 << 24), isFloat = 0 }; + }; + + class Int16 + { + public: + inline Int16 (void* d) noexcept : data (static_cast (d)) {} + + inline void advance() noexcept { ++data; } + inline void skip (int numSamples) noexcept { data += numSamples; } + inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int16) ByteOrder::swapIfBigEndian (*data)); } + inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int16) ByteOrder::swapIfLittleEndian (*data)); } + inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint16) jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue)))); } + inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint16) jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue)))); } + inline int32 getAsInt32LE() const noexcept { return (int32) (ByteOrder::swapIfBigEndian ((uint16) *data) << 16); } + inline int32 getAsInt32BE() const noexcept { return (int32) (ByteOrder::swapIfLittleEndian ((uint16) *data) << 16); } + inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint16) (newValue >> 16)); } + inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint16) (newValue >> 16)); } + inline void clear() noexcept { *data = 0; } + inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} + template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } + inline void copyFromSameType (Int16& source) noexcept { *data = *source.data; } + + uint16* data; + enum { bytesPerSample = 2, maxValue = 0x7fff, resolution = (1 << 16), isFloat = 0 }; + }; + + class Int24 + { + public: + inline Int24 (void* d) noexcept : data (static_cast (d)) {} + + inline void advance() noexcept { data += 3; } + inline void skip (int numSamples) noexcept { data += 3 * numSamples; } + inline float getAsFloatLE() const noexcept { return (float) (ByteOrder::littleEndian24Bit (data) * (1.0 / (1.0 + maxValue))); } + inline float getAsFloatBE() const noexcept { return (float) (ByteOrder::bigEndian24Bit (data) * (1.0 / (1.0 + maxValue))); } + inline void setAsFloatLE (float newValue) noexcept { ByteOrder::littleEndian24BitToChars (jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue))), data); } + inline void setAsFloatBE (float newValue) noexcept { ByteOrder::bigEndian24BitToChars (jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue))), data); } + inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::littleEndian24Bit (data) << 8; } + inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::bigEndian24Bit (data) << 8; } + inline void setAsInt32LE (int32 newValue) noexcept { ByteOrder::littleEndian24BitToChars (newValue >> 8, data); } + inline void setAsInt32BE (int32 newValue) noexcept { ByteOrder::bigEndian24BitToChars (newValue >> 8, data); } + inline void clear() noexcept { data[0] = 0; data[1] = 0; data[2] = 0; } + inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} + template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } + inline void copyFromSameType (Int24& source) noexcept { data[0] = source.data[0]; data[1] = source.data[1]; data[2] = source.data[2]; } + + char* data; + enum { bytesPerSample = 3, maxValue = 0x7fffff, resolution = (1 << 8), isFloat = 0 }; + }; + + class Int32 + { + public: + inline Int32 (void* d) noexcept : data (static_cast (d)) {} + + inline void advance() noexcept { ++data; } + inline void skip (int numSamples) noexcept { data += numSamples; } + inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfBigEndian (*data)); } + inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfLittleEndian (*data)); } + inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } + inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } + inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data); } + inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::swapIfLittleEndian (*data); } + inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue); } + inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) newValue); } + inline void clear() noexcept { *data = 0; } + inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} + template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } + inline void copyFromSameType (Int32& source) noexcept { *data = *source.data; } + + uint32* data; + enum { bytesPerSample = 4, maxValue = 0x7fffffff, resolution = 1, isFloat = 0 }; + }; + + /** A 32-bit integer type, of which only the bottom 24 bits are used. */ + class Int24in32 : public Int32 + { + public: + inline Int24in32 (void* d) noexcept : Int32 (d) {} + + inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfBigEndian (*data)); } + inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfLittleEndian (*data)); } + inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } + inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } + inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data) << 8; } + inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::swapIfLittleEndian (*data) << 8; } + inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue >> 8); } + inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) newValue >> 8); } + template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } + inline void copyFromSameType (Int24in32& source) noexcept { *data = *source.data; } + + enum { bytesPerSample = 4, maxValue = 0x7fffff, resolution = (1 << 8), isFloat = 0 }; + }; + + class Float32 + { + public: + inline Float32 (void* d) noexcept : data (static_cast (d)) {} + + inline void advance() noexcept { ++data; } + inline void skip (int numSamples) noexcept { data += numSamples; } + #if JUCE_BIG_ENDIAN + inline float getAsFloatBE() const noexcept { return *data; } + inline void setAsFloatBE (float newValue) noexcept { *data = newValue; } + inline float getAsFloatLE() const noexcept { union { uint32 asInt; float asFloat; } n; n.asInt = ByteOrder::swap (*(uint32*) data); return n.asFloat; } + inline void setAsFloatLE (float newValue) noexcept { union { uint32 asInt; float asFloat; } n; n.asFloat = newValue; *(uint32*) data = ByteOrder::swap (n.asInt); } + #else + inline float getAsFloatLE() const noexcept { return *data; } + inline void setAsFloatLE (float newValue) noexcept { *data = newValue; } + inline float getAsFloatBE() const noexcept { union { uint32 asInt; float asFloat; } n; n.asInt = ByteOrder::swap (*(uint32*) data); return n.asFloat; } + inline void setAsFloatBE (float newValue) noexcept { union { uint32 asInt; float asFloat; } n; n.asFloat = newValue; *(uint32*) data = ByteOrder::swap (n.asInt); } + #endif + inline int32 getAsInt32LE() const noexcept { return (int32) roundToInt (jlimit (-1.0, 1.0, (double) getAsFloatLE()) * (double) maxValue); } + inline int32 getAsInt32BE() const noexcept { return (int32) roundToInt (jlimit (-1.0, 1.0, (double) getAsFloatBE()) * (double) maxValue); } + inline void setAsInt32LE (int32 newValue) noexcept { setAsFloatLE ((float) (newValue * (1.0 / (1.0 + maxValue)))); } + inline void setAsInt32BE (int32 newValue) noexcept { setAsFloatBE ((float) (newValue * (1.0 / (1.0 + maxValue)))); } + inline void clear() noexcept { *data = 0; } + inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} + template inline void copyFromLE (SourceType& source) noexcept { setAsFloatLE (source.getAsFloat()); } + template inline void copyFromBE (SourceType& source) noexcept { setAsFloatBE (source.getAsFloat()); } + inline void copyFromSameType (Float32& source) noexcept { *data = *source.data; } + + float* data; + enum { bytesPerSample = 4, maxValue = 0x7fffffff, resolution = (1 << 8), isFloat = 1 }; + }; + + //============================================================================== + class NonInterleaved + { + public: + inline NonInterleaved() noexcept {} + inline NonInterleaved (const NonInterleaved&) noexcept {} + inline NonInterleaved (const int) noexcept {} + inline void copyFrom (const NonInterleaved&) noexcept {} + template inline void advanceData (SampleFormatType& s) noexcept { s.advance(); } + template inline void advanceDataBy (SampleFormatType& s, int numSamples) noexcept { s.skip (numSamples); } + template inline void clear (SampleFormatType& s, int numSamples) noexcept { s.clearMultiple (numSamples); } + template inline static int getNumBytesBetweenSamples (const SampleFormatType&) noexcept { return SampleFormatType::bytesPerSample; } + + enum { isInterleavedType = 0, numInterleavedChannels = 1 }; + }; + + class Interleaved + { + public: + inline Interleaved() noexcept : numInterleavedChannels (1) {} + inline Interleaved (const Interleaved& other) noexcept : numInterleavedChannels (other.numInterleavedChannels) {} + inline Interleaved (const int numInterleavedChans) noexcept : numInterleavedChannels (numInterleavedChans) {} + inline void copyFrom (const Interleaved& other) noexcept { numInterleavedChannels = other.numInterleavedChannels; } + template inline void advanceData (SampleFormatType& s) noexcept { s.skip (numInterleavedChannels); } + template inline void advanceDataBy (SampleFormatType& s, int numSamples) noexcept { s.skip (numInterleavedChannels * numSamples); } + template inline void clear (SampleFormatType& s, int numSamples) noexcept { while (--numSamples >= 0) { s.clear(); s.skip (numInterleavedChannels); } } + template inline int getNumBytesBetweenSamples (const SampleFormatType&) const noexcept { return numInterleavedChannels * SampleFormatType::bytesPerSample; } + int numInterleavedChannels; + enum { isInterleavedType = 1 }; + }; + + //============================================================================== + class NonConst + { + public: + typedef void VoidType; + static inline void* toVoidPtr (VoidType* v) noexcept { return v; } + enum { isConst = 0 }; + }; + + class Const + { + public: + typedef const void VoidType; + static inline void* toVoidPtr (VoidType* v) noexcept { return const_cast (v); } + enum { isConst = 1 }; + }; + #endif + + //============================================================================== + /** + A pointer to a block of audio data with a particular encoding. + + This object can be used to read and write from blocks of encoded audio samples. To create one, you specify + the audio format as a series of template parameters, e.g. + @code + // this creates a pointer for reading from a const array of 16-bit little-endian packed samples. + AudioData::Pointer pointer (someRawAudioData); + + // These methods read the sample that is being pointed to + float firstSampleAsFloat = pointer.getAsFloat(); + int32 firstSampleAsInt = pointer.getAsInt32(); + ++pointer; // moves the pointer to the next sample. + pointer += 3; // skips the next 3 samples. + @endcode + + The convertSamples() method lets you copy a range of samples from one format to another, automatically + converting its format. + + @see AudioData::Converter + */ + template + class Pointer : private InterleavingType // (inherited for EBCO) + { + public: + //============================================================================== + /** Creates a non-interleaved pointer from some raw data in the appropriate format. + This constructor is only used if you've specified the AudioData::NonInterleaved option - + for interleaved formats, use the constructor that also takes a number of channels. + */ + Pointer (typename Constness::VoidType* sourceData) noexcept + : data (Constness::toVoidPtr (sourceData)) + { + // If you're using interleaved data, call the other constructor! If you're using non-interleaved data, + // you should pass NonInterleaved as the template parameter for the interleaving type! + static_jassert (InterleavingType::isInterleavedType == 0); + } + + /** Creates a pointer from some raw data in the appropriate format with the specified number of interleaved channels. + For non-interleaved data, use the other constructor. + */ + Pointer (typename Constness::VoidType* sourceData, int numInterleaved) noexcept + : InterleavingType (numInterleaved), data (Constness::toVoidPtr (sourceData)) + { + } + + /** Creates a copy of another pointer. */ + Pointer (const Pointer& other) noexcept + : InterleavingType (other), data (other.data) + { + } + + Pointer& operator= (const Pointer& other) noexcept + { + InterleavingType::operator= (other); + data = other.data; + return *this; + } + + //============================================================================== + /** Returns the value of the first sample as a floating point value. + The value will be in the range -1.0 to 1.0 for integer formats. For floating point + formats, the value could be outside that range, although -1 to 1 is the standard range. + */ + inline float getAsFloat() const noexcept { return Endianness::getAsFloat (data); } + + /** Sets the value of the first sample as a floating point value. + + (This method can only be used if the AudioData::NonConst option was used). + The value should be in the range -1.0 to 1.0 - for integer formats, values outside that + range will be clipped. For floating point formats, any value passed in here will be + written directly, although -1 to 1 is the standard range. + */ + inline void setAsFloat (float newValue) noexcept + { + static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! + Endianness::setAsFloat (data, newValue); + } + + /** Returns the value of the first sample as a 32-bit integer. + The value returned will be in the range 0x80000000 to 0x7fffffff, and shorter values will be + shifted to fill this range (e.g. if you're reading from 24-bit data, the values will be shifted up + by 8 bits when returned here). If the source data is floating point, values beyond -1.0 to 1.0 will + be clipped so that -1.0 maps onto -0x7fffffff and 1.0 maps to 0x7fffffff. + */ + inline int32 getAsInt32() const noexcept { return Endianness::getAsInt32 (data); } + + /** Sets the value of the first sample as a 32-bit integer. + This will be mapped to the range of the format that is being written - see getAsInt32(). + */ + inline void setAsInt32 (int32 newValue) noexcept + { + static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! + Endianness::setAsInt32 (data, newValue); + } + + /** Moves the pointer along to the next sample. */ + inline Pointer& operator++() noexcept { advance(); return *this; } + + /** Moves the pointer back to the previous sample. */ + inline Pointer& operator--() noexcept { this->advanceDataBy (data, -1); return *this; } + + /** Adds a number of samples to the pointer's position. */ + Pointer& operator+= (int samplesToJump) noexcept { this->advanceDataBy (data, samplesToJump); return *this; } + + /** Writes a stream of samples into this pointer from another pointer. + This will copy the specified number of samples, converting between formats appropriately. + */ + void convertSamples (Pointer source, int numSamples) const noexcept + { + static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! + + for (Pointer dest (*this); --numSamples >= 0;) + { + dest.data.copyFromSameType (source.data); + dest.advance(); + source.advance(); + } + } + + /** Writes a stream of samples into this pointer from another pointer. + This will copy the specified number of samples, converting between formats appropriately. + */ + template + void convertSamples (OtherPointerType source, int numSamples) const noexcept + { + static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! + + Pointer dest (*this); + + if (source.getRawData() != getRawData() || source.getNumBytesBetweenSamples() >= getNumBytesBetweenSamples()) + { + while (--numSamples >= 0) + { + Endianness::copyFrom (dest.data, source); + dest.advance(); + ++source; + } + } + else // copy backwards if we're increasing the sample width.. + { + dest += numSamples; + source += numSamples; + + while (--numSamples >= 0) + Endianness::copyFrom ((--dest).data, --source); + } + } + + /** Sets a number of samples to zero. */ + void clearSamples (int numSamples) const noexcept + { + Pointer dest (*this); + dest.clear (dest.data, numSamples); + } + + /** Scans a block of data, returning the lowest and highest levels as floats */ + void findMinAndMax (size_t numSamples, float& minValue, float& maxValue) const noexcept + { + if (numSamples == 0) + { + minValue = maxValue = 0; + return; + } + + Pointer dest (*this); + + if (isFloatingPoint()) + { + float mn = dest.getAsFloat(); + dest.advance(); + float mx = mn; + + while (--numSamples > 0) + { + const float v = dest.getAsFloat(); + dest.advance(); + + if (mx < v) mx = v; + if (v < mn) mn = v; + } + + minValue = mn; + maxValue = mx; + } + else + { + int32 mn = dest.getAsInt32(); + dest.advance(); + int32 mx = mn; + + while (--numSamples > 0) + { + const int v = dest.getAsInt32(); + dest.advance(); + + if (mx < v) mx = v; + if (v < mn) mn = v; + } + + minValue = mn * (float) (1.0 / (1.0 + Int32::maxValue)); + maxValue = mx * (float) (1.0 / (1.0 + Int32::maxValue)); + } + } + + /** Returns true if the pointer is using a floating-point format. */ + static bool isFloatingPoint() noexcept { return (bool) SampleFormat::isFloat; } + + /** Returns true if the format is big-endian. */ + static bool isBigEndian() noexcept { return (bool) Endianness::isBigEndian; } + + /** Returns the number of bytes in each sample (ignoring the number of interleaved channels). */ + static int getBytesPerSample() noexcept { return (int) SampleFormat::bytesPerSample; } + + /** Returns the number of interleaved channels in the format. */ + int getNumInterleavedChannels() const noexcept { return (int) this->numInterleavedChannels; } + + /** Returns the number of bytes between the start address of each sample. */ + int getNumBytesBetweenSamples() const noexcept { return InterleavingType::getNumBytesBetweenSamples (data); } + + /** Returns the accuracy of this format when represented as a 32-bit integer. + This is the smallest number above 0 that can be represented in the sample format, converted to + a 32-bit range. E,g. if the format is 8-bit, its resolution is 0x01000000; if the format is 24-bit, + its resolution is 0x100. + */ + static int get32BitResolution() noexcept { return (int) SampleFormat::resolution; } + + /** Returns a pointer to the underlying data. */ + const void* getRawData() const noexcept { return data.data; } + + private: + //============================================================================== + SampleFormat data; + + inline void advance() noexcept { this->advanceData (data); } + + Pointer operator++ (int); // private to force you to use the more efficient pre-increment! + Pointer operator-- (int); + }; + + //============================================================================== + /** A base class for objects that are used to convert between two different sample formats. + + The AudioData::ConverterInstance implements this base class and can be templated, so + you can create an instance that converts between two particular formats, and then + store this in the abstract base class. + + @see AudioData::ConverterInstance + */ + class Converter + { + public: + virtual ~Converter() {} + + /** Converts a sequence of samples from the converter's source format into the dest format. */ + virtual void convertSamples (void* destSamples, const void* sourceSamples, int numSamples) const = 0; + + /** Converts a sequence of samples from the converter's source format into the dest format. + This method takes sub-channel indexes, which can be used with interleaved formats in order to choose a + particular sub-channel of the data to be used. + */ + virtual void convertSamples (void* destSamples, int destSubChannel, + const void* sourceSamples, int sourceSubChannel, int numSamples) const = 0; + }; + + //============================================================================== + /** + A class that converts between two templated AudioData::Pointer types, and which + implements the AudioData::Converter interface. + + This can be used as a concrete instance of the AudioData::Converter abstract class. + + @see AudioData::Converter + */ + template + class ConverterInstance : public Converter + { + public: + ConverterInstance (int numSourceChannels = 1, int numDestChannels = 1) + : sourceChannels (numSourceChannels), destChannels (numDestChannels) + {} + + void convertSamples (void* dest, const void* source, int numSamples) const override + { + SourceSampleType s (source, sourceChannels); + DestSampleType d (dest, destChannels); + d.convertSamples (s, numSamples); + } + + void convertSamples (void* dest, int destSubChannel, + const void* source, int sourceSubChannel, int numSamples) const override + { + jassert (destSubChannel < destChannels && sourceSubChannel < sourceChannels); + + SourceSampleType s (addBytesToPointer (source, sourceSubChannel * SourceSampleType::getBytesPerSample()), sourceChannels); + DestSampleType d (addBytesToPointer (dest, destSubChannel * DestSampleType::getBytesPerSample()), destChannels); + d.convertSamples (s, numSamples); + } + + private: + JUCE_DECLARE_NON_COPYABLE (ConverterInstance) + + const int sourceChannels, destChannels; + }; +}; + + + +//============================================================================== +/** + A set of routines to convert buffers of 32-bit floating point data to and from + various integer formats. + + Note that these functions are deprecated - the AudioData class provides a much more + flexible set of conversion classes now. +*/ +class JUCE_API AudioDataConverters +{ +public: + //============================================================================== + static void convertFloatToInt16LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 2); + static void convertFloatToInt16BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 2); + + static void convertFloatToInt24LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 3); + static void convertFloatToInt24BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 3); + + static void convertFloatToInt32LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); + static void convertFloatToInt32BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); + + static void convertFloatToFloat32LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); + static void convertFloatToFloat32BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); + + //============================================================================== + static void convertInt16LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 2); + static void convertInt16BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 2); + + static void convertInt24LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 3); + static void convertInt24BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 3); + + static void convertInt32LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); + static void convertInt32BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); + + static void convertFloat32LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); + static void convertFloat32BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); + + //============================================================================== + enum DataFormat + { + int16LE, + int16BE, + int24LE, + int24BE, + int32LE, + int32BE, + float32LE, + float32BE, + }; + + static void convertFloatToFormat (DataFormat destFormat, + const float* source, void* dest, int numSamples); + + static void convertFormatToFloat (DataFormat sourceFormat, + const void* source, float* dest, int numSamples); + + //============================================================================== + static void interleaveSamples (const float** source, float* dest, + int numSamples, int numChannels); + + static void deinterleaveSamples (const float* source, float** dest, + int numSamples, int numChannels); + +private: + AudioDataConverters(); + JUCE_DECLARE_NON_COPYABLE (AudioDataConverters) +}; + + +#endif // JUCE_AUDIODATACONVERTERS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp new file mode 100644 index 0000000000..15b59dafce --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp @@ -0,0 +1,670 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioSampleBuffer::AudioSampleBuffer() noexcept + : numChannels (0), size (0), allocatedBytes (0), + channels (static_cast (preallocatedChannelSpace)), + isClear (false) +{ +} + +AudioSampleBuffer::AudioSampleBuffer (const int numChans, + const int numSamples) noexcept + : numChannels (numChans), + size (numSamples) +{ + jassert (numSamples >= 0); + jassert (numChans >= 0); + + allocateData(); +} + +AudioSampleBuffer::AudioSampleBuffer (const AudioSampleBuffer& other) noexcept + : numChannels (other.numChannels), + size (other.size), + allocatedBytes (other.allocatedBytes) +{ + if (allocatedBytes == 0) + { + allocateChannels (other.channels, 0); + } + else + { + allocateData(); + + if (other.isClear) + { + clear(); + } + else + { + for (int i = 0; i < numChannels; ++i) + FloatVectorOperations::copy (channels[i], other.channels[i], size); + } + } +} + +void AudioSampleBuffer::allocateData() +{ + const size_t channelListSize = sizeof (float*) * (size_t) (numChannels + 1); + allocatedBytes = (size_t) numChannels * (size_t) size * sizeof (float) + channelListSize + 32; + allocatedData.malloc (allocatedBytes); + channels = reinterpret_cast (allocatedData.getData()); + + float* chan = (float*) (allocatedData + channelListSize); + for (int i = 0; i < numChannels; ++i) + { + channels[i] = chan; + chan += size; + } + + channels [numChannels] = nullptr; + isClear = false; +} + +AudioSampleBuffer::AudioSampleBuffer (float* const* dataToReferTo, + const int numChans, + const int numSamples) noexcept + : numChannels (numChans), + size (numSamples), + allocatedBytes (0) +{ + jassert (dataToReferTo != nullptr); + jassert (numChans >= 0 && numSamples >= 0); + allocateChannels (dataToReferTo, 0); +} + +AudioSampleBuffer::AudioSampleBuffer (float* const* dataToReferTo, + const int numChans, + const int startSample, + const int numSamples) noexcept + : numChannels (numChans), + size (numSamples), + allocatedBytes (0), + isClear (false) +{ + jassert (dataToReferTo != nullptr); + jassert (numChans >= 0 && startSample >= 0 && numSamples >= 0); + allocateChannels (dataToReferTo, startSample); +} + +void AudioSampleBuffer::setDataToReferTo (float** dataToReferTo, + const int newNumChannels, + const int newNumSamples) noexcept +{ + jassert (dataToReferTo != nullptr); + jassert (newNumChannels >= 0 && newNumSamples >= 0); + + allocatedBytes = 0; + allocatedData.free(); + + numChannels = newNumChannels; + size = newNumSamples; + + allocateChannels (dataToReferTo, 0); + jassert (! isClear); +} + +void AudioSampleBuffer::allocateChannels (float* const* const dataToReferTo, int offset) +{ + jassert (offset >= 0); + + // (try to avoid doing a malloc here, as that'll blow up things like Pro-Tools) + if (numChannels < (int) numElementsInArray (preallocatedChannelSpace)) + { + channels = static_cast (preallocatedChannelSpace); + } + else + { + allocatedData.malloc ((size_t) numChannels + 1, sizeof (float*)); + channels = reinterpret_cast (allocatedData.getData()); + } + + for (int i = 0; i < numChannels; ++i) + { + // you have to pass in the same number of valid pointers as numChannels + jassert (dataToReferTo[i] != nullptr); + + channels[i] = dataToReferTo[i] + offset; + } + + channels [numChannels] = nullptr; + isClear = false; +} + +AudioSampleBuffer& AudioSampleBuffer::operator= (const AudioSampleBuffer& other) noexcept +{ + if (this != &other) + { + setSize (other.getNumChannels(), other.getNumSamples(), false, false, false); + + if (other.isClear) + { + clear(); + } + else + { + isClear = false; + + for (int i = 0; i < numChannels; ++i) + FloatVectorOperations::copy (channels[i], other.channels[i], size); + } + } + + return *this; +} + +AudioSampleBuffer::~AudioSampleBuffer() noexcept +{ +} + +void AudioSampleBuffer::setSize (const int newNumChannels, + const int newNumSamples, + const bool keepExistingContent, + const bool clearExtraSpace, + const bool avoidReallocating) noexcept +{ + jassert (newNumChannels >= 0); + jassert (newNumSamples >= 0); + + if (newNumSamples != size || newNumChannels != numChannels) + { + const size_t allocatedSamplesPerChannel = ((size_t) newNumSamples + 3) & ~3u; + const size_t channelListSize = ((sizeof (float*) * (size_t) (newNumChannels + 1)) + 15) & ~15u; + const size_t newTotalBytes = ((size_t) newNumChannels * (size_t) allocatedSamplesPerChannel * sizeof (float)) + + channelListSize + 32; + + if (keepExistingContent) + { + HeapBlock newData; + newData.allocate (newTotalBytes, clearExtraSpace || isClear); + + const size_t numSamplesToCopy = (size_t) jmin (newNumSamples, size); + + float** const newChannels = reinterpret_cast (newData.getData()); + float* newChan = reinterpret_cast (newData + channelListSize); + + for (int j = 0; j < newNumChannels; ++j) + { + newChannels[j] = newChan; + newChan += allocatedSamplesPerChannel; + } + + if (! isClear) + { + const int numChansToCopy = jmin (numChannels, newNumChannels); + for (int i = 0; i < numChansToCopy; ++i) + FloatVectorOperations::copy (newChannels[i], channels[i], (int) numSamplesToCopy); + } + + allocatedData.swapWith (newData); + allocatedBytes = newTotalBytes; + channels = newChannels; + } + else + { + if (avoidReallocating && allocatedBytes >= newTotalBytes) + { + if (clearExtraSpace || isClear) + allocatedData.clear (newTotalBytes); + } + else + { + allocatedBytes = newTotalBytes; + allocatedData.allocate (newTotalBytes, clearExtraSpace || isClear); + channels = reinterpret_cast (allocatedData.getData()); + } + + float* chan = reinterpret_cast (allocatedData + channelListSize); + for (int i = 0; i < newNumChannels; ++i) + { + channels[i] = chan; + chan += allocatedSamplesPerChannel; + } + } + + channels [newNumChannels] = 0; + size = newNumSamples; + numChannels = newNumChannels; + } +} + +void AudioSampleBuffer::clear() noexcept +{ + if (! isClear) + { + for (int i = 0; i < numChannels; ++i) + FloatVectorOperations::clear (channels[i], size); + + isClear = true; + } +} + +void AudioSampleBuffer::clear (const int startSample, + const int numSamples) noexcept +{ + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (! isClear) + { + if (startSample == 0 && numSamples == size) + isClear = true; + + for (int i = 0; i < numChannels; ++i) + FloatVectorOperations::clear (channels[i] + startSample, numSamples); + } +} + +void AudioSampleBuffer::clear (const int channel, + const int startSample, + const int numSamples) noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (! isClear) + FloatVectorOperations::clear (channels [channel] + startSample, numSamples); +} + +float AudioSampleBuffer::getSample (int channel, int index) const noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (isPositiveAndBelow (index, size)); + return *(channels [channel] + index); +} + +void AudioSampleBuffer::setSample (int channel, int index, float newValue) noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (isPositiveAndBelow (index, size)); + *(channels [channel] + index) = newValue; + isClear = false; +} + +void AudioSampleBuffer::addSample (int channel, int index, float valueToAdd) noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (isPositiveAndBelow (index, size)); + *(channels [channel] + index) += valueToAdd; + isClear = false; +} + +void AudioSampleBuffer::applyGain (const int channel, + const int startSample, + int numSamples, + const float gain) noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (gain != 1.0f && ! isClear) + { + float* const d = channels [channel] + startSample; + + if (gain == 0.0f) + FloatVectorOperations::clear (d, numSamples); + else + FloatVectorOperations::multiply (d, gain, numSamples); + } +} + +void AudioSampleBuffer::applyGainRamp (const int channel, + const int startSample, + int numSamples, + float startGain, + float endGain) noexcept +{ + if (! isClear) + { + if (startGain == endGain) + { + applyGain (channel, startSample, numSamples, startGain); + } + else + { + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + const float increment = (endGain - startGain) / numSamples; + float* d = channels [channel] + startSample; + + while (--numSamples >= 0) + { + *d++ *= startGain; + startGain += increment; + } + } + } +} + +void AudioSampleBuffer::applyGain (int startSample, int numSamples, float gain) noexcept +{ + for (int i = 0; i < numChannels; ++i) + applyGain (i, startSample, numSamples, gain); +} + +void AudioSampleBuffer::applyGain (const float gain) noexcept +{ + applyGain (0, size, gain); +} + +void AudioSampleBuffer::applyGainRamp (int startSample, int numSamples, + float startGain, float endGain) noexcept +{ + for (int i = 0; i < numChannels; ++i) + applyGainRamp (i, startSample, numSamples, startGain, endGain); +} + +void AudioSampleBuffer::addFrom (const int destChannel, + const int destStartSample, + const AudioSampleBuffer& source, + const int sourceChannel, + const int sourceStartSample, + int numSamples, + const float gain) noexcept +{ + jassert (&source != this || sourceChannel != destChannel); + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (isPositiveAndBelow (sourceChannel, source.numChannels)); + jassert (sourceStartSample >= 0 && sourceStartSample + numSamples <= source.size); + + if (gain != 0.0f && numSamples > 0 && ! source.isClear) + { + float* const d = channels [destChannel] + destStartSample; + const float* const s = source.channels [sourceChannel] + sourceStartSample; + + if (isClear) + { + isClear = false; + + if (gain != 1.0f) + FloatVectorOperations::copyWithMultiply (d, s, gain, numSamples); + else + FloatVectorOperations::copy (d, s, numSamples); + } + else + { + if (gain != 1.0f) + FloatVectorOperations::addWithMultiply (d, s, gain, numSamples); + else + FloatVectorOperations::add (d, s, numSamples); + } + } +} + +void AudioSampleBuffer::addFrom (const int destChannel, + const int destStartSample, + const float* source, + int numSamples, + const float gain) noexcept +{ + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (source != nullptr); + + if (gain != 0.0f && numSamples > 0) + { + float* const d = channels [destChannel] + destStartSample; + + if (isClear) + { + isClear = false; + + if (gain != 1.0f) + FloatVectorOperations::copyWithMultiply (d, source, gain, numSamples); + else + FloatVectorOperations::copy (d, source, numSamples); + } + else + { + if (gain != 1.0f) + FloatVectorOperations::addWithMultiply (d, source, gain, numSamples); + else + FloatVectorOperations::add (d, source, numSamples); + } + } +} + +void AudioSampleBuffer::addFromWithRamp (const int destChannel, + const int destStartSample, + const float* source, + int numSamples, + float startGain, + const float endGain) noexcept +{ + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (source != nullptr); + + if (startGain == endGain) + { + addFrom (destChannel, destStartSample, source, numSamples, startGain); + } + else + { + if (numSamples > 0 && (startGain != 0.0f || endGain != 0.0f)) + { + isClear = false; + const float increment = (endGain - startGain) / numSamples; + float* d = channels [destChannel] + destStartSample; + + while (--numSamples >= 0) + { + *d++ += startGain * *source++; + startGain += increment; + } + } + } +} + +void AudioSampleBuffer::copyFrom (const int destChannel, + const int destStartSample, + const AudioSampleBuffer& source, + const int sourceChannel, + const int sourceStartSample, + int numSamples) noexcept +{ + jassert (&source != this || sourceChannel != destChannel); + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (isPositiveAndBelow (sourceChannel, source.numChannels)); + jassert (sourceStartSample >= 0 && sourceStartSample + numSamples <= source.size); + + if (numSamples > 0) + { + if (source.isClear) + { + if (! isClear) + FloatVectorOperations::clear (channels [destChannel] + destStartSample, numSamples); + } + else + { + isClear = false; + FloatVectorOperations::copy (channels [destChannel] + destStartSample, + source.channels [sourceChannel] + sourceStartSample, + numSamples); + } + } +} + +void AudioSampleBuffer::copyFrom (const int destChannel, + const int destStartSample, + const float* source, + int numSamples) noexcept +{ + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (source != nullptr); + + if (numSamples > 0) + { + isClear = false; + FloatVectorOperations::copy (channels [destChannel] + destStartSample, source, numSamples); + } +} + +void AudioSampleBuffer::copyFrom (const int destChannel, + const int destStartSample, + const float* source, + int numSamples, + const float gain) noexcept +{ + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (source != nullptr); + + if (numSamples > 0) + { + float* const d = channels [destChannel] + destStartSample; + + if (gain != 1.0f) + { + if (gain == 0) + { + if (! isClear) + FloatVectorOperations::clear (d, numSamples); + } + else + { + isClear = false; + FloatVectorOperations::copyWithMultiply (d, source, gain, numSamples); + } + } + else + { + isClear = false; + FloatVectorOperations::copy (d, source, numSamples); + } + } +} + +void AudioSampleBuffer::copyFromWithRamp (const int destChannel, + const int destStartSample, + const float* source, + int numSamples, + float startGain, + float endGain) noexcept +{ + jassert (isPositiveAndBelow (destChannel, numChannels)); + jassert (destStartSample >= 0 && destStartSample + numSamples <= size); + jassert (source != nullptr); + + if (startGain == endGain) + { + copyFrom (destChannel, destStartSample, source, numSamples, startGain); + } + else + { + if (numSamples > 0 && (startGain != 0.0f || endGain != 0.0f)) + { + isClear = false; + const float increment = (endGain - startGain) / numSamples; + float* d = channels [destChannel] + destStartSample; + + while (--numSamples >= 0) + { + *d++ = startGain * *source++; + startGain += increment; + } + } + } +} + +void AudioSampleBuffer::reverse (int channel, int startSample, int numSamples) const noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (! isClear) + std::reverse (channels[channel] + startSample, + channels[channel] + startSample + numSamples); +} + +void AudioSampleBuffer::reverse (int startSample, int numSamples) const noexcept +{ + for (int i = 0; i < numChannels; ++i) + reverse (i, startSample, numSamples); +} + +Range AudioSampleBuffer::findMinMax (const int channel, + const int startSample, + int numSamples) const noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (isClear) + return Range(); + + return FloatVectorOperations::findMinAndMax (channels [channel] + startSample, numSamples); +} + +float AudioSampleBuffer::getMagnitude (const int channel, + const int startSample, + const int numSamples) const noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (isClear) + return 0.0f; + + const Range r (findMinMax (channel, startSample, numSamples)); + + return jmax (r.getStart(), -r.getStart(), r.getEnd(), -r.getEnd()); +} + +float AudioSampleBuffer::getMagnitude (int startSample, int numSamples) const noexcept +{ + float mag = 0.0f; + + if (! isClear) + for (int i = 0; i < numChannels; ++i) + mag = jmax (mag, getMagnitude (i, startSample, numSamples)); + + return mag; +} + +float AudioSampleBuffer::getRMSLevel (const int channel, + const int startSample, + const int numSamples) const noexcept +{ + jassert (isPositiveAndBelow (channel, numChannels)); + jassert (startSample >= 0 && startSample + numSamples <= size); + + if (numSamples <= 0 || channel < 0 || channel >= numChannels || isClear) + return 0.0f; + + const float* const data = channels [channel] + startSample; + double sum = 0.0; + + for (int i = 0; i < numSamples; ++i) + { + const float sample = data [i]; + sum += sample * sample; + } + + return (float) std::sqrt (sum / numSamples); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h new file mode 100644 index 0000000000..8b9a72c1ff --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h @@ -0,0 +1,526 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOSAMPLEBUFFER_H_INCLUDED +#define JUCE_AUDIOSAMPLEBUFFER_H_INCLUDED + + +//============================================================================== +/** + A multi-channel buffer of 32-bit floating point audio samples. + +*/ +class JUCE_API AudioSampleBuffer +{ +public: + //============================================================================== + /** Creates an empty buffer with 0 channels and 0 length. */ + AudioSampleBuffer() noexcept; + + //============================================================================== + /** Creates a buffer with a specified number of channels and samples. + + The contents of the buffer will initially be undefined, so use clear() to + set all the samples to zero. + + The buffer will allocate its memory internally, and this will be released + when the buffer is deleted. If the memory can't be allocated, this will + throw a std::bad_alloc exception. + */ + AudioSampleBuffer (int numChannels, + int numSamples) noexcept; + + /** Creates a buffer using a pre-allocated block of memory. + + Note that if the buffer is resized or its number of channels is changed, it + will re-allocate memory internally and copy the existing data to this new area, + so it will then stop directly addressing this memory. + + @param dataToReferTo a pre-allocated array containing pointers to the data + for each channel that should be used by this buffer. The + buffer will only refer to this memory, it won't try to delete + it when the buffer is deleted or resized. + @param numChannels the number of channels to use - this must correspond to the + number of elements in the array passed in + @param numSamples the number of samples to use - this must correspond to the + size of the arrays passed in + */ + AudioSampleBuffer (float* const* dataToReferTo, + int numChannels, + int numSamples) noexcept; + + /** Creates a buffer using a pre-allocated block of memory. + + Note that if the buffer is resized or its number of channels is changed, it + will re-allocate memory internally and copy the existing data to this new area, + so it will then stop directly addressing this memory. + + @param dataToReferTo a pre-allocated array containing pointers to the data + for each channel that should be used by this buffer. The + buffer will only refer to this memory, it won't try to delete + it when the buffer is deleted or resized. + @param numChannels the number of channels to use - this must correspond to the + number of elements in the array passed in + @param startSample the offset within the arrays at which the data begins + @param numSamples the number of samples to use - this must correspond to the + size of the arrays passed in + */ + AudioSampleBuffer (float* const* dataToReferTo, + int numChannels, + int startSample, + int numSamples) noexcept; + + /** Copies another buffer. + + This buffer will make its own copy of the other's data, unless the buffer was created + using an external data buffer, in which case boths buffers will just point to the same + shared block of data. + */ + AudioSampleBuffer (const AudioSampleBuffer&) noexcept; + + /** Copies another buffer onto this one. + This buffer's size will be changed to that of the other buffer. + */ + AudioSampleBuffer& operator= (const AudioSampleBuffer&) noexcept; + + /** Destructor. + This will free any memory allocated by the buffer. + */ + ~AudioSampleBuffer() noexcept; + + //============================================================================== + /** Returns the number of channels of audio data that this buffer contains. + @see getSampleData + */ + int getNumChannels() const noexcept { return numChannels; } + + /** Returns the number of samples allocated in each of the buffer's channels. + @see getSampleData + */ + int getNumSamples() const noexcept { return size; } + + /** Returns a pointer to an array of read-only samples in one of the buffer's channels. + For speed, this doesn't check whether the channel number is out of range, + so be careful when using it! + If you need to write to the data, do NOT call this method and const_cast the + result! Instead, you must call getWritePointer so that the buffer knows you're + planning on modifying the data. + */ + const float* getReadPointer (int channelNumber) const noexcept + { + jassert (isPositiveAndBelow (channelNumber, numChannels)); + return channels [channelNumber]; + } + + /** Returns a pointer to an array of read-only samples in one of the buffer's channels. + For speed, this doesn't check whether the channel number or index are out of range, + so be careful when using it! + If you need to write to the data, do NOT call this method and const_cast the + result! Instead, you must call getWritePointer so that the buffer knows you're + planning on modifying the data. + */ + const float* getReadPointer (int channelNumber, int sampleIndex) const noexcept + { + jassert (isPositiveAndBelow (channelNumber, numChannels)); + jassert (isPositiveAndBelow (sampleIndex, size)); + return channels [channelNumber] + sampleIndex; + } + + /** Returns a writeable pointer to one of the buffer's channels. + For speed, this doesn't check whether the channel number is out of range, + so be careful when using it! + Note that if you're not planning on writing to the data, you should always + use getReadPointer instead. + */ + float* getWritePointer (int channelNumber) noexcept + { + jassert (isPositiveAndBelow (channelNumber, numChannels)); + isClear = false; + return channels [channelNumber]; + } + + /** Returns a writeable pointer to one of the buffer's channels. + For speed, this doesn't check whether the channel number or index are out of range, + so be careful when using it! + Note that if you're not planning on writing to the data, you should + use getReadPointer instead. + */ + float* getWritePointer (int channelNumber, int sampleIndex) noexcept + { + jassert (isPositiveAndBelow (channelNumber, numChannels)); + jassert (isPositiveAndBelow (sampleIndex, size)); + isClear = false; + return channels [channelNumber] + sampleIndex; + } + + /** Returns an array of pointers to the channels in the buffer. + + Don't modify any of the pointers that are returned, and bear in mind that + these will become invalid if the buffer is resized. + */ + const float** getArrayOfReadPointers() const noexcept { return const_cast (channels); } + + /** Returns an array of pointers to the channels in the buffer. + + Don't modify any of the pointers that are returned, and bear in mind that + these will become invalid if the buffer is resized. + */ + float** getArrayOfWritePointers() noexcept { isClear = false; return channels; } + + //============================================================================== + /** Changes the buffer's size or number of channels. + + This can expand or contract the buffer's length, and add or remove channels. + + If keepExistingContent is true, it will try to preserve as much of the + old data as it can in the new buffer. + + If clearExtraSpace is true, then any extra channels or space that is + allocated will be also be cleared. If false, then this space is left + uninitialised. + + If avoidReallocating is true, then changing the buffer's size won't reduce the + amount of memory that is currently allocated (but it will still increase it if + the new size is bigger than the amount it currently has). If this is false, then + a new allocation will be done so that the buffer uses takes up the minimum amount + of memory that it needs. + + If the required memory can't be allocated, this will throw a std::bad_alloc exception. + */ + void setSize (int newNumChannels, + int newNumSamples, + bool keepExistingContent = false, + bool clearExtraSpace = false, + bool avoidReallocating = false) noexcept; + + + /** Makes this buffer point to a pre-allocated set of channel data arrays. + + There's also a constructor that lets you specify arrays like this, but this + lets you change the channels dynamically. + + Note that if the buffer is resized or its number of channels is changed, it + will re-allocate memory internally and copy the existing data to this new area, + so it will then stop directly addressing this memory. + + @param dataToReferTo a pre-allocated array containing pointers to the data + for each channel that should be used by this buffer. The + buffer will only refer to this memory, it won't try to delete + it when the buffer is deleted or resized. + @param numChannels the number of channels to use - this must correspond to the + number of elements in the array passed in + @param numSamples the number of samples to use - this must correspond to the + size of the arrays passed in + */ + void setDataToReferTo (float** dataToReferTo, + int numChannels, + int numSamples) noexcept; + + //============================================================================== + /** Clears all the samples in all channels. */ + void clear() noexcept; + + /** Clears a specified region of all the channels. + + For speed, this doesn't check whether the channel and sample number + are in-range, so be careful! + */ + void clear (int startSample, + int numSamples) noexcept; + + /** Clears a specified region of just one channel. + + For speed, this doesn't check whether the channel and sample number + are in-range, so be careful! + */ + void clear (int channel, + int startSample, + int numSamples) noexcept; + + /** Returns true if the buffer has been entirely cleared. + Note that this does not actually measure the contents of the buffer - it simply + returns a flag that is set when the buffer is cleared, and which is reset whenever + functions like getWritePointer() are invoked. That means the method does not take + any time, but it may return false negatives when in fact the buffer is still empty. + */ + bool hasBeenCleared() const noexcept { return isClear; } + + //============================================================================== + /** Returns a sample from the buffer. + The channel and index are not checked - they are expected to be in-range. If not, + an assertion will be thrown, but in a release build, you're into 'undefined behaviour' + territory. + */ + float getSample (int channel, int sampleIndex) const noexcept; + + /** Sets a sample in the buffer. + The channel and index are not checked - they are expected to be in-range. If not, + an assertion will be thrown, but in a release build, you're into 'undefined behaviour' + territory. + */ + void setSample (int destChannel, int destSample, float newValue) noexcept; + + /** Adds a value to a sample in the buffer. + The channel and index are not checked - they are expected to be in-range. If not, + an assertion will be thrown, but in a release build, you're into 'undefined behaviour' + territory. + */ + void addSample (int destChannel, int destSample, float valueToAdd) noexcept; + + /** Applies a gain multiple to a region of one channel. + + For speed, this doesn't check whether the channel and sample number + are in-range, so be careful! + */ + void applyGain (int channel, + int startSample, + int numSamples, + float gain) noexcept; + + /** Applies a gain multiple to a region of all the channels. + + For speed, this doesn't check whether the sample numbers + are in-range, so be careful! + */ + void applyGain (int startSample, + int numSamples, + float gain) noexcept; + + /** Applies a gain multiple to all the audio data. */ + void applyGain (float gain) noexcept; + + /** Applies a range of gains to a region of a channel. + + The gain that is applied to each sample will vary from + startGain on the first sample to endGain on the last Sample, + so it can be used to do basic fades. + + For speed, this doesn't check whether the sample numbers + are in-range, so be careful! + */ + void applyGainRamp (int channel, + int startSample, + int numSamples, + float startGain, + float endGain) noexcept; + + /** Applies a range of gains to a region of all channels. + + The gain that is applied to each sample will vary from + startGain on the first sample to endGain on the last Sample, + so it can be used to do basic fades. + + For speed, this doesn't check whether the sample numbers + are in-range, so be careful! + */ + void applyGainRamp (int startSample, + int numSamples, + float startGain, + float endGain) noexcept; + + /** Adds samples from another buffer to this one. + + @param destChannel the channel within this buffer to add the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source buffer to add from + @param sourceChannel the channel within the source buffer to read from + @param sourceStartSample the offset within the source buffer's channel to start reading samples from + @param numSamples the number of samples to process + @param gainToApplyToSource an optional gain to apply to the source samples before they are + added to this buffer's samples + + @see copyFrom + */ + void addFrom (int destChannel, + int destStartSample, + const AudioSampleBuffer& source, + int sourceChannel, + int sourceStartSample, + int numSamples, + float gainToApplyToSource = 1.0f) noexcept; + + /** Adds samples from an array of floats to one of the channels. + + @param destChannel the channel within this buffer to add the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source data to use + @param numSamples the number of samples to process + @param gainToApplyToSource an optional gain to apply to the source samples before they are + added to this buffer's samples + + @see copyFrom + */ + void addFrom (int destChannel, + int destStartSample, + const float* source, + int numSamples, + float gainToApplyToSource = 1.0f) noexcept; + + /** Adds samples from an array of floats, applying a gain ramp to them. + + @param destChannel the channel within this buffer to add the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source data to use + @param numSamples the number of samples to process + @param startGain the gain to apply to the first sample (this is multiplied with + the source samples before they are added to this buffer) + @param endGain the gain to apply to the final sample. The gain is linearly + interpolated between the first and last samples. + */ + void addFromWithRamp (int destChannel, + int destStartSample, + const float* source, + int numSamples, + float startGain, + float endGain) noexcept; + + /** Copies samples from another buffer to this one. + + @param destChannel the channel within this buffer to copy the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source buffer to read from + @param sourceChannel the channel within the source buffer to read from + @param sourceStartSample the offset within the source buffer's channel to start reading samples from + @param numSamples the number of samples to process + + @see addFrom + */ + void copyFrom (int destChannel, + int destStartSample, + const AudioSampleBuffer& source, + int sourceChannel, + int sourceStartSample, + int numSamples) noexcept; + + /** Copies samples from an array of floats into one of the channels. + + @param destChannel the channel within this buffer to copy the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source buffer to read from + @param numSamples the number of samples to process + + @see addFrom + */ + void copyFrom (int destChannel, + int destStartSample, + const float* source, + int numSamples) noexcept; + + /** Copies samples from an array of floats into one of the channels, applying a gain to it. + + @param destChannel the channel within this buffer to copy the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source buffer to read from + @param numSamples the number of samples to process + @param gain the gain to apply + + @see addFrom + */ + void copyFrom (int destChannel, + int destStartSample, + const float* source, + int numSamples, + float gain) noexcept; + + /** Copies samples from an array of floats into one of the channels, applying a gain ramp. + + @param destChannel the channel within this buffer to copy the samples to + @param destStartSample the start sample within this buffer's channel + @param source the source buffer to read from + @param numSamples the number of samples to process + @param startGain the gain to apply to the first sample (this is multiplied with + the source samples before they are copied to this buffer) + @param endGain the gain to apply to the final sample. The gain is linearly + interpolated between the first and last samples. + + @see addFrom + */ + void copyFromWithRamp (int destChannel, + int destStartSample, + const float* source, + int numSamples, + float startGain, + float endGain) noexcept; + + + /** Returns a Range indicating the lowest and highest sample values in a given section. + + @param channel the channel to read from + @param startSample the start sample within the channel + @param numSamples the number of samples to check + */ + Range findMinMax (int channel, + int startSample, + int numSamples) const noexcept; + + /** Finds the highest absolute sample value within a region of a channel. */ + float getMagnitude (int channel, + int startSample, + int numSamples) const noexcept; + + /** Finds the highest absolute sample value within a region on all channels. */ + float getMagnitude (int startSample, + int numSamples) const noexcept; + + /** Returns the root mean squared level for a region of a channel. */ + float getRMSLevel (int channel, + int startSample, + int numSamples) const noexcept; + + /** Reverses a part of a channel. */ + void reverse (int channel, int startSample, int numSamples) const noexcept; + + /** Reverses a part of the buffer. */ + void reverse (int startSample, int numSamples) const noexcept; + + //============================================================================== + #ifndef DOXYGEN + // Note that these methods have now been replaced by getReadPointer() and getWritePointer() + JUCE_DEPRECATED_WITH_BODY (const float* getSampleData (int channel) const, { return getReadPointer (channel); }) + JUCE_DEPRECATED_WITH_BODY (const float* getSampleData (int channel, int index) const, { return getReadPointer (channel, index); }) + JUCE_DEPRECATED_WITH_BODY (float* getSampleData (int channel), { return getWritePointer (channel); }) + JUCE_DEPRECATED_WITH_BODY (float* getSampleData (int channel, int index), { return getWritePointer (channel, index); }) + + // These have been replaced by getArrayOfReadPointers() and getArrayOfWritePointers() + JUCE_DEPRECATED_WITH_BODY (const float** getArrayOfChannels() const, { return getArrayOfReadPointers(); }) + JUCE_DEPRECATED_WITH_BODY (float** getArrayOfChannels(), { return getArrayOfWritePointers(); }) + #endif + +private: + //============================================================================== + int numChannels, size; + size_t allocatedBytes; + float** channels; + HeapBlock allocatedData; + float* preallocatedChannelSpace [32]; + bool isClear; + + void allocateData(); + void allocateChannels (float* const*, int offset); + + JUCE_LEAK_DETECTOR (AudioSampleBuffer) +}; + + +#endif // JUCE_AUDIOSAMPLEBUFFER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp new file mode 100644 index 0000000000..2fc6898cba --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp @@ -0,0 +1,893 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace FloatVectorHelpers +{ + #define JUCE_INCREMENT_SRC_DEST dest += (16 / sizeof (*dest)); src += (16 / sizeof (*dest)); + #define JUCE_INCREMENT_SRC1_SRC2_DEST dest += (16 / sizeof (*dest)); src1 += (16 / sizeof (*dest)); src2 += (16 / sizeof (*dest)); + #define JUCE_INCREMENT_DEST dest += (16 / sizeof (*dest)); + + #if JUCE_USE_SSE_INTRINSICS + static bool sse2Present = false; + + static bool isSSE2Available() noexcept + { + if (sse2Present) + return true; + + sse2Present = SystemStats::hasSSE2(); + return sse2Present; + } + + inline static bool isAligned (const void* p) noexcept + { + return (((pointer_sized_int) p) & 15) == 0; + } + + struct BasicOps32 + { + typedef float Type; + typedef __m128 ParallelType; + enum { numParallel = 4 }; + + static forcedinline ParallelType load1 (Type v) noexcept { return _mm_load1_ps (&v); } + static forcedinline ParallelType loadA (const Type* v) noexcept { return _mm_load_ps (v); } + static forcedinline ParallelType loadU (const Type* v) noexcept { return _mm_loadu_ps (v); } + static forcedinline void storeA (Type* dest, ParallelType a) noexcept { _mm_store_ps (dest, a); } + static forcedinline void storeU (Type* dest, ParallelType a) noexcept { _mm_storeu_ps (dest, a); } + + static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return _mm_add_ps (a, b); } + static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return _mm_sub_ps (a, b); } + static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return _mm_mul_ps (a, b); } + static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return _mm_max_ps (a, b); } + static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return _mm_min_ps (a, b); } + + static forcedinline Type max (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmax (v[0], v[1], v[2], v[3]); } + static forcedinline Type min (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmin (v[0], v[1], v[2], v[3]); } + }; + + struct BasicOps64 + { + typedef double Type; + typedef __m128d ParallelType; + enum { numParallel = 2 }; + + static forcedinline ParallelType load1 (Type v) noexcept { return _mm_load1_pd (&v); } + static forcedinline ParallelType loadA (const Type* v) noexcept { return _mm_load_pd (v); } + static forcedinline ParallelType loadU (const Type* v) noexcept { return _mm_loadu_pd (v); } + static forcedinline void storeA (Type* dest, ParallelType a) noexcept { _mm_store_pd (dest, a); } + static forcedinline void storeU (Type* dest, ParallelType a) noexcept { _mm_storeu_pd (dest, a); } + + static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return _mm_add_pd (a, b); } + static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return _mm_sub_pd (a, b); } + static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return _mm_mul_pd (a, b); } + static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return _mm_max_pd (a, b); } + static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return _mm_min_pd (a, b); } + + static forcedinline Type max (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmax (v[0], v[1]); } + static forcedinline Type min (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmin (v[0], v[1]); } + }; + + #define JUCE_BEGIN_VEC_OP \ + typedef FloatVectorHelpers::ModeType::Mode Mode; \ + if (FloatVectorHelpers::isSSE2Available()) \ + { \ + const int numLongOps = num / Mode::numParallel; + + #define JUCE_FINISH_VEC_OP(normalOp) \ + num &= (Mode::numParallel - 1); \ + if (num == 0) return; \ + } \ + for (int i = 0; i < num; ++i) normalOp; + + #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + if (FloatVectorHelpers::isAligned (dest)) JUCE_VEC_LOOP (vecOp, dummy, Mode::loadA, Mode::storeA, locals, JUCE_INCREMENT_DEST) \ + else JUCE_VEC_LOOP (vecOp, dummy, Mode::loadU, Mode::storeU, locals, JUCE_INCREMENT_DEST) \ + JUCE_FINISH_VEC_OP (normalOp) + + #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + if (FloatVectorHelpers::isAligned (dest)) \ + { \ + if (FloatVectorHelpers::isAligned (src)) JUCE_VEC_LOOP (vecOp, Mode::loadA, Mode::loadA, Mode::storeA, locals, increment) \ + else JUCE_VEC_LOOP (vecOp, Mode::loadU, Mode::loadA, Mode::storeA, locals, increment) \ + }\ + else \ + { \ + if (FloatVectorHelpers::isAligned (src)) JUCE_VEC_LOOP (vecOp, Mode::loadA, Mode::loadU, Mode::storeU, locals, increment) \ + else JUCE_VEC_LOOP (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + } \ + JUCE_FINISH_VEC_OP (normalOp) + + #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + { \ + Mode::ParallelType (&loadSrc1) (const Mode::Type* v) = FloatVectorHelpers::isAligned (src1) ? Mode::loadA : Mode::loadU; \ + Mode::ParallelType (&loadSrc2) (const Mode::Type* v) = FloatVectorHelpers::isAligned (src2) ? Mode::loadA : Mode::loadU; \ + void (&storeDst) (Mode::Type* dest, Mode::ParallelType a) = FloatVectorHelpers::isAligned (dest) ? Mode::storeA : Mode::storeU; \ + JUCE_VEC_LOOP_TWO_SOURCES (vecOp, loadSrc1, loadSrc2, storeDst, locals, increment); \ + } \ + JUCE_FINISH_VEC_OP (normalOp) + + //============================================================================== + #elif JUCE_USE_ARM_NEON + + struct BasicOps32 + { + typedef float Type; + typedef float32x4_t ParallelType; + enum { numParallel = 4 }; + + static forcedinline ParallelType load1 (Type v) noexcept { return vld1q_dup_f32 (&v); } + static forcedinline ParallelType loadA (const Type* v) noexcept { return vld1q_f32 (v); } + static forcedinline ParallelType loadU (const Type* v) noexcept { return vld1q_f32 (v); } + static forcedinline void storeA (Type* dest, ParallelType a) noexcept { vst1q_f32 (dest, a); } + static forcedinline void storeU (Type* dest, ParallelType a) noexcept { vst1q_f32 (dest, a); } + + static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return vaddq_f32 (a, b); } + static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return vsubq_f32 (a, b); } + static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return vmulq_f32 (a, b); } + static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return vmaxq_f32 (a, b); } + static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return vminq_f32 (a, b); } + + static forcedinline Type max (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmax (v[0], v[1], v[2], v[3]); } + static forcedinline Type min (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmin (v[0], v[1], v[2], v[3]); } + }; + + struct BasicOps64 + { + typedef double Type; + typedef double ParallelType; + enum { numParallel = 1 }; + + static forcedinline ParallelType load1 (Type v) noexcept { return v; } + static forcedinline ParallelType loadA (const Type* v) noexcept { return *v; } + static forcedinline ParallelType loadU (const Type* v) noexcept { return *v; } + static forcedinline void storeA (Type* dest, ParallelType a) noexcept { *dest = a; } + static forcedinline void storeU (Type* dest, ParallelType a) noexcept { *dest = a; } + + static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return a + b; } + static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return a - b; } + static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return a * b; } + static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return jmax (a, b); } + static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return jmin (a, b); } + + static forcedinline Type max (ParallelType a) noexcept { return a; } + static forcedinline Type min (ParallelType a) noexcept { return a; } + }; + + #define JUCE_BEGIN_VEC_OP \ + typedef FloatVectorHelpers::ModeType::Mode Mode; \ + if (Mode::numParallel > 1) \ + { \ + const int numLongOps = num / Mode::numParallel; + + #define JUCE_FINISH_VEC_OP(normalOp) \ + num &= (Mode::numParallel - 1); \ + if (num == 0) return; \ + } \ + for (int i = 0; i < num; ++i) normalOp; + + #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + JUCE_VEC_LOOP (vecOp, dummy, Mode::loadU, Mode::storeU, locals, JUCE_INCREMENT_DEST) \ + JUCE_FINISH_VEC_OP (normalOp) + + #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + JUCE_VEC_LOOP (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + JUCE_FINISH_VEC_OP (normalOp) + + #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + JUCE_FINISH_VEC_OP (normalOp) + + //============================================================================== + #else + #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ + for (int i = 0; i < num; ++i) normalOp; + + #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \ + for (int i = 0; i < num; ++i) normalOp; + + #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ + for (int i = 0; i < num; ++i) normalOp; + #endif + + //============================================================================== + #define JUCE_VEC_LOOP(vecOp, srcLoad, dstLoad, dstStore, locals, increment) \ + for (int i = 0; i < numLongOps; ++i) \ + { \ + locals (srcLoad, dstLoad); \ + dstStore (dest, vecOp); \ + increment; \ + } + + #define JUCE_VEC_LOOP_TWO_SOURCES(vecOp, src1Load, src2Load, dstStore, locals, increment) \ + for (int i = 0; i < numLongOps; ++i) \ + { \ + locals (src1Load, src2Load); \ + dstStore (dest, vecOp); \ + increment; \ + } + + #define JUCE_LOAD_NONE(srcLoad, dstLoad) + #define JUCE_LOAD_DEST(srcLoad, dstLoad) const Mode::ParallelType d = dstLoad (dest); + #define JUCE_LOAD_SRC(srcLoad, dstLoad) const Mode::ParallelType s = srcLoad (src); + #define JUCE_LOAD_SRC1_SRC2(src1Load, src2Load) const Mode::ParallelType s1 = src1Load (src1), s2 = src2Load (src2); + #define JUCE_LOAD_SRC_DEST(srcLoad, dstLoad) const Mode::ParallelType d = dstLoad (dest), s = srcLoad (src); + + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + template struct ModeType { typedef BasicOps32 Mode; }; + template<> struct ModeType<8> { typedef BasicOps64 Mode; }; + + template + struct MinMax + { + typedef typename Mode::Type Type; + typedef typename Mode::ParallelType ParallelType; + + static Type findMinOrMax (const Type* src, int num, const bool isMinimum) noexcept + { + int numLongOps = num / Mode::numParallel; + + #if JUCE_USE_SSE_INTRINSICS + if (numLongOps > 1 && isSSE2Available()) + #else + if (numLongOps > 1) + #endif + { + ParallelType val; + + #if ! JUCE_USE_ARM_NEON + if (isAligned (src)) + { + val = Mode::loadA (src); + + if (isMinimum) + { + while (--numLongOps > 0) + { + src += Mode::numParallel; + val = Mode::min (val, Mode::loadA (src)); + } + } + else + { + while (--numLongOps > 0) + { + src += Mode::numParallel; + val = Mode::max (val, Mode::loadA (src)); + } + } + } + else + #endif + { + val = Mode::loadU (src); + + if (isMinimum) + { + while (--numLongOps > 0) + { + src += Mode::numParallel; + val = Mode::min (val, Mode::loadU (src)); + } + } + else + { + while (--numLongOps > 0) + { + src += Mode::numParallel; + val = Mode::max (val, Mode::loadU (src)); + } + } + } + + Type result = isMinimum ? Mode::min (val) + : Mode::max (val); + + num &= (Mode::numParallel - 1); + src += Mode::numParallel; + + for (int i = 0; i < num; ++i) + result = isMinimum ? jmin (result, src[i]) + : jmax (result, src[i]); + + return result; + } + + return isMinimum ? juce::findMinimum (src, num) + : juce::findMaximum (src, num); + } + + static Range findMinAndMax (const Type* src, int num) noexcept + { + int numLongOps = num / Mode::numParallel; + + #if JUCE_USE_SSE_INTRINSICS + if (numLongOps > 1 && isSSE2Available()) + #else + if (numLongOps > 1) + #endif + { + ParallelType mn, mx; + + #if ! JUCE_USE_ARM_NEON + if (isAligned (src)) + { + mn = Mode::loadA (src); + mx = mn; + + while (--numLongOps > 0) + { + src += Mode::numParallel; + const ParallelType v = Mode::loadA (src); + mn = Mode::min (mn, v); + mx = Mode::max (mx, v); + } + } + else + #endif + { + mn = Mode::loadU (src); + mx = mn; + + while (--numLongOps > 0) + { + src += Mode::numParallel; + const ParallelType v = Mode::loadU (src); + mn = Mode::min (mn, v); + mx = Mode::max (mx, v); + } + } + + Range result (Mode::min (mn), + Mode::max (mx)); + + num &= (Mode::numParallel - 1); + src += Mode::numParallel; + + for (int i = 0; i < num; ++i) + result = result.getUnionWith (src[i]); + + return result; + } + + return Range::findMinAndMax (src, num); + } + }; + #endif +} + +//============================================================================== +void JUCE_CALLTYPE FloatVectorOperations::clear (float* dest, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vclr (dest, 1, (size_t) num); + #else + zeromem (dest, num * sizeof (float)); + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::clear (double* dest, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vclrD (dest, 1, (size_t) num); + #else + zeromem (dest, num * sizeof (double)); + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::fill (float* dest, float valueToFill, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vfill (&valueToFill, dest, 1, (size_t) num); + #else + JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE, + const Mode::ParallelType val = Mode::load1 (valueToFill);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::fill (double* dest, double valueToFill, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vfillD (&valueToFill, dest, 1, (size_t) num); + #else + JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE, + const Mode::ParallelType val = Mode::load1 (valueToFill);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::copy (float* dest, const float* src, int num) noexcept +{ + memcpy (dest, src, (size_t) num * sizeof (float)); +} + +void JUCE_CALLTYPE FloatVectorOperations::copy (double* dest, const double* src, int num) noexcept +{ + memcpy (dest, src, (size_t) num * sizeof (double)); +} + +void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsmul (src, 1, &multiplier, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsmulD (src, 1, &multiplier, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float amount, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST, + const Mode::ParallelType amountToAdd = Mode::load1 (amount);) +} + +void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double amount, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST, + const Mode::ParallelType amountToAdd = Mode::load1 (amount);) +} + +void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float* src, float amount, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsadd (src, 1, &amount, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType am = Mode::load1 (amount);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double* src, double amount, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsaddD (src, 1, &amount, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType am = Mode::load1 (amount);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vadd (src, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vaddD (src, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src1, const float* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vadd (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src1, const double* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vaddD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsub (src, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsubD (src, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src1, const float* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsub (src2, 1, src1, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src1, const double* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsubD (src2, 1, src1, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)), + JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) +} + +void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)), + JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmul (src, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmulD (src, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src1, const float* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmul (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src1, const double* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmulD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, float multiplier, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsmul (dest, 1, &multiplier, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, double multiplier, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsmulD (dest, 1, &multiplier, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, float multiplier, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) +} + +void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, double multiplier, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) +} + +void FloatVectorOperations::negate (float* dest, const float* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vneg ((float*) src, 1, dest, 1, (vDSP_Length) num); + #else + copyWithMultiply (dest, src, -1.0f, num); + #endif +} + +void FloatVectorOperations::negate (double* dest, const double* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vnegD ((double*) src, 1, dest, 1, (vDSP_Length) num); + #else + copyWithMultiply (dest, src, -1.0f, num); + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept +{ + #if JUCE_USE_ARM_NEON + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, + vmulq_n_f32 (vcvtq_f32_s32 (vld1q_s32 (src)), multiplier), + JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST, ) + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, + Mode::mul (mult, _mm_cvtepi32_ps (_mm_loadu_si128 ((const __m128i*) src))), + JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mult = Mode::load1 (multiplier);) + #endif +} + +Range JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const float* src, int num) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + return FloatVectorHelpers::MinMax::findMinAndMax (src, num); + #else + return Range::findMinAndMax (src, num); + #endif +} + +Range JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const double* src, int num) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + return FloatVectorHelpers::MinMax::findMinAndMax (src, num); + #else + return Range::findMinAndMax (src, num); + #endif +} + +float JUCE_CALLTYPE FloatVectorOperations::findMinimum (const float* src, int num) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + return FloatVectorHelpers::MinMax::findMinOrMax (src, num, true); + #else + return juce::findMinimum (src, num); + #endif +} + +double JUCE_CALLTYPE FloatVectorOperations::findMinimum (const double* src, int num) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + return FloatVectorHelpers::MinMax::findMinOrMax (src, num, true); + #else + return juce::findMinimum (src, num); + #endif +} + +float JUCE_CALLTYPE FloatVectorOperations::findMaximum (const float* src, int num) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + return FloatVectorHelpers::MinMax::findMinOrMax (src, num, false); + #else + return juce::findMaximum (src, num); + #endif +} + +double JUCE_CALLTYPE FloatVectorOperations::findMaximum (const double* src, int num) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON + return FloatVectorHelpers::MinMax::findMinOrMax (src, num, false); + #else + return juce::findMaximum (src, num); + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnable) noexcept +{ + #if JUCE_USE_SSE_INTRINSICS + if (FloatVectorHelpers::isSSE2Available()) + _MM_SET_FLUSH_ZERO_MODE (shouldEnable ? _MM_FLUSH_ZERO_ON : _MM_FLUSH_ZERO_OFF); + #endif + (void) shouldEnable; +} + +//============================================================================== +//============================================================================== +#if JUCE_UNIT_TESTS + +class FloatVectorOperationsTests : public UnitTest +{ +public: + FloatVectorOperationsTests() : UnitTest ("FloatVectorOperations") {} + + template + struct TestRunner + { + static void runTest (UnitTest& u, Random random) + { + const int range = random.nextBool() ? 500 : 10; + const int num = random.nextInt (range) + 1; + + HeapBlock buffer1 ((size_t) num + 16), buffer2 ((size_t) num + 16); + HeapBlock buffer3 ((size_t) num + 16); + + #if JUCE_ARM + ValueType* const data1 = buffer1; + ValueType* const data2 = buffer2; + int* const int1 = buffer3; + #else + ValueType* const data1 = addBytesToPointer (buffer1.getData(), random.nextInt (16)); + ValueType* const data2 = addBytesToPointer (buffer2.getData(), random.nextInt (16)); + int* const int1 = addBytesToPointer (buffer3.getData(), random.nextInt (16)); + #endif + + fillRandomly (random, data1, num); + fillRandomly (random, data2, num); + + Range minMax1 (FloatVectorOperations::findMinAndMax (data1, num)); + Range minMax2 (Range::findMinAndMax (data1, num)); + u.expect (minMax1 == minMax2); + + u.expect (valuesMatch (FloatVectorOperations::findMinimum (data1, num), juce::findMinimum (data1, num))); + u.expect (valuesMatch (FloatVectorOperations::findMaximum (data1, num), juce::findMaximum (data1, num))); + + u.expect (valuesMatch (FloatVectorOperations::findMinimum (data2, num), juce::findMinimum (data2, num))); + u.expect (valuesMatch (FloatVectorOperations::findMaximum (data2, num), juce::findMaximum (data2, num))); + + FloatVectorOperations::clear (data1, num); + u.expect (areAllValuesEqual (data1, num, 0)); + + FloatVectorOperations::fill (data1, (ValueType) 2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 2)); + + FloatVectorOperations::add (data1, (ValueType) 2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 4)); + + FloatVectorOperations::copy (data2, data1, num); + u.expect (areAllValuesEqual (data2, num, (ValueType) 4)); + + FloatVectorOperations::add (data2, data1, num); + u.expect (areAllValuesEqual (data2, num, (ValueType) 8)); + + FloatVectorOperations::copyWithMultiply (data2, data1, (ValueType) 4, num); + u.expect (areAllValuesEqual (data2, num, (ValueType) 16)); + + FloatVectorOperations::addWithMultiply (data2, data1, (ValueType) 4, num); + u.expect (areAllValuesEqual (data2, num, (ValueType) 32)); + + FloatVectorOperations::multiply (data1, (ValueType) 2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 8)); + + FloatVectorOperations::multiply (data1, data2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 256)); + + FloatVectorOperations::negate (data2, data1, num); + u.expect (areAllValuesEqual (data2, num, (ValueType) -256)); + + FloatVectorOperations::subtract (data1, data2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 512)); + + fillRandomly (random, int1, num); + doConversionTest (u, data1, data2, int1, num); + } + + static void doConversionTest (UnitTest& u, float* data1, float* data2, int* const int1, int num) + { + FloatVectorOperations::convertFixedToFloat (data1, int1, 2.0f, num); + convertFixed (data2, int1, 2.0f, num); + u.expect (buffersMatch (data1, data2, num)); + } + + static void doConversionTest (UnitTest&, double*, double*, int*, int) {} + + static void fillRandomly (Random& random, ValueType* d, int num) + { + while (--num >= 0) + *d++ = (ValueType) (random.nextDouble() * 1000.0); + } + + static void fillRandomly (Random& random, int* d, int num) + { + while (--num >= 0) + *d++ = random.nextInt(); + } + + static void convertFixed (float* d, const int* s, ValueType multiplier, int num) + { + while (--num >= 0) + *d++ = *s++ * multiplier; + } + + static bool areAllValuesEqual (const ValueType* d, int num, ValueType target) + { + while (--num >= 0) + if (*d++ != target) + return false; + + return true; + } + + static bool buffersMatch (const ValueType* d1, const ValueType* d2, int num) + { + while (--num >= 0) + if (! valuesMatch (*d1++, *d2++)) + return false; + + return true; + } + + static bool valuesMatch (ValueType v1, ValueType v2) + { + return std::abs (v1 - v2) < std::numeric_limits::epsilon(); + } + }; + + void runTest() + { + beginTest ("FloatVectorOperations"); + + for (int i = 1000; --i >= 0;) + { + TestRunner::runTest (*this, getRandom()); + TestRunner::runTest (*this, getRandom()); + } + } +}; + +static FloatVectorOperationsTests vectorOpTests; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h new file mode 100644 index 0000000000..0b3fcb67c5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h @@ -0,0 +1,162 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_FLOATVECTOROPERATIONS_H_INCLUDED +#define JUCE_FLOATVECTOROPERATIONS_H_INCLUDED + + +//============================================================================== +/** + A collection of simple vector operations on arrays of floats, accelerated with + SIMD instructions where possible. +*/ +class JUCE_API FloatVectorOperations +{ +public: + //============================================================================== + /** Clears a vector of floats. */ + static void JUCE_CALLTYPE clear (float* dest, int numValues) noexcept; + + /** Clears a vector of doubles. */ + static void JUCE_CALLTYPE clear (double* dest, int numValues) noexcept; + + /** Copies a repeated value into a vector of floats. */ + static void JUCE_CALLTYPE fill (float* dest, float valueToFill, int numValues) noexcept; + + /** Copies a repeated value into a vector of doubles. */ + static void JUCE_CALLTYPE fill (double* dest, double valueToFill, int numValues) noexcept; + + /** Copies a vector of floats. */ + static void JUCE_CALLTYPE copy (float* dest, const float* src, int numValues) noexcept; + + /** Copies a vector of doubles. */ + static void JUCE_CALLTYPE copy (double* dest, const double* src, int numValues) noexcept; + + /** Copies a vector of floats, multiplying each value by a given multiplier */ + static void JUCE_CALLTYPE copyWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept; + + /** Copies a vector of doubles, multiplying each value by a given multiplier */ + static void JUCE_CALLTYPE copyWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept; + + /** Adds a fixed value to the destination values. */ + static void JUCE_CALLTYPE add (float* dest, float amountToAdd, int numValues) noexcept; + + /** Adds a fixed value to the destination values. */ + static void JUCE_CALLTYPE add (double* dest, double amountToAdd, int numValues) noexcept; + + /** Adds a fixed value to each source value and stores it in the destination array. */ + static void JUCE_CALLTYPE add (float* dest, float* src, float amount, int numValues) noexcept; + + /** Adds a fixed value to each source value and stores it in the destination array. */ + static void JUCE_CALLTYPE add (double* dest, double* src, double amount, int numValues) noexcept; + + /** Adds the source values to the destination values. */ + static void JUCE_CALLTYPE add (float* dest, const float* src, int numValues) noexcept; + + /** Adds the source values to the destination values. */ + static void JUCE_CALLTYPE add (double* dest, const double* src, int numValues) noexcept; + + /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */ + static void JUCE_CALLTYPE add (float* dest, const float* src1, const float* src2, int num) noexcept; + + /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */ + static void JUCE_CALLTYPE add (double* dest, const double* src1, const double* src2, int num) noexcept; + + /** Subtracts the source values from the destination values. */ + static void JUCE_CALLTYPE subtract (float* dest, const float* src, int numValues) noexcept; + + /** Subtracts the source values from the destination values. */ + static void JUCE_CALLTYPE subtract (double* dest, const double* src, int numValues) noexcept; + + /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */ + static void JUCE_CALLTYPE subtract (float* dest, const float* src1, const float* src2, int num) noexcept; + + /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */ + static void JUCE_CALLTYPE subtract (double* dest, const double* src1, const double* src2, int num) noexcept; + + /** Multiplies each source value by the given multiplier, then adds it to the destination value. */ + static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept; + + /** Multiplies each source value by the given multiplier, then adds it to the destination value. */ + static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept; + + /** Multiplies the destination values by the source values. */ + static void JUCE_CALLTYPE multiply (float* dest, const float* src, int numValues) noexcept; + + /** Multiplies the destination values by the source values. */ + static void JUCE_CALLTYPE multiply (double* dest, const double* src, int numValues) noexcept; + + /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */ + static void JUCE_CALLTYPE multiply (float* dest, const float* src1, const float* src2, int numValues) noexcept; + + /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */ + static void JUCE_CALLTYPE multiply (double* dest, const double* src1, const double* src2, int numValues) noexcept; + + /** Multiplies each of the destination values by a fixed multiplier. */ + static void JUCE_CALLTYPE multiply (float* dest, float multiplier, int numValues) noexcept; + + /** Multiplies each of the destination values by a fixed multiplier. */ + static void JUCE_CALLTYPE multiply (double* dest, double multiplier, int numValues) noexcept; + + /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */ + static void JUCE_CALLTYPE multiply (float* dest, const float* src, float multiplier, int num) noexcept; + + /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */ + static void JUCE_CALLTYPE multiply (double* dest, const double* src, double multiplier, int num) noexcept; + + /** Copies a source vector to a destination, negating each value. */ + static void JUCE_CALLTYPE negate (float* dest, const float* src, int numValues) noexcept; + + /** Copies a source vector to a destination, negating each value. */ + static void JUCE_CALLTYPE negate (double* dest, const double* src, int numValues) noexcept; + + /** Converts a stream of integers to floats, multiplying each one by the given multiplier. */ + static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int numValues) noexcept; + + /** Finds the miniumum and maximum values in the given array. */ + static Range JUCE_CALLTYPE findMinAndMax (const float* src, int numValues) noexcept; + + /** Finds the miniumum and maximum values in the given array. */ + static Range JUCE_CALLTYPE findMinAndMax (const double* src, int numValues) noexcept; + + /** Finds the miniumum value in the given array. */ + static float JUCE_CALLTYPE findMinimum (const float* src, int numValues) noexcept; + + /** Finds the miniumum value in the given array. */ + static double JUCE_CALLTYPE findMinimum (const double* src, int numValues) noexcept; + + /** Finds the maximum value in the given array. */ + static float JUCE_CALLTYPE findMaximum (const float* src, int numValues) noexcept; + + /** Finds the maximum value in the given array. */ + static double JUCE_CALLTYPE findMaximum (const double* src, int numValues) noexcept; + + /** On Intel CPUs, this method enables or disables the SSE flush-to-zero mode. + Effectively, this is a wrapper around a call to _MM_SET_FLUSH_ZERO_MODE + */ + static void JUCE_CALLTYPE enableFlushToZeroMode (bool shouldEnable) noexcept; +}; + + +#endif // JUCE_FLOATVECTOROPERATIONS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h new file mode 100644 index 0000000000..c63746ce06 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h @@ -0,0 +1,104 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_DECIBELS_H_INCLUDED +#define JUCE_DECIBELS_H_INCLUDED + + +//============================================================================== +/** + This class contains some helpful static methods for dealing with decibel values. +*/ +class Decibels +{ +public: + //============================================================================== + /** Converts a dBFS value to its equivalent gain level. + + A gain of 1.0 = 0 dB, and lower gains map onto negative decibel values. Any + decibel value lower than minusInfinityDb will return a gain of 0. + */ + template + static Type decibelsToGain (const Type decibels, + const Type minusInfinityDb = (Type) defaultMinusInfinitydB) + { + return decibels > minusInfinityDb ? std::pow ((Type) 10.0, decibels * (Type) 0.05) + : Type(); + } + + /** Converts a gain level into a dBFS value. + + A gain of 1.0 = 0 dB, and lower gains map onto negative decibel values. + If the gain is 0 (or negative), then the method will return the value + provided as minusInfinityDb. + */ + template + static Type gainToDecibels (const Type gain, + const Type minusInfinityDb = (Type) defaultMinusInfinitydB) + { + return gain > Type() ? jmax (minusInfinityDb, (Type) std::log10 (gain) * (Type) 20.0) + : minusInfinityDb; + } + + //============================================================================== + /** Converts a decibel reading to a string, with the 'dB' suffix. + If the decibel value is lower than minusInfinityDb, the return value will + be "-INF dB". + */ + template + static String toString (const Type decibels, + const int decimalPlaces = 2, + const Type minusInfinityDb = (Type) defaultMinusInfinitydB) + { + String s; + + if (decibels <= minusInfinityDb) + { + s = "-INF dB"; + } + else + { + if (decibels >= Type()) + s << '+'; + + s << String (decibels, decimalPlaces) << " dB"; + } + + return s; + } + + +private: + //============================================================================== + enum + { + defaultMinusInfinitydB = -100 + }; + + Decibels(); // This class can't be instantiated, it's just a holder for static methods.. + JUCE_DECLARE_NON_COPYABLE (Decibels) +}; + + +#endif // JUCE_DECIBELS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp new file mode 100644 index 0000000000..908a69e0f0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp @@ -0,0 +1,244 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_INTEL + #define JUCE_SNAP_TO_ZERO(n) if (! (n < -1.0e-8 || n > 1.0e-8)) n = 0; +#else + #define JUCE_SNAP_TO_ZERO(n) +#endif + +//============================================================================== +IIRCoefficients::IIRCoefficients() noexcept +{ + zeromem (coefficients, sizeof (coefficients)); +} + +IIRCoefficients::~IIRCoefficients() noexcept {} + +IIRCoefficients::IIRCoefficients (const IIRCoefficients& other) noexcept +{ + memcpy (coefficients, other.coefficients, sizeof (coefficients)); +} + +IIRCoefficients& IIRCoefficients::operator= (const IIRCoefficients& other) noexcept +{ + memcpy (coefficients, other.coefficients, sizeof (coefficients)); + return *this; +} + +IIRCoefficients::IIRCoefficients (double c1, double c2, double c3, + double c4, double c5, double c6) noexcept +{ + const double a = 1.0 / c4; + + coefficients[0] = (float) (c1 * a); + coefficients[1] = (float) (c2 * a); + coefficients[2] = (float) (c3 * a); + coefficients[3] = (float) (c5 * a); + coefficients[4] = (float) (c6 * a); +} + +IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, + const double frequency) noexcept +{ + jassert (sampleRate > 0); + + const double n = 1.0 / tan (double_Pi * frequency / sampleRate); + const double nSquared = n * n; + const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); + + return IIRCoefficients (c1, + c1 * 2.0, + c1, + 1.0, + c1 * 2.0 * (1.0 - nSquared), + c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); +} + +IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, + const double frequency) noexcept +{ + const double n = tan (double_Pi * frequency / sampleRate); + const double nSquared = n * n; + const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); + + return IIRCoefficients (c1, + c1 * -2.0, + c1, + 1.0, + c1 * 2.0 * (nSquared - 1.0), + c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); +} + +IIRCoefficients IIRCoefficients::makeLowShelf (const double sampleRate, + const double cutOffFrequency, + const double Q, + const float gainFactor) noexcept +{ + jassert (sampleRate > 0); + jassert (Q > 0); + + const double A = jmax (0.0f, std::sqrt (gainFactor)); + const double aminus1 = A - 1.0; + const double aplus1 = A + 1.0; + const double omega = (double_Pi * 2.0 * jmax (cutOffFrequency, 2.0)) / sampleRate; + const double coso = std::cos (omega); + const double beta = std::sin (omega) * std::sqrt (A) / Q; + const double aminus1TimesCoso = aminus1 * coso; + + return IIRCoefficients (A * (aplus1 - aminus1TimesCoso + beta), + A * 2.0 * (aminus1 - aplus1 * coso), + A * (aplus1 - aminus1TimesCoso - beta), + aplus1 + aminus1TimesCoso + beta, + -2.0 * (aminus1 + aplus1 * coso), + aplus1 + aminus1TimesCoso - beta); +} + +IIRCoefficients IIRCoefficients::makeHighShelf (const double sampleRate, + const double cutOffFrequency, + const double Q, + const float gainFactor) noexcept +{ + jassert (sampleRate > 0); + jassert (Q > 0); + + const double A = jmax (0.0f, std::sqrt (gainFactor)); + const double aminus1 = A - 1.0; + const double aplus1 = A + 1.0; + const double omega = (double_Pi * 2.0 * jmax (cutOffFrequency, 2.0)) / sampleRate; + const double coso = std::cos (omega); + const double beta = std::sin (omega) * std::sqrt (A) / Q; + const double aminus1TimesCoso = aminus1 * coso; + + return IIRCoefficients (A * (aplus1 + aminus1TimesCoso + beta), + A * -2.0 * (aminus1 + aplus1 * coso), + A * (aplus1 + aminus1TimesCoso - beta), + aplus1 - aminus1TimesCoso + beta, + 2.0 * (aminus1 - aplus1 * coso), + aplus1 - aminus1TimesCoso - beta); +} + +IIRCoefficients IIRCoefficients::makePeakFilter (const double sampleRate, + const double centreFrequency, + const double Q, + const float gainFactor) noexcept +{ + jassert (sampleRate > 0); + jassert (Q > 0); + + const double A = jmax (0.0f, std::sqrt (gainFactor)); + const double omega = (double_Pi * 2.0 * jmax (centreFrequency, 2.0)) / sampleRate; + const double alpha = 0.5 * std::sin (omega) / Q; + const double c2 = -2.0 * std::cos (omega); + const double alphaTimesA = alpha * A; + const double alphaOverA = alpha / A; + + return IIRCoefficients (1.0 + alphaTimesA, + c2, + 1.0 - alphaTimesA, + 1.0 + alphaOverA, + c2, + 1.0 - alphaOverA); +} + +//============================================================================== +IIRFilter::IIRFilter() noexcept + : v1 (0), v2 (0), active (false) +{ +} + +IIRFilter::IIRFilter (const IIRFilter& other) noexcept + : v1 (0), v2 (0), active (other.active) +{ + const SpinLock::ScopedLockType sl (other.processLock); + coefficients = other.coefficients; +} + +IIRFilter::~IIRFilter() noexcept +{ +} + +//============================================================================== +void IIRFilter::makeInactive() noexcept +{ + const SpinLock::ScopedLockType sl (processLock); + active = false; +} + +void IIRFilter::setCoefficients (const IIRCoefficients& newCoefficients) noexcept +{ + const SpinLock::ScopedLockType sl (processLock); + + coefficients = newCoefficients; + active = true; +} + +//============================================================================== +void IIRFilter::reset() noexcept +{ + const SpinLock::ScopedLockType sl (processLock); + v1 = v2 = 0; +} + +float IIRFilter::processSingleSampleRaw (const float in) noexcept +{ + float out = coefficients.coefficients[0] * in + v1; + + JUCE_SNAP_TO_ZERO (out); + + v1 = coefficients.coefficients[1] * in - coefficients.coefficients[3] * out + v2; + v2 = coefficients.coefficients[2] * in - coefficients.coefficients[4] * out; + + return out; +} + +void IIRFilter::processSamples (float* const samples, const int numSamples) noexcept +{ + const SpinLock::ScopedLockType sl (processLock); + + if (active) + { + const float c0 = coefficients.coefficients[0]; + const float c1 = coefficients.coefficients[1]; + const float c2 = coefficients.coefficients[2]; + const float c3 = coefficients.coefficients[3]; + const float c4 = coefficients.coefficients[4]; + float lv1 = v1, lv2 = v2; + + for (int i = 0; i < numSamples; ++i) + { + const float in = samples[i]; + const float out = c0 * in + lv1; + samples[i] = out; + + lv1 = c1 * in - c3 * out + lv2; + lv2 = c2 * in - c4 * out; + } + + JUCE_SNAP_TO_ZERO (lv1); v1 = lv1; + JUCE_SNAP_TO_ZERO (lv2); v2 = lv2; + } +} + +#undef JUCE_SNAP_TO_ZERO diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h new file mode 100644 index 0000000000..8269cf5825 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h @@ -0,0 +1,174 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_IIRFILTER_H_INCLUDED +#define JUCE_IIRFILTER_H_INCLUDED + +class IIRFilter; + +//============================================================================== +/** + A set of coefficients for use in an IIRFilter object. + + @see IIRFilter +*/ +class JUCE_API IIRCoefficients +{ +public: + //============================================================================== + /** Creates a null set of coefficients (which will produce silence). */ + IIRCoefficients() noexcept; + + /** Directly constructs an object from the raw coefficients. + Most people will want to use the static methods instead of this, but + the constructor is public to allow tinkerers to create their own custom + filters! + */ + IIRCoefficients (double c1, double c2, double c3, + double c4, double c5, double c6) noexcept; + + /** Creates a copy of another filter. */ + IIRCoefficients (const IIRCoefficients&) noexcept; + /** Creates a copy of another filter. */ + IIRCoefficients& operator= (const IIRCoefficients&) noexcept; + /** Destructor. */ + ~IIRCoefficients() noexcept; + + /** Returns the coefficients for a low-pass filter. */ + static IIRCoefficients makeLowPass (double sampleRate, + double frequency) noexcept; + + /** Returns the coefficients for a high-pass filter. */ + static IIRCoefficients makeHighPass (double sampleRate, + double frequency) noexcept; + + //============================================================================== + /** Returns the coefficients for a low-pass shelf filter with variable Q and gain. + + The gain is a scale factor that the low frequencies are multiplied by, so values + greater than 1.0 will boost the low frequencies, values less than 1.0 will + attenuate them. + */ + static IIRCoefficients makeLowShelf (double sampleRate, + double cutOffFrequency, + double Q, + float gainFactor) noexcept; + + /** Returns the coefficients for a high-pass shelf filter with variable Q and gain. + + The gain is a scale factor that the high frequencies are multiplied by, so values + greater than 1.0 will boost the high frequencies, values less than 1.0 will + attenuate them. + */ + static IIRCoefficients makeHighShelf (double sampleRate, + double cutOffFrequency, + double Q, + float gainFactor) noexcept; + + /** Returns the coefficients for a peak filter centred around a + given frequency, with a variable Q and gain. + + The gain is a scale factor that the centre frequencies are multiplied by, so + values greater than 1.0 will boost the centre frequencies, values less than + 1.0 will attenuate them. + */ + static IIRCoefficients makePeakFilter (double sampleRate, + double centreFrequency, + double Q, + float gainFactor) noexcept; + + //============================================================================== + /** The raw coefficients. + You should leave these numbers alone unless you really know what you're doing. + */ + float coefficients[5]; +}; + +//============================================================================== +/** + An IIR filter that can perform low, high, or band-pass filtering on an + audio signal. + + @see IIRCoefficient, IIRFilterAudioSource +*/ +class JUCE_API IIRFilter +{ +public: + //============================================================================== + /** Creates a filter. + + Initially the filter is inactive, so will have no effect on samples that + you process with it. Use the setCoefficients() method to turn it into the + type of filter needed. + */ + IIRFilter() noexcept; + + /** Creates a copy of another filter. */ + IIRFilter (const IIRFilter&) noexcept; + + /** Destructor. */ + ~IIRFilter() noexcept; + + //============================================================================== + /** Clears the filter so that any incoming data passes through unchanged. */ + void makeInactive() noexcept; + + /** Applies a set of coefficients to this filter. */ + void setCoefficients (const IIRCoefficients& newCoefficients) noexcept; + + /** Returns the coefficients that this filter is using. */ + IIRCoefficients getCoefficients() const noexcept { return coefficients; } + + //============================================================================== + /** Resets the filter's processing pipeline, ready to start a new stream of data. + + Note that this clears the processing state, but the type of filter and + its coefficients aren't changed. To put a filter into an inactive state, use + the makeInactive() method. + */ + void reset() noexcept; + + /** Performs the filter operation on the given set of samples. */ + void processSamples (float* samples, int numSamples) noexcept; + + /** Processes a single sample, without any locking or checking. + + Use this if you need fast processing of a single value, but be aware that + this isn't thread-safe in the way that processSamples() is. + */ + float processSingleSampleRaw (float sample) noexcept; + +protected: + //============================================================================== + SpinLock processLock; + IIRCoefficients coefficients; + float v1, v2; + bool active; + + IIRFilter& operator= (const IIRFilter&); + JUCE_LEAK_DETECTOR (IIRFilter) +}; + + +#endif // JUCE_IIRFILTER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp new file mode 100644 index 0000000000..7bab3a576f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp @@ -0,0 +1,200 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace LagrangeHelpers +{ + template + struct ResampleHelper + { + static forcedinline void calc (float& a, float b) { a *= b * (1.0f / k); } + }; + + template<> + struct ResampleHelper <0> + { + static forcedinline void calc (float&, float) {} + }; + + template + static forcedinline float calcCoefficient (float input, const float offset) noexcept + { + ResampleHelper <0 - k>::calc (input, -2.0f - offset); + ResampleHelper <1 - k>::calc (input, -1.0f - offset); + ResampleHelper <2 - k>::calc (input, 0.0f - offset); + ResampleHelper <3 - k>::calc (input, 1.0f - offset); + ResampleHelper <4 - k>::calc (input, 2.0f - offset); + return input; + } + + static forcedinline float valueAtOffset (const float* const inputs, const float offset) noexcept + { + return calcCoefficient<0> (inputs[4], offset) + + calcCoefficient<1> (inputs[3], offset) + + calcCoefficient<2> (inputs[2], offset) + + calcCoefficient<3> (inputs[1], offset) + + calcCoefficient<4> (inputs[0], offset); + } + + static forcedinline void push (float* inputs, const float newValue) noexcept + { + inputs[4] = inputs[3]; + inputs[3] = inputs[2]; + inputs[2] = inputs[1]; + inputs[1] = inputs[0]; + inputs[0] = newValue; + } +} + +//============================================================================== +LagrangeInterpolator::LagrangeInterpolator() { reset(); } +LagrangeInterpolator::~LagrangeInterpolator() {} + +void LagrangeInterpolator::reset() noexcept +{ + subSamplePos = 1.0; + + for (int i = 0; i < numElementsInArray (lastInputSamples); ++i) + lastInputSamples[i] = 0; +} + +int LagrangeInterpolator::process (const double actualRatio, const float* in, + float* out, const int numOut) noexcept +{ + if (actualRatio == 1.0) + { + memcpy (out, in, (size_t) numOut * sizeof (float)); + + if (numOut >= 4) + { + memcpy (lastInputSamples, in + (numOut - 4), 4 * sizeof (float)); + } + else + { + for (int i = 0; i < numOut; ++i) + LagrangeHelpers::push (lastInputSamples, in[i]); + } + + return numOut; + } + + const float* const originalIn = in; + double pos = subSamplePos; + + if (actualRatio < 1.0) + { + for (int i = numOut; --i >= 0;) + { + if (pos >= 1.0) + { + LagrangeHelpers::push (lastInputSamples, *in++); + pos -= 1.0; + } + + *out++ = LagrangeHelpers::valueAtOffset (lastInputSamples, (float) pos); + pos += actualRatio; + } + } + else + { + for (int i = numOut; --i >= 0;) + { + while (pos < actualRatio) + { + LagrangeHelpers::push (lastInputSamples, *in++); + pos += 1.0; + } + + pos -= actualRatio; + *out++ = LagrangeHelpers::valueAtOffset (lastInputSamples, 1.0f - (float) pos); + } + } + + subSamplePos = pos; + return (int) (in - originalIn); +} + +int LagrangeInterpolator::processAdding (const double actualRatio, const float* in, + float* out, const int numOut, const float gain) noexcept +{ + if (actualRatio == 1.0) + { + if (gain != 1.0f) + { + for (int i = 0; i < numOut; ++i) + out[i] += in[i] * gain; + } + else + { + for (int i = 0; i < numOut; ++i) + out[i] += in[i]; + } + + if (numOut >= 4) + { + memcpy (lastInputSamples, in + (numOut - 4), 4 * sizeof (float)); + } + else + { + for (int i = 0; i < numOut; ++i) + LagrangeHelpers::push (lastInputSamples, in[i]); + } + + return numOut; + } + + const float* const originalIn = in; + double pos = subSamplePos; + + if (actualRatio < 1.0) + { + for (int i = numOut; --i >= 0;) + { + if (pos >= 1.0) + { + LagrangeHelpers::push (lastInputSamples, *in++); + pos -= 1.0; + } + + *out++ += gain * LagrangeHelpers::valueAtOffset (lastInputSamples, (float) pos); + pos += actualRatio; + } + } + else + { + for (int i = numOut; --i >= 0;) + { + while (pos < actualRatio) + { + LagrangeHelpers::push (lastInputSamples, *in++); + pos += 1.0; + } + + pos -= actualRatio; + *out++ += gain * LagrangeHelpers::valueAtOffset (lastInputSamples, jmax (0.0f, 1.0f - (float) pos)); + } + } + + subSamplePos = pos; + return (int) (in - originalIn); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h new file mode 100644 index 0000000000..caa4802ecf --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h @@ -0,0 +1,94 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED +#define JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED + + +//============================================================================== +/** + Interpolator for resampling a stream of floats using 4-point lagrange interpolation. + + Note that the resampler is stateful, so when there's a break in the continuity + of the input stream you're feeding it, you should call reset() before feeding + it any new data. And like with any other stateful filter, if you're resampling + multiple channels, make sure each one uses its own LagrangeInterpolator + object. +*/ +class JUCE_API LagrangeInterpolator +{ +public: + LagrangeInterpolator(); + ~LagrangeInterpolator(); + + /** Resets the state of the interpolator. + Call this when there's a break in the continuity of the input data stream. + */ + void reset() noexcept; + + /** Resamples a stream of samples. + + @param speedRatio the number of input samples to use for each output sample + @param inputSamples the source data to read from. This must contain at + least (speedRatio * numOutputSamplesToProduce) samples. + @param outputSamples the buffer to write the results into + @param numOutputSamplesToProduce the number of output samples that should be created + + @returns the actual number of input samples that were used + */ + int process (double speedRatio, + const float* inputSamples, + float* outputSamples, + int numOutputSamplesToProduce) noexcept; + + /** Resamples a stream of samples, adding the results to the output data + with a gain. + + @param speedRatio the number of input samples to use for each output sample + @param inputSamples the source data to read from. This must contain at + least (speedRatio * numOutputSamplesToProduce) samples. + @param outputSamples the buffer to write the results to - the result values will be added + to any pre-existing data in this buffer after being multiplied by + the gain factor + @param numOutputSamplesToProduce the number of output samples that should be created + @param gain a gain factor to multiply the resulting samples by before + adding them to the destination buffer + + @returns the actual number of input samples that were used + */ + int processAdding (double speedRatio, + const float* inputSamples, + float* outputSamples, + int numOutputSamplesToProduce, + float gain) noexcept; + +private: + float lastInputSamples[5]; + double subSamplePos; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LagrangeInterpolator) +}; + + +#endif // JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h new file mode 100644 index 0000000000..53457a60b5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h @@ -0,0 +1,323 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_REVERB_H_INCLUDED +#define JUCE_REVERB_H_INCLUDED + + +//============================================================================== +/** + Performs a simple reverb effect on a stream of audio data. + + This is a simple stereo reverb, based on the technique and tunings used in FreeVerb. + Use setSampleRate() to prepare it, and then call processStereo() or processMono() to + apply the reverb to your audio data. + + @see ReverbAudioSource +*/ +class Reverb +{ +public: + //============================================================================== + Reverb() + { + setParameters (Parameters()); + setSampleRate (44100.0); + } + + //============================================================================== + /** Holds the parameters being used by a Reverb object. */ + struct Parameters + { + Parameters() noexcept + : roomSize (0.5f), + damping (0.5f), + wetLevel (0.33f), + dryLevel (0.4f), + width (1.0f), + freezeMode (0) + {} + + float roomSize; /**< Room size, 0 to 1.0, where 1.0 is big, 0 is small. */ + float damping; /**< Damping, 0 to 1.0, where 0 is not damped, 1.0 is fully damped. */ + float wetLevel; /**< Wet level, 0 to 1.0 */ + float dryLevel; /**< Dry level, 0 to 1.0 */ + float width; /**< Reverb width, 0 to 1.0, where 1.0 is very wide. */ + float freezeMode; /**< Freeze mode - values < 0.5 are "normal" mode, values > 0.5 + put the reverb into a continuous feedback loop. */ + }; + + //============================================================================== + /** Returns the reverb's current parameters. */ + const Parameters& getParameters() const noexcept { return parameters; } + + /** Applies a new set of parameters to the reverb. + Note that this doesn't attempt to lock the reverb, so if you call this in parallel with + the process method, you may get artifacts. + */ + void setParameters (const Parameters& newParams) + { + const float wetScaleFactor = 3.0f; + const float dryScaleFactor = 2.0f; + + const float wet = newParams.wetLevel * wetScaleFactor; + wet1 = wet * (newParams.width * 0.5f + 0.5f); + wet2 = wet * (1.0f - newParams.width) * 0.5f; + dry = newParams.dryLevel * dryScaleFactor; + gain = isFrozen (newParams.freezeMode) ? 0.0f : 0.015f; + parameters = newParams; + shouldUpdateDamping = true; + } + + //============================================================================== + /** Sets the sample rate that will be used for the reverb. + You must call this before the process methods, in order to tell it the correct sample rate. + */ + void setSampleRate (const double sampleRate) + { + jassert (sampleRate > 0); + + static const short combTunings[] = { 1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617 }; // (at 44100Hz) + static const short allPassTunings[] = { 556, 441, 341, 225 }; + const int stereoSpread = 23; + const int intSampleRate = (int) sampleRate; + + for (int i = 0; i < numCombs; ++i) + { + comb[0][i].setSize ((intSampleRate * combTunings[i]) / 44100); + comb[1][i].setSize ((intSampleRate * (combTunings[i] + stereoSpread)) / 44100); + } + + for (int i = 0; i < numAllPasses; ++i) + { + allPass[0][i].setSize ((intSampleRate * allPassTunings[i]) / 44100); + allPass[1][i].setSize ((intSampleRate * (allPassTunings[i] + stereoSpread)) / 44100); + } + + shouldUpdateDamping = true; + } + + /** Clears the reverb's buffers. */ + void reset() + { + for (int j = 0; j < numChannels; ++j) + { + for (int i = 0; i < numCombs; ++i) + comb[j][i].clear(); + + for (int i = 0; i < numAllPasses; ++i) + allPass[j][i].clear(); + } + } + + //============================================================================== + /** Applies the reverb to two stereo channels of audio data. */ + void processStereo (float* const left, float* const right, const int numSamples) noexcept + { + jassert (left != nullptr && right != nullptr); + + if (shouldUpdateDamping) + updateDamping(); + + for (int i = 0; i < numSamples; ++i) + { + const float input = (left[i] + right[i]) * gain; + float outL = 0, outR = 0; + + for (int j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel + { + outL += comb[0][j].process (input); + outR += comb[1][j].process (input); + } + + for (int j = 0; j < numAllPasses; ++j) // run the allpass filters in series + { + outL = allPass[0][j].process (outL); + outR = allPass[1][j].process (outR); + } + + left[i] = outL * wet1 + outR * wet2 + left[i] * dry; + right[i] = outR * wet1 + outL * wet2 + right[i] * dry; + } + } + + /** Applies the reverb to a single mono channel of audio data. */ + void processMono (float* const samples, const int numSamples) noexcept + { + jassert (samples != nullptr); + + if (shouldUpdateDamping) + updateDamping(); + + for (int i = 0; i < numSamples; ++i) + { + const float input = samples[i] * gain; + float output = 0; + + for (int j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel + output += comb[0][j].process (input); + + for (int j = 0; j < numAllPasses; ++j) // run the allpass filters in series + output = allPass[0][j].process (output); + + samples[i] = output * wet1 + samples[i] * dry; + } + } + +private: + //============================================================================== + Parameters parameters; + + volatile bool shouldUpdateDamping; + float gain, wet1, wet2, dry; + + inline static bool isFrozen (const float freezeMode) noexcept { return freezeMode >= 0.5f; } + + void updateDamping() noexcept + { + const float roomScaleFactor = 0.28f; + const float roomOffset = 0.7f; + const float dampScaleFactor = 0.4f; + + shouldUpdateDamping = false; + + if (isFrozen (parameters.freezeMode)) + setDamping (0.0f, 1.0f); + else + setDamping (parameters.damping * dampScaleFactor, + parameters.roomSize * roomScaleFactor + roomOffset); + } + + void setDamping (const float dampingToUse, const float roomSizeToUse) noexcept + { + for (int j = 0; j < numChannels; ++j) + for (int i = numCombs; --i >= 0;) + comb[j][i].setFeedbackAndDamp (roomSizeToUse, dampingToUse); + } + + //============================================================================== + class CombFilter + { + public: + CombFilter() noexcept + : bufferSize (0), bufferIndex (0), + feedback (0), last (0), damp1 (0), damp2 (0) + {} + + void setSize (const int size) + { + if (size != bufferSize) + { + bufferIndex = 0; + buffer.malloc ((size_t) size); + bufferSize = size; + } + + clear(); + } + + void clear() noexcept + { + last = 0; + buffer.clear ((size_t) bufferSize); + } + + void setFeedbackAndDamp (const float f, const float d) noexcept + { + damp1 = d; + damp2 = 1.0f - d; + feedback = f; + } + + inline float process (const float input) noexcept + { + const float output = buffer [bufferIndex]; + last = (output * damp2) + (last * damp1); + JUCE_UNDENORMALISE (last); + + float temp = input + (last * feedback); + JUCE_UNDENORMALISE (temp); + buffer [bufferIndex] = temp; + bufferIndex = (bufferIndex + 1) % bufferSize; + return output; + } + + private: + HeapBlock buffer; + int bufferSize, bufferIndex; + float feedback, last, damp1, damp2; + + JUCE_DECLARE_NON_COPYABLE (CombFilter) + }; + + //============================================================================== + class AllPassFilter + { + public: + AllPassFilter() noexcept : bufferSize (0), bufferIndex (0) {} + + void setSize (const int size) + { + if (size != bufferSize) + { + bufferIndex = 0; + buffer.malloc ((size_t) size); + bufferSize = size; + } + + clear(); + } + + void clear() noexcept + { + buffer.clear ((size_t) bufferSize); + } + + inline float process (const float input) noexcept + { + const float bufferedValue = buffer [bufferIndex]; + float temp = input + (bufferedValue * 0.5f); + JUCE_UNDENORMALISE (temp); + buffer [bufferIndex] = temp; + bufferIndex = (bufferIndex + 1) % bufferSize; + return bufferedValue - input; + } + + private: + HeapBlock buffer; + int bufferSize, bufferIndex; + + JUCE_DECLARE_NON_COPYABLE (AllPassFilter) + }; + + enum { numCombs = 8, numAllPasses = 4, numChannels = 2 }; + + CombFilter comb [numChannels][numCombs]; + AllPassFilter allPass [numChannels][numAllPasses]; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Reverb) +}; + + +#endif // JUCE_REVERB_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp new file mode 100644 index 0000000000..da9865900e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp @@ -0,0 +1,94 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if defined (JUCE_AUDIO_BASICS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE + /* When you add this cpp file to your project, you mustn't include it in a file where you've + already included any other headers - just put it inside a file on its own, possibly with your config + flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix + header files that the compiler may be using. + */ + #error "Incorrect use of JUCE cpp file" +#endif + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" +#include "juce_audio_basics.h" + +#if JUCE_MINGW && ! defined (__SSE2__) + #define JUCE_USE_SSE_INTRINSICS 0 +#endif + +#ifndef JUCE_USE_SSE_INTRINSICS + #define JUCE_USE_SSE_INTRINSICS 1 +#endif + +#if ! JUCE_INTEL + #undef JUCE_USE_SSE_INTRINSICS +#endif + +#if JUCE_USE_SSE_INTRINSICS + #include +#endif + +#ifndef JUCE_USE_VDSP_FRAMEWORK + #define JUCE_USE_VDSP_FRAMEWORK 1 +#endif + +#if (JUCE_MAC || JUCE_IOS) && JUCE_USE_VDSP_FRAMEWORK + #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) + #include + #undef Point +#else + #undef JUCE_USE_VDSP_FRAMEWORK +#endif + +#if __ARM_NEON__ && ! (JUCE_USE_VDSP_FRAMEWORK || defined (JUCE_USE_ARM_NEON)) + #define JUCE_USE_ARM_NEON 1 + #include +#endif + +namespace juce +{ + +#include "buffers/juce_AudioDataConverters.cpp" +#include "buffers/juce_AudioSampleBuffer.cpp" +#include "buffers/juce_FloatVectorOperations.cpp" +#include "effects/juce_IIRFilter.cpp" +#include "effects/juce_LagrangeInterpolator.cpp" +#include "midi/juce_MidiBuffer.cpp" +#include "midi/juce_MidiFile.cpp" +#include "midi/juce_MidiKeyboardState.cpp" +#include "midi/juce_MidiMessage.cpp" +#include "midi/juce_MidiMessageSequence.cpp" +#include "sources/juce_BufferingAudioSource.cpp" +#include "sources/juce_ChannelRemappingAudioSource.cpp" +#include "sources/juce_IIRFilterAudioSource.cpp" +#include "sources/juce_MixerAudioSource.cpp" +#include "sources/juce_ResamplingAudioSource.cpp" +#include "sources/juce_ReverbAudioSource.cpp" +#include "sources/juce_ToneGeneratorAudioSource.cpp" +#include "synthesisers/juce_Synthesiser.cpp" + +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h new file mode 100644 index 0000000000..70c5432a7b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h @@ -0,0 +1,59 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIO_BASICS_H_INCLUDED +#define JUCE_AUDIO_BASICS_H_INCLUDED + +#include "../juce_core/juce_core.h" + +//============================================================================= +namespace juce +{ + +#include "buffers/juce_AudioDataConverters.h" +#include "buffers/juce_AudioSampleBuffer.h" +#include "buffers/juce_FloatVectorOperations.h" +#include "effects/juce_Decibels.h" +#include "effects/juce_IIRFilter.h" +#include "effects/juce_LagrangeInterpolator.h" +#include "effects/juce_Reverb.h" +#include "midi/juce_MidiMessage.h" +#include "midi/juce_MidiBuffer.h" +#include "midi/juce_MidiMessageSequence.h" +#include "midi/juce_MidiFile.h" +#include "midi/juce_MidiKeyboardState.h" +#include "sources/juce_AudioSource.h" +#include "sources/juce_PositionableAudioSource.h" +#include "sources/juce_BufferingAudioSource.h" +#include "sources/juce_ChannelRemappingAudioSource.h" +#include "sources/juce_IIRFilterAudioSource.h" +#include "sources/juce_MixerAudioSource.h" +#include "sources/juce_ResamplingAudioSource.h" +#include "sources/juce_ReverbAudioSource.h" +#include "sources/juce_ToneGeneratorAudioSource.h" +#include "synthesisers/juce_Synthesiser.h" + +} + +#endif // JUCE_AUDIO_BASICS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm new file mode 100644 index 0000000000..54083fdaac --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm @@ -0,0 +1,25 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#include "juce_audio_basics.cpp" diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_module_info b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_module_info new file mode 100644 index 0000000000..c9cdd3d979 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/juce_module_info @@ -0,0 +1,24 @@ +{ + "id": "juce_audio_basics", + "name": "JUCE audio and midi data classes", + "version": "3.0.8", + "description": "Classes for audio buffer manipulation, midi message handling, synthesis, etc", + "website": "http://www.juce.com/juce", + "license": "GPL/Commercial", + + "dependencies": [ { "id": "juce_core", "version": "matching" } ], + + "include": "juce_audio_basics.h", + + "compile": [ { "file": "juce_audio_basics.cpp", "target": "! xcode" }, + { "file": "juce_audio_basics.mm", "target": "xcode" } ], + + "browse": [ "buffers/*", + "midi/*", + "effects/*", + "sources/*", + "synthesisers/*" ], + + "OSXFrameworks": "Accelerate", + "iOSFrameworks": "Accelerate" +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp new file mode 100644 index 0000000000..43ab4c175f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp @@ -0,0 +1,229 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace MidiBufferHelpers +{ + inline int getEventTime (const void* const d) noexcept + { + return *static_cast (d); + } + + inline uint16 getEventDataSize (const void* const d) noexcept + { + return *reinterpret_cast (static_cast (d) + sizeof (int32)); + } + + inline uint16 getEventTotalSize (const void* const d) noexcept + { + return getEventDataSize (d) + sizeof (int32) + sizeof (uint16); + } + + static int findActualEventLength (const uint8* const data, const int maxBytes) noexcept + { + unsigned int byte = (unsigned int) *data; + int size = 0; + + if (byte == 0xf0 || byte == 0xf7) + { + const uint8* d = data + 1; + + while (d < data + maxBytes) + if (*d++ == 0xf7) + break; + + size = (int) (d - data); + } + else if (byte == 0xff) + { + int n; + const int bytesLeft = MidiMessage::readVariableLengthVal (data + 1, n); + size = jmin (maxBytes, n + 2 + bytesLeft); + } + else if (byte >= 0x80) + { + size = jmin (maxBytes, MidiMessage::getMessageLengthFromFirstByte ((uint8) byte)); + } + + return size; + } + + static uint8* findEventAfter (uint8* d, uint8* endData, const int samplePosition) noexcept + { + while (d < endData && getEventTime (d) <= samplePosition) + d += getEventTotalSize (d); + + return d; + } +} + +//============================================================================== +MidiBuffer::MidiBuffer() noexcept {} +MidiBuffer::~MidiBuffer() {} + +MidiBuffer::MidiBuffer (const MidiBuffer& other) noexcept : data (other.data) {} + +MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) noexcept +{ + data = other.data; + return *this; +} + +MidiBuffer::MidiBuffer (const MidiMessage& message) noexcept +{ + addEvent (message, 0); +} + +void MidiBuffer::swapWith (MidiBuffer& other) noexcept { data.swapWith (other.data); } +void MidiBuffer::clear() noexcept { data.clearQuick(); } +void MidiBuffer::ensureSize (size_t minimumNumBytes) { data.ensureStorageAllocated ((int) minimumNumBytes); } +bool MidiBuffer::isEmpty() const noexcept { return data.size() == 0; } + +void MidiBuffer::clear (const int startSample, const int numSamples) +{ + uint8* const start = MidiBufferHelpers::findEventAfter (data.begin(), data.end(), startSample - 1); + uint8* const end = MidiBufferHelpers::findEventAfter (start, data.end(), startSample + numSamples - 1); + + data.removeRange ((int) (start - data.begin()), (int) (end - data.begin())); +} + +void MidiBuffer::addEvent (const MidiMessage& m, const int sampleNumber) +{ + addEvent (m.getRawData(), m.getRawDataSize(), sampleNumber); +} + +void MidiBuffer::addEvent (const void* const newData, const int maxBytes, const int sampleNumber) +{ + const int numBytes = MidiBufferHelpers::findActualEventLength (static_cast (newData), maxBytes); + + if (numBytes > 0) + { + const size_t newItemSize = (size_t) numBytes + sizeof (int32) + sizeof (uint16); + const int offset = (int) (MidiBufferHelpers::findEventAfter (data.begin(), data.end(), sampleNumber) - data.begin()); + + data.insertMultiple (offset, 0, (int) newItemSize); + + uint8* const d = data.begin() + offset; + *reinterpret_cast (d) = sampleNumber; + *reinterpret_cast (d + 4) = (uint16) numBytes; + memcpy (d + 6, newData, (size_t) numBytes); + } +} + +void MidiBuffer::addEvents (const MidiBuffer& otherBuffer, + const int startSample, + const int numSamples, + const int sampleDeltaToAdd) +{ + Iterator i (otherBuffer); + i.setNextSamplePosition (startSample); + + const uint8* eventData; + int eventSize, position; + + while (i.getNextEvent (eventData, eventSize, position) + && (position < startSample + numSamples || numSamples < 0)) + { + addEvent (eventData, eventSize, position + sampleDeltaToAdd); + } +} + +int MidiBuffer::getNumEvents() const noexcept +{ + int n = 0; + const uint8* const end = data.end(); + + for (const uint8* d = data.begin(); d < end; ++n) + d += MidiBufferHelpers::getEventTotalSize (d); + + return n; +} + +int MidiBuffer::getFirstEventTime() const noexcept +{ + return data.size() > 0 ? MidiBufferHelpers::getEventTime (data.begin()) : 0; +} + +int MidiBuffer::getLastEventTime() const noexcept +{ + if (data.size() == 0) + return 0; + + const uint8* const endData = data.end(); + + for (const uint8* d = data.begin();;) + { + const uint8* const nextOne = d + MidiBufferHelpers::getEventTotalSize (d); + + if (nextOne >= endData) + return MidiBufferHelpers::getEventTime (d); + + d = nextOne; + } +} + +//============================================================================== +MidiBuffer::Iterator::Iterator (const MidiBuffer& b) noexcept + : buffer (b), data (b.data.begin()) +{ +} + +MidiBuffer::Iterator::~Iterator() noexcept +{ +} + +void MidiBuffer::Iterator::setNextSamplePosition (const int samplePosition) noexcept +{ + data = buffer.data.begin(); + const uint8* const dataEnd = buffer.data.end(); + + while (data < dataEnd && MidiBufferHelpers::getEventTime (data) < samplePosition) + data += MidiBufferHelpers::getEventTotalSize (data); +} + +bool MidiBuffer::Iterator::getNextEvent (const uint8* &midiData, int& numBytes, int& samplePosition) noexcept +{ + if (data >= buffer.data.end()) + return false; + + samplePosition = MidiBufferHelpers::getEventTime (data); + const int itemSize = MidiBufferHelpers::getEventDataSize (data); + numBytes = itemSize; + midiData = data + sizeof (int32) + sizeof (uint16); + data += sizeof (int32) + sizeof (uint16) + (size_t) itemSize; + + return true; +} + +bool MidiBuffer::Iterator::getNextEvent (MidiMessage& result, int& samplePosition) noexcept +{ + if (data >= buffer.data.end()) + return false; + + samplePosition = MidiBufferHelpers::getEventTime (data); + const int itemSize = MidiBufferHelpers::getEventDataSize (data); + result = MidiMessage (data + sizeof (int32) + sizeof (uint16), itemSize, samplePosition); + data += sizeof (int32) + sizeof (uint16) + (size_t) itemSize; + + return true; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h new file mode 100644 index 0000000000..ecbc56a212 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h @@ -0,0 +1,235 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIBUFFER_H_INCLUDED +#define JUCE_MIDIBUFFER_H_INCLUDED + + +//============================================================================== +/** + Holds a sequence of time-stamped midi events. + + Analogous to the AudioSampleBuffer, this holds a set of midi events with + integer time-stamps. The buffer is kept sorted in order of the time-stamps. + + If you're working with a sequence of midi events that may need to be manipulated + or read/written to a midi file, then MidiMessageSequence is probably a more + appropriate container. MidiBuffer is designed for lower-level streams of raw + midi data. + + @see MidiMessage +*/ +class JUCE_API MidiBuffer +{ +public: + //============================================================================== + /** Creates an empty MidiBuffer. */ + MidiBuffer() noexcept; + + /** Creates a MidiBuffer containing a single midi message. */ + explicit MidiBuffer (const MidiMessage& message) noexcept; + + /** Creates a copy of another MidiBuffer. */ + MidiBuffer (const MidiBuffer&) noexcept; + + /** Makes a copy of another MidiBuffer. */ + MidiBuffer& operator= (const MidiBuffer&) noexcept; + + /** Destructor */ + ~MidiBuffer(); + + //============================================================================== + /** Removes all events from the buffer. */ + void clear() noexcept; + + /** Removes all events between two times from the buffer. + + All events for which (start <= event position < start + numSamples) will + be removed. + */ + void clear (int start, int numSamples); + + /** Returns true if the buffer is empty. + To actually retrieve the events, use a MidiBuffer::Iterator object + */ + bool isEmpty() const noexcept; + + /** Counts the number of events in the buffer. + + This is actually quite a slow operation, as it has to iterate through all + the events, so you might prefer to call isEmpty() if that's all you need + to know. + */ + int getNumEvents() const noexcept; + + /** Adds an event to the buffer. + + The sample number will be used to determine the position of the event in + the buffer, which is always kept sorted. The MidiMessage's timestamp is + ignored. + + If an event is added whose sample position is the same as one or more events + already in the buffer, the new event will be placed after the existing ones. + + To retrieve events, use a MidiBuffer::Iterator object + */ + void addEvent (const MidiMessage& midiMessage, int sampleNumber); + + /** Adds an event to the buffer from raw midi data. + + The sample number will be used to determine the position of the event in + the buffer, which is always kept sorted. + + If an event is added whose sample position is the same as one or more events + already in the buffer, the new event will be placed after the existing ones. + + The event data will be inspected to calculate the number of bytes in length that + the midi event really takes up, so maxBytesOfMidiData may be longer than the data + that actually gets stored. E.g. if you pass in a note-on and a length of 4 bytes, + it'll actually only store 3 bytes. If the midi data is invalid, it might not + add an event at all. + + To retrieve events, use a MidiBuffer::Iterator object + */ + void addEvent (const void* rawMidiData, + int maxBytesOfMidiData, + int sampleNumber); + + /** Adds some events from another buffer to this one. + + @param otherBuffer the buffer containing the events you want to add + @param startSample the lowest sample number in the source buffer for which + events should be added. Any source events whose timestamp is + less than this will be ignored + @param numSamples the valid range of samples from the source buffer for which + events should be added - i.e. events in the source buffer whose + timestamp is greater than or equal to (startSample + numSamples) + will be ignored. If this value is less than 0, all events after + startSample will be taken. + @param sampleDeltaToAdd a value which will be added to the source timestamps of the events + that are added to this buffer + */ + void addEvents (const MidiBuffer& otherBuffer, + int startSample, + int numSamples, + int sampleDeltaToAdd); + + /** Returns the sample number of the first event in the buffer. + If the buffer's empty, this will just return 0. + */ + int getFirstEventTime() const noexcept; + + /** Returns the sample number of the last event in the buffer. + If the buffer's empty, this will just return 0. + */ + int getLastEventTime() const noexcept; + + //============================================================================== + /** Exchanges the contents of this buffer with another one. + + This is a quick operation, because no memory allocating or copying is done, it + just swaps the internal state of the two buffers. + */ + void swapWith (MidiBuffer&) noexcept; + + /** Preallocates some memory for the buffer to use. + This helps to avoid needing to reallocate space when the buffer has messages + added to it. + */ + void ensureSize (size_t minimumNumBytes); + + //============================================================================== + /** + Used to iterate through the events in a MidiBuffer. + + Note that altering the buffer while an iterator is using it isn't a + safe operation. + + @see MidiBuffer + */ + class JUCE_API Iterator + { + public: + //============================================================================== + /** Creates an Iterator for this MidiBuffer. */ + Iterator (const MidiBuffer&) noexcept; + + /** Destructor. */ + ~Iterator() noexcept; + + //============================================================================== + /** Repositions the iterator so that the next event retrieved will be the first + one whose sample position is at greater than or equal to the given position. + */ + void setNextSamplePosition (int samplePosition) noexcept; + + /** Retrieves a copy of the next event from the buffer. + + @param result on return, this will be the message. The MidiMessage's timestamp + is set to the same value as samplePosition. + @param samplePosition on return, this will be the position of the event, as a + sample index in the buffer + @returns true if an event was found, or false if the iterator has reached + the end of the buffer + */ + bool getNextEvent (MidiMessage& result, + int& samplePosition) noexcept; + + /** Retrieves the next event from the buffer. + + @param midiData on return, this pointer will be set to a block of data containing + the midi message. Note that to make it fast, this is a pointer + directly into the MidiBuffer's internal data, so is only valid + temporarily until the MidiBuffer is altered. + @param numBytesOfMidiData on return, this is the number of bytes of data used by the + midi message + @param samplePosition on return, this will be the position of the event, as a + sample index in the buffer + @returns true if an event was found, or false if the iterator has reached + the end of the buffer + */ + bool getNextEvent (const uint8* &midiData, + int& numBytesOfMidiData, + int& samplePosition) noexcept; + + private: + //============================================================================== + const MidiBuffer& buffer; + const uint8* data; + + JUCE_DECLARE_NON_COPYABLE (Iterator) + }; + + /** The raw data holding this buffer. + Obviously access to this data is provided at your own risk. Its internal format could + change in future, so don't write code that relies on it! + */ + Array data; + +private: + JUCE_LEAK_DETECTOR (MidiBuffer) +}; + + +#endif // JUCE_MIDIBUFFER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp new file mode 100644 index 0000000000..e798cc0c6c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp @@ -0,0 +1,428 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace MidiFileHelpers +{ + static void writeVariableLengthInt (OutputStream& out, unsigned int v) + { + unsigned int buffer = v & 0x7f; + + while ((v >>= 7) != 0) + { + buffer <<= 8; + buffer |= ((v & 0x7f) | 0x80); + } + + for (;;) + { + out.writeByte ((char) buffer); + + if (buffer & 0x80) + buffer >>= 8; + else + break; + } + } + + static bool parseMidiHeader (const uint8* &data, short& timeFormat, short& fileType, short& numberOfTracks) noexcept + { + unsigned int ch = ByteOrder::bigEndianInt (data); + data += 4; + + if (ch != ByteOrder::bigEndianInt ("MThd")) + { + bool ok = false; + + if (ch == ByteOrder::bigEndianInt ("RIFF")) + { + for (int i = 0; i < 8; ++i) + { + ch = ByteOrder::bigEndianInt (data); + data += 4; + + if (ch == ByteOrder::bigEndianInt ("MThd")) + { + ok = true; + break; + } + } + } + + if (! ok) + return false; + } + + unsigned int bytesRemaining = ByteOrder::bigEndianInt (data); + data += 4; + fileType = (short) ByteOrder::bigEndianShort (data); + data += 2; + numberOfTracks = (short) ByteOrder::bigEndianShort (data); + data += 2; + timeFormat = (short) ByteOrder::bigEndianShort (data); + data += 2; + bytesRemaining -= 6; + data += bytesRemaining; + + return true; + } + + static double convertTicksToSeconds (const double time, + const MidiMessageSequence& tempoEvents, + const int timeFormat) + { + if (timeFormat < 0) + return time / (-(timeFormat >> 8) * (timeFormat & 0xff)); + + double lastTime = 0.0, correctedTime = 0.0; + const double tickLen = 1.0 / (timeFormat & 0x7fff); + double secsPerTick = 0.5 * tickLen; + const int numEvents = tempoEvents.getNumEvents(); + + for (int i = 0; i < numEvents; ++i) + { + const MidiMessage& m = tempoEvents.getEventPointer(i)->message; + const double eventTime = m.getTimeStamp(); + + if (eventTime >= time) + break; + + correctedTime += (eventTime - lastTime) * secsPerTick; + lastTime = eventTime; + + if (m.isTempoMetaEvent()) + secsPerTick = tickLen * m.getTempoSecondsPerQuarterNote(); + + while (i + 1 < numEvents) + { + const MidiMessage& m2 = tempoEvents.getEventPointer(i + 1)->message; + + if (m2.getTimeStamp() != eventTime) + break; + + if (m2.isTempoMetaEvent()) + secsPerTick = tickLen * m2.getTempoSecondsPerQuarterNote(); + + ++i; + } + } + + return correctedTime + (time - lastTime) * secsPerTick; + } + + // a comparator that puts all the note-offs before note-ons that have the same time + struct Sorter + { + static int compareElements (const MidiMessageSequence::MidiEventHolder* const first, + const MidiMessageSequence::MidiEventHolder* const second) noexcept + { + const double diff = (first->message.getTimeStamp() - second->message.getTimeStamp()); + + if (diff > 0) return 1; + if (diff < 0) return -1; + if (first->message.isNoteOff() && second->message.isNoteOn()) return -1; + if (first->message.isNoteOn() && second->message.isNoteOff()) return 1; + + return 0; + } + }; + + template + static void findAllMatchingEvents (const OwnedArray& tracks, + MidiMessageSequence& results, + MethodType method) + { + for (int i = 0; i < tracks.size(); ++i) + { + const MidiMessageSequence& track = *tracks.getUnchecked(i); + const int numEvents = track.getNumEvents(); + + for (int j = 0; j < numEvents; ++j) + { + const MidiMessage& m = track.getEventPointer(j)->message; + + if ((m.*method)()) + results.addEvent (m); + } + } + } +} + +//============================================================================== +MidiFile::MidiFile() + : timeFormat ((short) (unsigned short) 0xe728) +{ +} + +MidiFile::~MidiFile() +{ +} + +void MidiFile::clear() +{ + tracks.clear(); +} + +//============================================================================== +int MidiFile::getNumTracks() const noexcept +{ + return tracks.size(); +} + +const MidiMessageSequence* MidiFile::getTrack (const int index) const noexcept +{ + return tracks [index]; +} + +void MidiFile::addTrack (const MidiMessageSequence& trackSequence) +{ + tracks.add (new MidiMessageSequence (trackSequence)); +} + +//============================================================================== +short MidiFile::getTimeFormat() const noexcept +{ + return timeFormat; +} + +void MidiFile::setTicksPerQuarterNote (const int ticks) noexcept +{ + timeFormat = (short) ticks; +} + +void MidiFile::setSmpteTimeFormat (const int framesPerSecond, + const int subframeResolution) noexcept +{ + timeFormat = (short) (((-framesPerSecond) << 8) | subframeResolution); +} + +//============================================================================== +void MidiFile::findAllTempoEvents (MidiMessageSequence& results) const +{ + MidiFileHelpers::findAllMatchingEvents (tracks, results, &MidiMessage::isTempoMetaEvent); +} + +void MidiFile::findAllTimeSigEvents (MidiMessageSequence& results) const +{ + MidiFileHelpers::findAllMatchingEvents (tracks, results, &MidiMessage::isTimeSignatureMetaEvent); +} + +void MidiFile::findAllKeySigEvents (MidiMessageSequence& results) const +{ + MidiFileHelpers::findAllMatchingEvents (tracks, results, &MidiMessage::isKeySignatureMetaEvent); +} + +double MidiFile::getLastTimestamp() const +{ + double t = 0.0; + + for (int i = tracks.size(); --i >= 0;) + t = jmax (t, tracks.getUnchecked(i)->getEndTime()); + + return t; +} + +//============================================================================== +bool MidiFile::readFrom (InputStream& sourceStream) +{ + clear(); + MemoryBlock data; + + const int maxSensibleMidiFileSize = 2 * 1024 * 1024; + + // (put a sanity-check on the file size, as midi files are generally small) + if (sourceStream.readIntoMemoryBlock (data, maxSensibleMidiFileSize)) + { + size_t size = data.getSize(); + const uint8* d = static_cast (data.getData()); + short fileType, expectedTracks; + + if (size > 16 && MidiFileHelpers::parseMidiHeader (d, timeFormat, fileType, expectedTracks)) + { + size -= (size_t) (d - static_cast (data.getData())); + + int track = 0; + + while (size > 0 && track < expectedTracks) + { + const int chunkType = (int) ByteOrder::bigEndianInt (d); + d += 4; + const int chunkSize = (int) ByteOrder::bigEndianInt (d); + d += 4; + + if (chunkSize <= 0) + break; + + if (chunkType == (int) ByteOrder::bigEndianInt ("MTrk")) + readNextTrack (d, chunkSize); + + size -= (size_t) chunkSize + 8; + d += chunkSize; + ++track; + } + + return true; + } + } + + return false; +} + +void MidiFile::readNextTrack (const uint8* data, int size) +{ + double time = 0; + uint8 lastStatusByte = 0; + + MidiMessageSequence result; + + while (size > 0) + { + int bytesUsed; + const int delay = MidiMessage::readVariableLengthVal (data, bytesUsed); + data += bytesUsed; + size -= bytesUsed; + time += delay; + + int messSize = 0; + const MidiMessage mm (data, size, messSize, lastStatusByte, time); + + if (messSize <= 0) + break; + + size -= messSize; + data += messSize; + + result.addEvent (mm); + + const uint8 firstByte = *(mm.getRawData()); + if ((firstByte & 0xf0) != 0xf0) + lastStatusByte = firstByte; + } + + // use a sort that puts all the note-offs before note-ons that have the same time + MidiFileHelpers::Sorter sorter; + result.list.sort (sorter, true); + + addTrack (result); + tracks.getLast()->updateMatchedPairs(); +} + +//============================================================================== +void MidiFile::convertTimestampTicksToSeconds() +{ + MidiMessageSequence tempoEvents; + findAllTempoEvents (tempoEvents); + findAllTimeSigEvents (tempoEvents); + + if (timeFormat != 0) + { + for (int i = 0; i < tracks.size(); ++i) + { + const MidiMessageSequence& ms = *tracks.getUnchecked(i); + + for (int j = ms.getNumEvents(); --j >= 0;) + { + MidiMessage& m = ms.getEventPointer(j)->message; + m.setTimeStamp (MidiFileHelpers::convertTicksToSeconds (m.getTimeStamp(), tempoEvents, timeFormat)); + } + } + } +} + +//============================================================================== +bool MidiFile::writeTo (OutputStream& out, int midiFileType) +{ + jassert (midiFileType >= 0 && midiFileType <= 2); + + out.writeIntBigEndian ((int) ByteOrder::bigEndianInt ("MThd")); + out.writeIntBigEndian (6); + out.writeShortBigEndian ((short) midiFileType); + out.writeShortBigEndian ((short) tracks.size()); + out.writeShortBigEndian (timeFormat); + + for (int i = 0; i < tracks.size(); ++i) + writeTrack (out, i); + + out.flush(); + return true; +} + +void MidiFile::writeTrack (OutputStream& mainOut, const int trackNum) +{ + MemoryOutputStream out; + const MidiMessageSequence& ms = *tracks.getUnchecked (trackNum); + + int lastTick = 0; + uint8 lastStatusByte = 0; + bool endOfTrackEventWritten = false; + + for (int i = 0; i < ms.getNumEvents(); ++i) + { + const MidiMessage& mm = ms.getEventPointer(i)->message; + + if (mm.isEndOfTrackMetaEvent()) + endOfTrackEventWritten = true; + + const int tick = roundToInt (mm.getTimeStamp()); + const int delta = jmax (0, tick - lastTick); + MidiFileHelpers::writeVariableLengthInt (out, (uint32) delta); + lastTick = tick; + + const uint8* data = mm.getRawData(); + int dataSize = mm.getRawDataSize(); + + const uint8 statusByte = data[0]; + + if (statusByte == lastStatusByte + && (statusByte & 0xf0) != 0xf0 + && dataSize > 1 + && i > 0) + { + ++data; + --dataSize; + } + else if (statusByte == 0xf0) // Write sysex message with length bytes. + { + out.writeByte ((char) statusByte); + + ++data; + --dataSize; + + MidiFileHelpers::writeVariableLengthInt (out, (uint32) dataSize); + } + + out.write (data, (size_t) dataSize); + lastStatusByte = statusByte; + } + + if (! endOfTrackEventWritten) + { + out.writeByte (0); // (tick delta) + const MidiMessage m (MidiMessage::endOfTrack()); + out.write (m.getRawData(), (size_t) m.getRawDataSize()); + } + + mainOut.writeIntBigEndian ((int) ByteOrder::bigEndianInt ("MTrk")); + mainOut.writeIntBigEndian ((int) out.getDataSize()); + mainOut << out; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h new file mode 100644 index 0000000000..2a69937143 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h @@ -0,0 +1,180 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIFILE_H_INCLUDED +#define JUCE_MIDIFILE_H_INCLUDED + + +//============================================================================== +/** + Reads/writes standard midi format files. + + To read a midi file, create a MidiFile object and call its readFrom() method. You + can then get the individual midi tracks from it using the getTrack() method. + + To write a file, create a MidiFile object, add some MidiMessageSequence objects + to it using the addTrack() method, and then call its writeTo() method to stream + it out. + + @see MidiMessageSequence +*/ +class JUCE_API MidiFile +{ +public: + //============================================================================== + /** Creates an empty MidiFile object. + */ + MidiFile(); + + /** Destructor. */ + ~MidiFile(); + + //============================================================================== + /** Returns the number of tracks in the file. + @see getTrack, addTrack + */ + int getNumTracks() const noexcept; + + /** Returns a pointer to one of the tracks in the file. + @returns a pointer to the track, or nullptr if the index is out-of-range + @see getNumTracks, addTrack + */ + const MidiMessageSequence* getTrack (int index) const noexcept; + + /** Adds a midi track to the file. + This will make its own internal copy of the sequence that is passed-in. + @see getNumTracks, getTrack + */ + void addTrack (const MidiMessageSequence& trackSequence); + + /** Removes all midi tracks from the file. + @see getNumTracks + */ + void clear(); + + /** Returns the raw time format code that will be written to a stream. + + After reading a midi file, this method will return the time-format that + was read from the file's header. It can be changed using the setTicksPerQuarterNote() + or setSmpteTimeFormat() methods. + + If the value returned is positive, it indicates the number of midi ticks + per quarter-note - see setTicksPerQuarterNote(). + + It it's negative, the upper byte indicates the frames-per-second (but negative), and + the lower byte is the number of ticks per frame - see setSmpteTimeFormat(). + */ + short getTimeFormat() const noexcept; + + /** Sets the time format to use when this file is written to a stream. + + If this is called, the file will be written as bars/beats using the + specified resolution, rather than SMPTE absolute times, as would be + used if setSmpteTimeFormat() had been called instead. + + @param ticksPerQuarterNote e.g. 96, 960 + @see setSmpteTimeFormat + */ + void setTicksPerQuarterNote (int ticksPerQuarterNote) noexcept; + + /** Sets the time format to use when this file is written to a stream. + + If this is called, the file will be written using absolute times, rather + than bars/beats as would be the case if setTicksPerBeat() had been called + instead. + + @param framesPerSecond must be 24, 25, 29 or 30 + @param subframeResolution the sub-second resolution, e.g. 4 (midi time code), + 8, 10, 80 (SMPTE bit resolution), or 100. For millisecond + timing, setSmpteTimeFormat (25, 40) + @see setTicksPerBeat + */ + void setSmpteTimeFormat (int framesPerSecond, + int subframeResolution) noexcept; + + //============================================================================== + /** Makes a list of all the tempo-change meta-events from all tracks in the midi file. + Useful for finding the positions of all the tempo changes in a file. + @param tempoChangeEvents a list to which all the events will be added + */ + void findAllTempoEvents (MidiMessageSequence& tempoChangeEvents) const; + + /** Makes a list of all the time-signature meta-events from all tracks in the midi file. + Useful for finding the positions of all the tempo changes in a file. + @param timeSigEvents a list to which all the events will be added + */ + void findAllTimeSigEvents (MidiMessageSequence& timeSigEvents) const; + + /** Makes a list of all the time-signature meta-events from all tracks in the midi file. + @param keySigEvents a list to which all the events will be added + */ + void findAllKeySigEvents (MidiMessageSequence& keySigEvents) const; + + /** Returns the latest timestamp in any of the tracks. + (Useful for finding the length of the file). + */ + double getLastTimestamp() const; + + //============================================================================== + /** Reads a midi file format stream. + + After calling this, you can get the tracks that were read from the file by using the + getNumTracks() and getTrack() methods. + + The timestamps of the midi events in the tracks will represent their positions in + terms of midi ticks. To convert them to seconds, use the convertTimestampTicksToSeconds() + method. + + @returns true if the stream was read successfully + */ + bool readFrom (InputStream& sourceStream); + + /** Writes the midi tracks as a standard midi file. + The midiFileType value is written as the file's format type, which can be 0, 1 + or 2 - see the midi file spec for more info about that. + @returns true if the operation succeeded. + */ + bool writeTo (OutputStream& destStream, int midiFileType = 1); + + /** Converts the timestamp of all the midi events from midi ticks to seconds. + + This will use the midi time format and tempo/time signature info in the + tracks to convert all the timestamps to absolute values in seconds. + */ + void convertTimestampTicksToSeconds(); + + +private: + //============================================================================== + OwnedArray tracks; + short timeFormat; + + void readNextTrack (const uint8*, int size); + void writeTrack (OutputStream&, int trackNum); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiFile) +}; + + +#endif // JUCE_MIDIFILE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp new file mode 100644 index 0000000000..a40262b37d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp @@ -0,0 +1,183 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +MidiKeyboardState::MidiKeyboardState() +{ + zerostruct (noteStates); +} + +MidiKeyboardState::~MidiKeyboardState() +{ +} + +//============================================================================== +void MidiKeyboardState::reset() +{ + const ScopedLock sl (lock); + zerostruct (noteStates); + eventsToAdd.clear(); +} + +bool MidiKeyboardState::isNoteOn (const int midiChannel, const int n) const noexcept +{ + jassert (midiChannel >= 0 && midiChannel <= 16); + + return isPositiveAndBelow (n, (int) 128) + && (noteStates[n] & (1 << (midiChannel - 1))) != 0; +} + +bool MidiKeyboardState::isNoteOnForChannels (const int midiChannelMask, const int n) const noexcept +{ + return isPositiveAndBelow (n, (int) 128) + && (noteStates[n] & midiChannelMask) != 0; +} + +void MidiKeyboardState::noteOn (const int midiChannel, const int midiNoteNumber, const float velocity) +{ + jassert (midiChannel >= 0 && midiChannel <= 16); + jassert (isPositiveAndBelow (midiNoteNumber, (int) 128)); + + const ScopedLock sl (lock); + + if (isPositiveAndBelow (midiNoteNumber, (int) 128)) + { + const int timeNow = (int) Time::getMillisecondCounter(); + eventsToAdd.addEvent (MidiMessage::noteOn (midiChannel, midiNoteNumber, velocity), timeNow); + eventsToAdd.clear (0, timeNow - 500); + + noteOnInternal (midiChannel, midiNoteNumber, velocity); + } +} + +void MidiKeyboardState::noteOnInternal (const int midiChannel, const int midiNoteNumber, const float velocity) +{ + if (isPositiveAndBelow (midiNoteNumber, (int) 128)) + { + noteStates [midiNoteNumber] |= (1 << (midiChannel - 1)); + + for (int i = listeners.size(); --i >= 0;) + listeners.getUnchecked(i)->handleNoteOn (this, midiChannel, midiNoteNumber, velocity); + } +} + +void MidiKeyboardState::noteOff (const int midiChannel, const int midiNoteNumber) +{ + const ScopedLock sl (lock); + + if (isNoteOn (midiChannel, midiNoteNumber)) + { + const int timeNow = (int) Time::getMillisecondCounter(); + eventsToAdd.addEvent (MidiMessage::noteOff (midiChannel, midiNoteNumber), timeNow); + eventsToAdd.clear (0, timeNow - 500); + + noteOffInternal (midiChannel, midiNoteNumber); + } +} + +void MidiKeyboardState::noteOffInternal (const int midiChannel, const int midiNoteNumber) +{ + if (isNoteOn (midiChannel, midiNoteNumber)) + { + noteStates [midiNoteNumber] &= ~(1 << (midiChannel - 1)); + + for (int i = listeners.size(); --i >= 0;) + listeners.getUnchecked(i)->handleNoteOff (this, midiChannel, midiNoteNumber); + } +} + +void MidiKeyboardState::allNotesOff (const int midiChannel) +{ + const ScopedLock sl (lock); + + if (midiChannel <= 0) + { + for (int i = 1; i <= 16; ++i) + allNotesOff (i); + } + else + { + for (int i = 0; i < 128; ++i) + noteOff (midiChannel, i); + } +} + +void MidiKeyboardState::processNextMidiEvent (const MidiMessage& message) +{ + if (message.isNoteOn()) + { + noteOnInternal (message.getChannel(), message.getNoteNumber(), message.getFloatVelocity()); + } + else if (message.isNoteOff()) + { + noteOffInternal (message.getChannel(), message.getNoteNumber()); + } + else if (message.isAllNotesOff()) + { + for (int i = 0; i < 128; ++i) + noteOffInternal (message.getChannel(), i); + } +} + +void MidiKeyboardState::processNextMidiBuffer (MidiBuffer& buffer, + const int startSample, + const int numSamples, + const bool injectIndirectEvents) +{ + MidiBuffer::Iterator i (buffer); + MidiMessage message (0xf4, 0.0); + int time; + + const ScopedLock sl (lock); + + while (i.getNextEvent (message, time)) + processNextMidiEvent (message); + + if (injectIndirectEvents) + { + MidiBuffer::Iterator i2 (eventsToAdd); + const int firstEventToAdd = eventsToAdd.getFirstEventTime(); + const double scaleFactor = numSamples / (double) (eventsToAdd.getLastEventTime() + 1 - firstEventToAdd); + + while (i2.getNextEvent (message, time)) + { + const int pos = jlimit (0, numSamples - 1, roundToInt ((time - firstEventToAdd) * scaleFactor)); + buffer.addEvent (message, startSample + pos); + } + } + + eventsToAdd.clear(); +} + +//============================================================================== +void MidiKeyboardState::addListener (MidiKeyboardStateListener* const listener) +{ + const ScopedLock sl (lock); + listeners.addIfNotAlreadyThere (listener); +} + +void MidiKeyboardState::removeListener (MidiKeyboardStateListener* const listener) +{ + const ScopedLock sl (lock); + listeners.removeFirstMatchingValue (listener); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h new file mode 100644 index 0000000000..885b7d88f9 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h @@ -0,0 +1,205 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIKEYBOARDSTATE_H_INCLUDED +#define JUCE_MIDIKEYBOARDSTATE_H_INCLUDED + +class MidiKeyboardState; + + +//============================================================================== +/** + Receives events from a MidiKeyboardState object. + + @see MidiKeyboardState +*/ +class JUCE_API MidiKeyboardStateListener +{ +public: + //============================================================================== + MidiKeyboardStateListener() noexcept {} + virtual ~MidiKeyboardStateListener() {} + + //============================================================================== + /** Called when one of the MidiKeyboardState's keys is pressed. + + This will be called synchronously when the state is either processing a + buffer in its MidiKeyboardState::processNextMidiBuffer() method, or + when a note is being played with its MidiKeyboardState::noteOn() method. + + Note that this callback could happen from an audio callback thread, so be + careful not to block, and avoid any UI activity in the callback. + */ + virtual void handleNoteOn (MidiKeyboardState* source, + int midiChannel, int midiNoteNumber, float velocity) = 0; + + /** Called when one of the MidiKeyboardState's keys is released. + + This will be called synchronously when the state is either processing a + buffer in its MidiKeyboardState::processNextMidiBuffer() method, or + when a note is being played with its MidiKeyboardState::noteOff() method. + + Note that this callback could happen from an audio callback thread, so be + careful not to block, and avoid any UI activity in the callback. + */ + virtual void handleNoteOff (MidiKeyboardState* source, + int midiChannel, int midiNoteNumber) = 0; +}; + + +//============================================================================== +/** + Represents a piano keyboard, keeping track of which keys are currently pressed. + + This object can parse a stream of midi events, using them to update its idea + of which keys are pressed for each individiual midi channel. + + When keys go up or down, it can broadcast these events to listener objects. + + It also allows key up/down events to be triggered with its noteOn() and noteOff() + methods, and midi messages for these events will be merged into the + midi stream that gets processed by processNextMidiBuffer(). +*/ +class JUCE_API MidiKeyboardState +{ +public: + //============================================================================== + MidiKeyboardState(); + ~MidiKeyboardState(); + + //============================================================================== + /** Resets the state of the object. + + All internal data for all the channels is reset, but no events are sent as a + result. + + If you want to release any keys that are currently down, and to send out note-up + midi messages for this, use the allNotesOff() method instead. + */ + void reset(); + + /** Returns true if the given midi key is currently held down for the given midi channel. + + The channel number must be between 1 and 16. If you want to see if any notes are + on for a range of channels, use the isNoteOnForChannels() method. + */ + bool isNoteOn (int midiChannel, int midiNoteNumber) const noexcept; + + /** Returns true if the given midi key is currently held down on any of a set of midi channels. + + The channel mask has a bit set for each midi channel you want to test for - bit + 0 = midi channel 1, bit 1 = midi channel 2, etc. + + If a note is on for at least one of the specified channels, this returns true. + */ + bool isNoteOnForChannels (int midiChannelMask, int midiNoteNumber) const noexcept; + + /** Turns a specified note on. + + This will cause a suitable midi note-on event to be injected into the midi buffer during the + next call to processNextMidiBuffer(). + + It will also trigger a synchronous callback to the listeners to tell them that the key has + gone down. + */ + void noteOn (int midiChannel, int midiNoteNumber, float velocity); + + /** Turns a specified note off. + + This will cause a suitable midi note-off event to be injected into the midi buffer during the + next call to processNextMidiBuffer(). + + It will also trigger a synchronous callback to the listeners to tell them that the key has + gone up. + + But if the note isn't acutally down for the given channel, this method will in fact do nothing. + */ + void noteOff (int midiChannel, int midiNoteNumber); + + /** This will turn off any currently-down notes for the given midi channel. + + If you pass 0 for the midi channel, it will in fact turn off all notes on all channels. + + Calling this method will make calls to noteOff(), so can trigger synchronous callbacks + and events being added to the midi stream. + */ + void allNotesOff (int midiChannel); + + //============================================================================== + /** Looks at a key-up/down event and uses it to update the state of this object. + + To process a buffer full of midi messages, use the processNextMidiBuffer() method + instead. + */ + void processNextMidiEvent (const MidiMessage& message); + + /** Scans a midi stream for up/down events and adds its own events to it. + + This will look for any up/down events and use them to update the internal state, + synchronously making suitable callbacks to the listeners. + + If injectIndirectEvents is true, then midi events to produce the recent noteOn() + and noteOff() calls will be added into the buffer. + + Only the section of the buffer whose timestamps are between startSample and + (startSample + numSamples) will be affected, and any events added will be placed + between these times. + + If you're going to use this method, you'll need to keep calling it regularly for + it to work satisfactorily. + + To process a single midi event at a time, use the processNextMidiEvent() method + instead. + */ + void processNextMidiBuffer (MidiBuffer& buffer, + int startSample, + int numSamples, + bool injectIndirectEvents); + + //============================================================================== + /** Registers a listener for callbacks when keys go up or down. + @see removeListener + */ + void addListener (MidiKeyboardStateListener* listener); + + /** Deregisters a listener. + @see addListener + */ + void removeListener (MidiKeyboardStateListener* listener); + +private: + //============================================================================== + CriticalSection lock; + uint16 noteStates [128]; + MidiBuffer eventsToAdd; + Array listeners; + + void noteOnInternal (int midiChannel, int midiNoteNumber, float velocity); + void noteOffInternal (int midiChannel, int midiNoteNumber); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiKeyboardState) +}; + + +#endif // JUCE_MIDIKEYBOARDSTATE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp new file mode 100644 index 0000000000..07e2ccd271 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp @@ -0,0 +1,1094 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace MidiHelpers +{ + inline uint8 initialByte (const int type, const int channel) noexcept + { + return (uint8) (type | jlimit (0, 15, channel - 1)); + } + + inline uint8 validVelocity (const int v) noexcept + { + return (uint8) jlimit (0, 127, v); + } +} + +//============================================================================== +int MidiMessage::readVariableLengthVal (const uint8* data, int& numBytesUsed) noexcept +{ + numBytesUsed = 0; + int v = 0, i; + + do + { + i = (int) *data++; + + if (++numBytesUsed > 6) + break; + + v = (v << 7) + (i & 0x7f); + + } while (i & 0x80); + + return v; +} + +int MidiMessage::getMessageLengthFromFirstByte (const uint8 firstByte) noexcept +{ + // this method only works for valid starting bytes of a short midi message + jassert (firstByte >= 0x80 && firstByte != 0xf0 && firstByte != 0xf7); + + static const char messageLengths[] = + { + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + + return messageLengths [firstByte & 0x7f]; +} + +//============================================================================== +MidiMessage::MidiMessage() noexcept + : timeStamp (0), size (2) +{ + preallocatedData.asBytes[0] = 0xf0; + preallocatedData.asBytes[1] = 0xf7; +} + +MidiMessage::MidiMessage (const void* const d, const int dataSize, const double t) + : timeStamp (t), + size (dataSize) +{ + jassert (dataSize > 0); + memcpy (allocateSpace (dataSize), d, (size_t) dataSize); + + // check that the length matches the data.. + jassert (size > 3 || *(uint8*)d >= 0xf0 || getMessageLengthFromFirstByte (*(uint8*)d) == size); +} + +MidiMessage::MidiMessage (const int byte1, const double t) noexcept + : timeStamp (t), size (1) +{ + preallocatedData.asBytes[0] = (uint8) byte1; + + // check that the length matches the data.. + jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 1); +} + +MidiMessage::MidiMessage (const int byte1, const int byte2, const double t) noexcept + : timeStamp (t), size (2) +{ + preallocatedData.asBytes[0] = (uint8) byte1; + preallocatedData.asBytes[1] = (uint8) byte2; + + // check that the length matches the data.. + jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 2); +} + +MidiMessage::MidiMessage (const int byte1, const int byte2, const int byte3, const double t) noexcept + : timeStamp (t), size (3) +{ + preallocatedData.asBytes[0] = (uint8) byte1; + preallocatedData.asBytes[1] = (uint8) byte2; + preallocatedData.asBytes[2] = (uint8) byte3; + + // check that the length matches the data.. + jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 3); +} + +MidiMessage::MidiMessage (const MidiMessage& other) + : timeStamp (other.timeStamp), size (other.size) +{ + if (other.allocatedData != nullptr) + { + allocatedData.malloc ((size_t) size); + memcpy (allocatedData, other.allocatedData, (size_t) size); + } + else + { + preallocatedData.asInt32 = other.preallocatedData.asInt32; + } +} + +MidiMessage::MidiMessage (const MidiMessage& other, const double newTimeStamp) + : timeStamp (newTimeStamp), size (other.size) +{ + if (other.allocatedData != nullptr) + { + allocatedData.malloc ((size_t) size); + memcpy (allocatedData, other.allocatedData, (size_t) size); + } + else + { + preallocatedData.asInt32 = other.preallocatedData.asInt32; + } +} + +MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const uint8 lastStatusByte, + double t, bool sysexHasEmbeddedLength) + : timeStamp (t) +{ + const uint8* src = static_cast (srcData); + unsigned int byte = (unsigned int) *src; + + if (byte < 0x80) + { + byte = (unsigned int) (uint8) lastStatusByte; + numBytesUsed = -1; + } + else + { + numBytesUsed = 0; + --sz; + ++src; + } + + if (byte >= 0x80) + { + if (byte == 0xf0) + { + const uint8* d = src; + bool haveReadAllLengthBytes = ! sysexHasEmbeddedLength; + int numVariableLengthSysexBytes = 0; + + while (d < src + sz) + { + if (*d >= 0x80) + { + if (*d == 0xf7) + { + ++d; // include the trailing 0xf7 when we hit it + break; + } + + if (haveReadAllLengthBytes) // if we see a 0x80 bit set after the initial data length + break; // bytes, assume it's the end of the sysex + + ++numVariableLengthSysexBytes; + } + else if (! haveReadAllLengthBytes) + { + haveReadAllLengthBytes = true; + ++numVariableLengthSysexBytes; + } + + ++d; + } + + src += numVariableLengthSysexBytes; + size = 1 + (int) (d - src); + + uint8* dest = allocateSpace (size); + *dest = (uint8) byte; + memcpy (dest + 1, src, (size_t) (size - 1)); + + numBytesUsed += numVariableLengthSysexBytes; // (these aren't counted in the size) + } + else if (byte == 0xff) + { + int n; + const int bytesLeft = readVariableLengthVal (src + 1, n); + size = jmin (sz + 1, n + 2 + bytesLeft); + + uint8* dest = allocateSpace (size); + *dest = (uint8) byte; + memcpy (dest + 1, src, (size_t) size - 1); + } + else + { + preallocatedData.asInt32 = 0; + size = getMessageLengthFromFirstByte ((uint8) byte); + preallocatedData.asBytes[0] = (uint8) byte; + + if (size > 1) + { + preallocatedData.asBytes[1] = src[0]; + + if (size > 2) + preallocatedData.asBytes[2] = src[1]; + } + } + + numBytesUsed += size; + } + else + { + preallocatedData.asInt32 = 0; + size = 0; + } +} + +MidiMessage& MidiMessage::operator= (const MidiMessage& other) +{ + if (this != &other) + { + timeStamp = other.timeStamp; + size = other.size; + + if (other.allocatedData != nullptr) + { + allocatedData.malloc ((size_t) size); + memcpy (allocatedData, other.allocatedData, (size_t) size); + } + else + { + allocatedData.free(); + preallocatedData.asInt32 = other.preallocatedData.asInt32; + } + } + + return *this; +} + +#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS +MidiMessage::MidiMessage (MidiMessage&& other) noexcept + : timeStamp (other.timeStamp), size (other.size) +{ + if (other.allocatedData != nullptr) + allocatedData.swapWith (other.allocatedData); + else + preallocatedData.asInt32 = other.preallocatedData.asInt32; +} + +MidiMessage& MidiMessage::operator= (MidiMessage&& other) noexcept +{ + jassert (this != &other); // shouldn't be possible + + timeStamp = other.timeStamp; + size = other.size; + allocatedData.swapWith (other.allocatedData); + preallocatedData.asInt32 = other.preallocatedData.asInt32; + + return *this; +} +#endif + +MidiMessage::~MidiMessage() {} + +uint8* MidiMessage::allocateSpace (int bytes) +{ + if (bytes > 4) + { + allocatedData.malloc ((size_t) bytes); + return allocatedData; + } + + return preallocatedData.asBytes; +} + +int MidiMessage::getChannel() const noexcept +{ + const uint8* const data = getRawData(); + + if ((data[0] & 0xf0) != 0xf0) + return (data[0] & 0xf) + 1; + + return 0; +} + +bool MidiMessage::isForChannel (const int channel) const noexcept +{ + jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 + + const uint8* const data = getRawData(); + + return ((data[0] & 0xf) == channel - 1) + && ((data[0] & 0xf0) != 0xf0); +} + +void MidiMessage::setChannel (const int channel) noexcept +{ + jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 + + uint8* const data = getData(); + + if ((data[0] & 0xf0) != (uint8) 0xf0) + data[0] = (uint8) ((data[0] & (uint8) 0xf0) + | (uint8)(channel - 1)); +} + +bool MidiMessage::isNoteOn (const bool returnTrueForVelocity0) const noexcept +{ + const uint8* const data = getRawData(); + + return ((data[0] & 0xf0) == 0x90) + && (returnTrueForVelocity0 || data[2] != 0); +} + +bool MidiMessage::isNoteOff (const bool returnTrueForNoteOnVelocity0) const noexcept +{ + const uint8* const data = getRawData(); + + return ((data[0] & 0xf0) == 0x80) + || (returnTrueForNoteOnVelocity0 && (data[2] == 0) && ((data[0] & 0xf0) == 0x90)); +} + +bool MidiMessage::isNoteOnOrOff() const noexcept +{ + const uint8* const data = getRawData(); + + const int d = data[0] & 0xf0; + return (d == 0x90) || (d == 0x80); +} + +int MidiMessage::getNoteNumber() const noexcept +{ + return getRawData()[1]; +} + +void MidiMessage::setNoteNumber (const int newNoteNumber) noexcept +{ + if (isNoteOnOrOff()) + getData()[1] = (uint8) (newNoteNumber & 127); +} + +uint8 MidiMessage::getVelocity() const noexcept +{ + if (isNoteOnOrOff()) + return getRawData()[2]; + + return 0; +} + +float MidiMessage::getFloatVelocity() const noexcept +{ + return getVelocity() * (1.0f / 127.0f); +} + +void MidiMessage::setVelocity (const float newVelocity) noexcept +{ + if (isNoteOnOrOff()) + getData()[2] = MidiHelpers::validVelocity (roundToInt (newVelocity * 127.0f)); +} + +void MidiMessage::multiplyVelocity (const float scaleFactor) noexcept +{ + if (isNoteOnOrOff()) + { + uint8* const data = getData(); + data[2] = MidiHelpers::validVelocity (roundToInt (scaleFactor * data[2])); + } +} + +bool MidiMessage::isAftertouch() const noexcept +{ + return (getRawData()[0] & 0xf0) == 0xa0; +} + +int MidiMessage::getAfterTouchValue() const noexcept +{ + jassert (isAftertouch()); + return getRawData()[2]; +} + +MidiMessage MidiMessage::aftertouchChange (const int channel, + const int noteNum, + const int aftertouchValue) noexcept +{ + jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 + jassert (isPositiveAndBelow (noteNum, (int) 128)); + jassert (isPositiveAndBelow (aftertouchValue, (int) 128)); + + return MidiMessage (MidiHelpers::initialByte (0xa0, channel), + noteNum & 0x7f, + aftertouchValue & 0x7f); +} + +bool MidiMessage::isChannelPressure() const noexcept +{ + return (getRawData()[0] & 0xf0) == 0xd0; +} + +int MidiMessage::getChannelPressureValue() const noexcept +{ + jassert (isChannelPressure()); + return getRawData()[1]; +} + +MidiMessage MidiMessage::channelPressureChange (const int channel, const int pressure) noexcept +{ + jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 + jassert (isPositiveAndBelow (pressure, (int) 128)); + + return MidiMessage (MidiHelpers::initialByte (0xd0, channel), pressure & 0x7f); +} + +bool MidiMessage::isSustainPedalOn() const noexcept { return isControllerOfType (0x40) && getRawData()[2] >= 64; } +bool MidiMessage::isSustainPedalOff() const noexcept { return isControllerOfType (0x40) && getRawData()[2] < 64; } + +bool MidiMessage::isSostenutoPedalOn() const noexcept { return isControllerOfType (0x42) && getRawData()[2] >= 64; } +bool MidiMessage::isSostenutoPedalOff() const noexcept { return isControllerOfType (0x42) && getRawData()[2] < 64; } + +bool MidiMessage::isSoftPedalOn() const noexcept { return isControllerOfType (0x43) && getRawData()[2] >= 64; } +bool MidiMessage::isSoftPedalOff() const noexcept { return isControllerOfType (0x43) && getRawData()[2] < 64; } + + +bool MidiMessage::isProgramChange() const noexcept +{ + return (getRawData()[0] & 0xf0) == 0xc0; +} + +int MidiMessage::getProgramChangeNumber() const noexcept +{ + jassert (isProgramChange()); + return getRawData()[1]; +} + +MidiMessage MidiMessage::programChange (const int channel, const int programNumber) noexcept +{ + jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 + + return MidiMessage (MidiHelpers::initialByte (0xc0, channel), programNumber & 0x7f); +} + +bool MidiMessage::isPitchWheel() const noexcept +{ + return (getRawData()[0] & 0xf0) == 0xe0; +} + +int MidiMessage::getPitchWheelValue() const noexcept +{ + jassert (isPitchWheel()); + const uint8* const data = getRawData(); + return data[1] | (data[2] << 7); +} + +MidiMessage MidiMessage::pitchWheel (const int channel, const int position) noexcept +{ + jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 + jassert (isPositiveAndBelow (position, (int) 0x4000)); + + return MidiMessage (MidiHelpers::initialByte (0xe0, channel), + position & 127, (position >> 7) & 127); +} + +bool MidiMessage::isController() const noexcept +{ + return (getRawData()[0] & 0xf0) == 0xb0; +} + +bool MidiMessage::isControllerOfType (const int controllerType) const noexcept +{ + const uint8* const data = getRawData(); + return (data[0] & 0xf0) == 0xb0 && data[1] == controllerType; +} + +int MidiMessage::getControllerNumber() const noexcept +{ + jassert (isController()); + return getRawData()[1]; +} + +int MidiMessage::getControllerValue() const noexcept +{ + jassert (isController()); + return getRawData()[2]; +} + +MidiMessage MidiMessage::controllerEvent (const int channel, const int controllerType, const int value) noexcept +{ + // the channel must be between 1 and 16 inclusive + jassert (channel > 0 && channel <= 16); + + return MidiMessage (MidiHelpers::initialByte (0xb0, channel), + controllerType & 127, value & 127); +} + +MidiMessage MidiMessage::noteOn (const int channel, const int noteNumber, const float velocity) noexcept +{ + return noteOn (channel, noteNumber, (uint8) (velocity * 127.0f + 0.5f)); +} + +MidiMessage MidiMessage::noteOn (const int channel, const int noteNumber, const uint8 velocity) noexcept +{ + jassert (channel > 0 && channel <= 16); + jassert (isPositiveAndBelow (noteNumber, (int) 128)); + + return MidiMessage (MidiHelpers::initialByte (0x90, channel), + noteNumber & 127, MidiHelpers::validVelocity (velocity)); +} + +MidiMessage MidiMessage::noteOff (const int channel, const int noteNumber, uint8 velocity) noexcept +{ + jassert (channel > 0 && channel <= 16); + jassert (isPositiveAndBelow (noteNumber, (int) 128)); + + return MidiMessage (MidiHelpers::initialByte (0x80, channel), + noteNumber & 127, MidiHelpers::validVelocity (velocity)); +} + +MidiMessage MidiMessage::allNotesOff (const int channel) noexcept +{ + return controllerEvent (channel, 123, 0); +} + +bool MidiMessage::isAllNotesOff() const noexcept +{ + const uint8* const data = getRawData(); + return (data[0] & 0xf0) == 0xb0 && data[1] == 123; +} + +MidiMessage MidiMessage::allSoundOff (const int channel) noexcept +{ + return controllerEvent (channel, 120, 0); +} + +bool MidiMessage::isAllSoundOff() const noexcept +{ + const uint8* const data = getRawData(); + return (data[0] & 0xf0) == 0xb0 && data[1] == 120; +} + +MidiMessage MidiMessage::allControllersOff (const int channel) noexcept +{ + return controllerEvent (channel, 121, 0); +} + +MidiMessage MidiMessage::masterVolume (const float volume) +{ + const int vol = jlimit (0, 0x3fff, roundToInt (volume * 0x4000)); + + const uint8 buf[] = { 0xf0, 0x7f, 0x7f, 0x04, 0x01, + (uint8) (vol & 0x7f), + (uint8) (vol >> 7), + 0xf7 }; + + return MidiMessage (buf, 8); +} + +//============================================================================== +bool MidiMessage::isSysEx() const noexcept +{ + return *getRawData() == 0xf0; +} + +MidiMessage MidiMessage::createSysExMessage (const void* sysexData, const int dataSize) +{ + HeapBlock m ((size_t) dataSize + 2); + + m[0] = 0xf0; + memcpy (m + 1, sysexData, (size_t) dataSize); + m[dataSize + 1] = 0xf7; + + return MidiMessage (m, dataSize + 2); +} + +const uint8* MidiMessage::getSysExData() const noexcept +{ + return isSysEx() ? getRawData() + 1 : nullptr; +} + +int MidiMessage::getSysExDataSize() const noexcept +{ + return isSysEx() ? size - 2 : 0; +} + +//============================================================================== +bool MidiMessage::isMetaEvent() const noexcept { return *getRawData() == 0xff; } +bool MidiMessage::isActiveSense() const noexcept { return *getRawData() == 0xfe; } + +int MidiMessage::getMetaEventType() const noexcept +{ + const uint8* const data = getRawData(); + return *data != 0xff ? -1 : data[1]; +} + +int MidiMessage::getMetaEventLength() const noexcept +{ + const uint8* const data = getRawData(); + if (*data == 0xff) + { + int n; + return jmin (size - 2, readVariableLengthVal (data + 2, n)); + } + + return 0; +} + +const uint8* MidiMessage::getMetaEventData() const noexcept +{ + jassert (isMetaEvent()); + + int n; + const uint8* d = getRawData() + 2; + readVariableLengthVal (d, n); + return d + n; +} + +bool MidiMessage::isTrackMetaEvent() const noexcept { return getMetaEventType() == 0; } +bool MidiMessage::isEndOfTrackMetaEvent() const noexcept { return getMetaEventType() == 47; } + +bool MidiMessage::isTextMetaEvent() const noexcept +{ + const int t = getMetaEventType(); + return t > 0 && t < 16; +} + +String MidiMessage::getTextFromTextMetaEvent() const +{ + const char* const textData = reinterpret_cast (getMetaEventData()); + return String (CharPointer_UTF8 (textData), + CharPointer_UTF8 (textData + getMetaEventLength())); +} + +MidiMessage MidiMessage::textMetaEvent (int type, StringRef text) +{ + jassert (type > 0 && type < 16); + + MidiMessage result; + + const size_t textSize = text.text.sizeInBytes() - 1; + + uint8 header[8]; + size_t n = sizeof (header); + + header[--n] = (uint8) (textSize & 0x7f); + + for (size_t i = textSize; (i >>= 7) != 0;) + header[--n] = (uint8) ((i & 0x7f) | 0x80); + + header[--n] = (uint8) type; + header[--n] = 0xff; + + const size_t headerLen = sizeof (header) - n; + + uint8* const dest = result.allocateSpace ((int) (headerLen + textSize)); + result.size = (int) (headerLen + textSize); + + memcpy (dest, header + n, headerLen); + memcpy (dest + headerLen, text.text.getAddress(), textSize); + + return result; +} + +bool MidiMessage::isTrackNameEvent() const noexcept { const uint8* data = getRawData(); return (data[1] == 3) && (*data == 0xff); } +bool MidiMessage::isTempoMetaEvent() const noexcept { const uint8* data = getRawData(); return (data[1] == 81) && (*data == 0xff); } +bool MidiMessage::isMidiChannelMetaEvent() const noexcept { const uint8* data = getRawData(); return (data[1] == 0x20) && (*data == 0xff) && (data[2] == 1); } + +int MidiMessage::getMidiChannelMetaEventChannel() const noexcept +{ + jassert (isMidiChannelMetaEvent()); + return getRawData()[3] + 1; +} + +double MidiMessage::getTempoSecondsPerQuarterNote() const noexcept +{ + if (! isTempoMetaEvent()) + return 0.0; + + const uint8* const d = getMetaEventData(); + + return (((unsigned int) d[0] << 16) + | ((unsigned int) d[1] << 8) + | d[2]) + / 1000000.0; +} + +double MidiMessage::getTempoMetaEventTickLength (const short timeFormat) const noexcept +{ + if (timeFormat > 0) + { + if (! isTempoMetaEvent()) + return 0.5 / timeFormat; + + return getTempoSecondsPerQuarterNote() / timeFormat; + } + else + { + const int frameCode = (-timeFormat) >> 8; + double framesPerSecond; + + switch (frameCode) + { + case 24: framesPerSecond = 24.0; break; + case 25: framesPerSecond = 25.0; break; + case 29: framesPerSecond = 29.97; break; + case 30: framesPerSecond = 30.0; break; + default: framesPerSecond = 30.0; break; + } + + return (1.0 / framesPerSecond) / (timeFormat & 0xff); + } +} + +MidiMessage MidiMessage::tempoMetaEvent (int microsecondsPerQuarterNote) noexcept +{ + const uint8 d[] = { 0xff, 81, 3, + (uint8) (microsecondsPerQuarterNote >> 16), + (uint8) (microsecondsPerQuarterNote >> 8), + (uint8) microsecondsPerQuarterNote }; + + return MidiMessage (d, 6, 0.0); +} + +bool MidiMessage::isTimeSignatureMetaEvent() const noexcept +{ + const uint8* const data = getRawData(); + return (data[1] == 0x58) && (*data == (uint8) 0xff); +} + +void MidiMessage::getTimeSignatureInfo (int& numerator, int& denominator) const noexcept +{ + if (isTimeSignatureMetaEvent()) + { + const uint8* const d = getMetaEventData(); + numerator = d[0]; + denominator = 1 << d[1]; + } + else + { + numerator = 4; + denominator = 4; + } +} + +MidiMessage MidiMessage::timeSignatureMetaEvent (const int numerator, const int denominator) +{ + int n = 1; + int powerOfTwo = 0; + + while (n < denominator) + { + n <<= 1; + ++powerOfTwo; + } + + const uint8 d[] = { 0xff, 0x58, 0x04, (uint8) numerator, (uint8) powerOfTwo, 1, 96 }; + return MidiMessage (d, 7, 0.0); +} + +MidiMessage MidiMessage::midiChannelMetaEvent (const int channel) noexcept +{ + const uint8 d[] = { 0xff, 0x20, 0x01, (uint8) jlimit (0, 0xff, channel - 1) }; + return MidiMessage (d, 4, 0.0); +} + +bool MidiMessage::isKeySignatureMetaEvent() const noexcept +{ + return getMetaEventType() == 0x59; +} + +int MidiMessage::getKeySignatureNumberOfSharpsOrFlats() const noexcept +{ + return (int) getMetaEventData()[0]; +} + +bool MidiMessage::isKeySignatureMajorKey() const noexcept +{ + return getMetaEventData()[1] == 0; +} + +MidiMessage MidiMessage::keySignatureMetaEvent (int numberOfSharpsOrFlats, bool isMinorKey) +{ + jassert (numberOfSharpsOrFlats >= -7 && numberOfSharpsOrFlats <= 7); + + const uint8 d[] = { 0xff, 0x59, 0x02, (uint8) numberOfSharpsOrFlats, isMinorKey ? (uint8) 1 : (uint8) 0 }; + return MidiMessage (d, 5, 0.0); +} + +MidiMessage MidiMessage::endOfTrack() noexcept +{ + return MidiMessage (0xff, 0x2f, 0, 0.0); +} + +//============================================================================== +bool MidiMessage::isSongPositionPointer() const noexcept { return *getRawData() == 0xf2; } +int MidiMessage::getSongPositionPointerMidiBeat() const noexcept { const uint8* data = getRawData(); return data[1] | (data[2] << 7); } + +MidiMessage MidiMessage::songPositionPointer (const int positionInMidiBeats) noexcept +{ + return MidiMessage (0xf2, + positionInMidiBeats & 127, + (positionInMidiBeats >> 7) & 127); +} + +bool MidiMessage::isMidiStart() const noexcept { return *getRawData() == 0xfa; } +MidiMessage MidiMessage::midiStart() noexcept { return MidiMessage (0xfa); } + +bool MidiMessage::isMidiContinue() const noexcept { return *getRawData() == 0xfb; } +MidiMessage MidiMessage::midiContinue() noexcept { return MidiMessage (0xfb); } + +bool MidiMessage::isMidiStop() const noexcept { return *getRawData() == 0xfc; } +MidiMessage MidiMessage::midiStop() noexcept { return MidiMessage (0xfc); } + +bool MidiMessage::isMidiClock() const noexcept { return *getRawData() == 0xf8; } +MidiMessage MidiMessage::midiClock() noexcept { return MidiMessage (0xf8); } + +bool MidiMessage::isQuarterFrame() const noexcept { return *getRawData() == 0xf1; } +int MidiMessage::getQuarterFrameSequenceNumber() const noexcept { return ((int) getRawData()[1]) >> 4; } +int MidiMessage::getQuarterFrameValue() const noexcept { return ((int) getRawData()[1]) & 0x0f; } + +MidiMessage MidiMessage::quarterFrame (const int sequenceNumber, const int value) noexcept +{ + return MidiMessage (0xf1, (sequenceNumber << 4) | value); +} + +bool MidiMessage::isFullFrame() const noexcept +{ + const uint8* const data = getRawData(); + + return data[0] == 0xf0 + && data[1] == 0x7f + && size >= 10 + && data[3] == 0x01 + && data[4] == 0x01; +} + +void MidiMessage::getFullFrameParameters (int& hours, int& minutes, int& seconds, int& frames, + MidiMessage::SmpteTimecodeType& timecodeType) const noexcept +{ + jassert (isFullFrame()); + + const uint8* const data = getRawData(); + timecodeType = (SmpteTimecodeType) (data[5] >> 5); + hours = data[5] & 0x1f; + minutes = data[6]; + seconds = data[7]; + frames = data[8]; +} + +MidiMessage MidiMessage::fullFrame (const int hours, const int minutes, + const int seconds, const int frames, + MidiMessage::SmpteTimecodeType timecodeType) +{ + const uint8 d[] = { 0xf0, 0x7f, 0x7f, 0x01, 0x01, + (uint8) ((hours & 0x01f) | (timecodeType << 5)), + (uint8) minutes, + (uint8) seconds, + (uint8) frames, + 0xf7 }; + + return MidiMessage (d, 10, 0.0); +} + +bool MidiMessage::isMidiMachineControlMessage() const noexcept +{ + const uint8* const data = getRawData(); + return data[0] == 0xf0 + && data[1] == 0x7f + && data[3] == 0x06 + && size > 5; +} + +MidiMessage::MidiMachineControlCommand MidiMessage::getMidiMachineControlCommand() const noexcept +{ + jassert (isMidiMachineControlMessage()); + + return (MidiMachineControlCommand) getRawData()[4]; +} + +MidiMessage MidiMessage::midiMachineControlCommand (MidiMessage::MidiMachineControlCommand command) +{ + const uint8 d[] = { 0xf0, 0x7f, 0, 6, (uint8) command, 0xf7 }; + + return MidiMessage (d, 6, 0.0); +} + +//============================================================================== +bool MidiMessage::isMidiMachineControlGoto (int& hours, int& minutes, int& seconds, int& frames) const noexcept +{ + const uint8* const data = getRawData(); + if (size >= 12 + && data[0] == 0xf0 + && data[1] == 0x7f + && data[3] == 0x06 + && data[4] == 0x44 + && data[5] == 0x06 + && data[6] == 0x01) + { + hours = data[7] % 24; // (that some machines send out hours > 24) + minutes = data[8]; + seconds = data[9]; + frames = data[10]; + + return true; + } + + return false; +} + +MidiMessage MidiMessage::midiMachineControlGoto (int hours, int minutes, int seconds, int frames) +{ + const uint8 d[] = { 0xf0, 0x7f, 0, 6, 0x44, 6, 1, + (uint8) hours, + (uint8) minutes, + (uint8) seconds, + (uint8) frames, + 0xf7 }; + + return MidiMessage (d, 12, 0.0); +} + +//============================================================================== +String MidiMessage::getMidiNoteName (int note, bool useSharps, bool includeOctaveNumber, int octaveNumForMiddleC) +{ + static const char* const sharpNoteNames[] = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; + static const char* const flatNoteNames[] = { "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B" }; + + if (isPositiveAndBelow (note, (int) 128)) + { + String s (useSharps ? sharpNoteNames [note % 12] + : flatNoteNames [note % 12]); + + if (includeOctaveNumber) + s << (note / 12 + (octaveNumForMiddleC - 5)); + + return s; + } + + return String::empty; +} + +double MidiMessage::getMidiNoteInHertz (int noteNumber, const double frequencyOfA) noexcept +{ + return frequencyOfA * pow (2.0, (noteNumber - 69) / 12.0); +} + +bool MidiMessage::isMidiNoteBlack (int noteNumber) noexcept +{ + return ((1 << (noteNumber % 12)) & 0x054a) != 0; +} + +const char* MidiMessage::getGMInstrumentName (const int n) +{ + static const char* names[] = + { + NEEDS_TRANS("Acoustic Grand Piano"), NEEDS_TRANS("Bright Acoustic Piano"), NEEDS_TRANS("Electric Grand Piano"), NEEDS_TRANS("Honky-tonk Piano"), + NEEDS_TRANS("Electric Piano 1"), NEEDS_TRANS("Electric Piano 2"), NEEDS_TRANS("Harpsichord"), NEEDS_TRANS("Clavinet"), + NEEDS_TRANS("Celesta"), NEEDS_TRANS("Glockenspiel"), NEEDS_TRANS("Music Box"), NEEDS_TRANS("Vibraphone"), + NEEDS_TRANS("Marimba"), NEEDS_TRANS("Xylophone"), NEEDS_TRANS("Tubular Bells"), NEEDS_TRANS("Dulcimer"), + NEEDS_TRANS("Drawbar Organ"), NEEDS_TRANS("Percussive Organ"), NEEDS_TRANS("Rock Organ"), NEEDS_TRANS("Church Organ"), + NEEDS_TRANS("Reed Organ"), NEEDS_TRANS("Accordion"), NEEDS_TRANS("Harmonica"), NEEDS_TRANS("Tango Accordion"), + NEEDS_TRANS("Acoustic Guitar (nylon)"), NEEDS_TRANS("Acoustic Guitar (steel)"), NEEDS_TRANS("Electric Guitar (jazz)"), NEEDS_TRANS("Electric Guitar (clean)"), + NEEDS_TRANS("Electric Guitar (mute)"), NEEDS_TRANS("Overdriven Guitar"), NEEDS_TRANS("Distortion Guitar"), NEEDS_TRANS("Guitar Harmonics"), + NEEDS_TRANS("Acoustic Bass"), NEEDS_TRANS("Electric Bass (finger)"), NEEDS_TRANS("Electric Bass (pick)"), NEEDS_TRANS("Fretless Bass"), + NEEDS_TRANS("Slap Bass 1"), NEEDS_TRANS("Slap Bass 2"), NEEDS_TRANS("Synth Bass 1"), NEEDS_TRANS("Synth Bass 2"), + NEEDS_TRANS("Violin"), NEEDS_TRANS("Viola"), NEEDS_TRANS("Cello"), NEEDS_TRANS("Contrabass"), + NEEDS_TRANS("Tremolo Strings"), NEEDS_TRANS("Pizzicato Strings"), NEEDS_TRANS("Orchestral Harp"), NEEDS_TRANS("Timpani"), + NEEDS_TRANS("String Ensemble 1"), NEEDS_TRANS("String Ensemble 2"), NEEDS_TRANS("SynthStrings 1"), NEEDS_TRANS("SynthStrings 2"), + NEEDS_TRANS("Choir Aahs"), NEEDS_TRANS("Voice Oohs"), NEEDS_TRANS("Synth Voice"), NEEDS_TRANS("Orchestra Hit"), + NEEDS_TRANS("Trumpet"), NEEDS_TRANS("Trombone"), NEEDS_TRANS("Tuba"), NEEDS_TRANS("Muted Trumpet"), + NEEDS_TRANS("French Horn"), NEEDS_TRANS("Brass Section"), NEEDS_TRANS("SynthBrass 1"), NEEDS_TRANS("SynthBrass 2"), + NEEDS_TRANS("Soprano Sax"), NEEDS_TRANS("Alto Sax"), NEEDS_TRANS("Tenor Sax"), NEEDS_TRANS("Baritone Sax"), + NEEDS_TRANS("Oboe"), NEEDS_TRANS("English Horn"), NEEDS_TRANS("Bassoon"), NEEDS_TRANS("Clarinet"), + NEEDS_TRANS("Piccolo"), NEEDS_TRANS("Flute"), NEEDS_TRANS("Recorder"), NEEDS_TRANS("Pan Flute"), + NEEDS_TRANS("Blown Bottle"), NEEDS_TRANS("Shakuhachi"), NEEDS_TRANS("Whistle"), NEEDS_TRANS("Ocarina"), + NEEDS_TRANS("Lead 1 (square)"), NEEDS_TRANS("Lead 2 (sawtooth)"), NEEDS_TRANS("Lead 3 (calliope)"), NEEDS_TRANS("Lead 4 (chiff)"), + NEEDS_TRANS("Lead 5 (charang)"), NEEDS_TRANS("Lead 6 (voice)"), NEEDS_TRANS("Lead 7 (fifths)"), NEEDS_TRANS("Lead 8 (bass+lead)"), + NEEDS_TRANS("Pad 1 (new age)"), NEEDS_TRANS("Pad 2 (warm)"), NEEDS_TRANS("Pad 3 (polysynth)"), NEEDS_TRANS("Pad 4 (choir)"), + NEEDS_TRANS("Pad 5 (bowed)"), NEEDS_TRANS("Pad 6 (metallic)"), NEEDS_TRANS("Pad 7 (halo)"), NEEDS_TRANS("Pad 8 (sweep)"), + NEEDS_TRANS("FX 1 (rain)"), NEEDS_TRANS("FX 2 (soundtrack)"), NEEDS_TRANS("FX 3 (crystal)"), NEEDS_TRANS("FX 4 (atmosphere)"), + NEEDS_TRANS("FX 5 (brightness)"), NEEDS_TRANS("FX 6 (goblins)"), NEEDS_TRANS("FX 7 (echoes)"), NEEDS_TRANS("FX 8 (sci-fi)"), + NEEDS_TRANS("Sitar"), NEEDS_TRANS("Banjo"), NEEDS_TRANS("Shamisen"), NEEDS_TRANS("Koto"), + NEEDS_TRANS("Kalimba"), NEEDS_TRANS("Bag pipe"), NEEDS_TRANS("Fiddle"), NEEDS_TRANS("Shanai"), + NEEDS_TRANS("Tinkle Bell"), NEEDS_TRANS("Agogo"), NEEDS_TRANS("Steel Drums"), NEEDS_TRANS("Woodblock"), + NEEDS_TRANS("Taiko Drum"), NEEDS_TRANS("Melodic Tom"), NEEDS_TRANS("Synth Drum"), NEEDS_TRANS("Reverse Cymbal"), + NEEDS_TRANS("Guitar Fret Noise"), NEEDS_TRANS("Breath Noise"), NEEDS_TRANS("Seashore"), NEEDS_TRANS("Bird Tweet"), + NEEDS_TRANS("Telephone Ring"), NEEDS_TRANS("Helicopter"), NEEDS_TRANS("Applause"), NEEDS_TRANS("Gunshot") + }; + + return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] : nullptr; +} + +const char* MidiMessage::getGMInstrumentBankName (const int n) +{ + static const char* names[] = + { + NEEDS_TRANS("Piano"), NEEDS_TRANS("Chromatic Percussion"), NEEDS_TRANS("Organ"), NEEDS_TRANS("Guitar"), + NEEDS_TRANS("Bass"), NEEDS_TRANS("Strings"), NEEDS_TRANS("Ensemble"), NEEDS_TRANS("Brass"), + NEEDS_TRANS("Reed"), NEEDS_TRANS("Pipe"), NEEDS_TRANS("Synth Lead"), NEEDS_TRANS("Synth Pad"), + NEEDS_TRANS("Synth Effects"), NEEDS_TRANS("Ethnic"), NEEDS_TRANS("Percussive"), NEEDS_TRANS("Sound Effects") + }; + + return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] : nullptr; +} + +const char* MidiMessage::getRhythmInstrumentName (const int n) +{ + static const char* names[] = + { + NEEDS_TRANS("Acoustic Bass Drum"), NEEDS_TRANS("Bass Drum 1"), NEEDS_TRANS("Side Stick"), NEEDS_TRANS("Acoustic Snare"), + NEEDS_TRANS("Hand Clap"), NEEDS_TRANS("Electric Snare"), NEEDS_TRANS("Low Floor Tom"), NEEDS_TRANS("Closed Hi-Hat"), + NEEDS_TRANS("High Floor Tom"), NEEDS_TRANS("Pedal Hi-Hat"), NEEDS_TRANS("Low Tom"), NEEDS_TRANS("Open Hi-Hat"), + NEEDS_TRANS("Low-Mid Tom"), NEEDS_TRANS("Hi-Mid Tom"), NEEDS_TRANS("Crash Cymbal 1"), NEEDS_TRANS("High Tom"), + NEEDS_TRANS("Ride Cymbal 1"), NEEDS_TRANS("Chinese Cymbal"), NEEDS_TRANS("Ride Bell"), NEEDS_TRANS("Tambourine"), + NEEDS_TRANS("Splash Cymbal"), NEEDS_TRANS("Cowbell"), NEEDS_TRANS("Crash Cymbal 2"), NEEDS_TRANS("Vibraslap"), + NEEDS_TRANS("Ride Cymbal 2"), NEEDS_TRANS("Hi Bongo"), NEEDS_TRANS("Low Bongo"), NEEDS_TRANS("Mute Hi Conga"), + NEEDS_TRANS("Open Hi Conga"), NEEDS_TRANS("Low Conga"), NEEDS_TRANS("High Timbale"), NEEDS_TRANS("Low Timbale"), + NEEDS_TRANS("High Agogo"), NEEDS_TRANS("Low Agogo"), NEEDS_TRANS("Cabasa"), NEEDS_TRANS("Maracas"), + NEEDS_TRANS("Short Whistle"), NEEDS_TRANS("Long Whistle"), NEEDS_TRANS("Short Guiro"), NEEDS_TRANS("Long Guiro"), + NEEDS_TRANS("Claves"), NEEDS_TRANS("Hi Wood Block"), NEEDS_TRANS("Low Wood Block"), NEEDS_TRANS("Mute Cuica"), + NEEDS_TRANS("Open Cuica"), NEEDS_TRANS("Mute Triangle"), NEEDS_TRANS("Open Triangle") + }; + + return (n >= 35 && n <= 81) ? names [n - 35] : nullptr; +} + +const char* MidiMessage::getControllerName (const int n) +{ + static const char* names[] = + { + NEEDS_TRANS("Bank Select"), NEEDS_TRANS("Modulation Wheel (coarse)"), NEEDS_TRANS("Breath controller (coarse)"), + nullptr, + NEEDS_TRANS("Foot Pedal (coarse)"), NEEDS_TRANS("Portamento Time (coarse)"), NEEDS_TRANS("Data Entry (coarse)"), + NEEDS_TRANS("Volume (coarse)"), NEEDS_TRANS("Balance (coarse)"), + nullptr, + NEEDS_TRANS("Pan position (coarse)"), NEEDS_TRANS("Expression (coarse)"), NEEDS_TRANS("Effect Control 1 (coarse)"), + NEEDS_TRANS("Effect Control 2 (coarse)"), + nullptr, nullptr, + NEEDS_TRANS("General Purpose Slider 1"), NEEDS_TRANS("General Purpose Slider 2"), + NEEDS_TRANS("General Purpose Slider 3"), NEEDS_TRANS("General Purpose Slider 4"), + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + NEEDS_TRANS("Bank Select (fine)"), NEEDS_TRANS("Modulation Wheel (fine)"), NEEDS_TRANS("Breath controller (fine)"), + nullptr, + NEEDS_TRANS("Foot Pedal (fine)"), NEEDS_TRANS("Portamento Time (fine)"), NEEDS_TRANS("Data Entry (fine)"), NEEDS_TRANS("Volume (fine)"), + NEEDS_TRANS("Balance (fine)"), nullptr, NEEDS_TRANS("Pan position (fine)"), NEEDS_TRANS("Expression (fine)"), + NEEDS_TRANS("Effect Control 1 (fine)"), NEEDS_TRANS("Effect Control 2 (fine)"), + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + NEEDS_TRANS("Hold Pedal (on/off)"), NEEDS_TRANS("Portamento (on/off)"), NEEDS_TRANS("Sustenuto Pedal (on/off)"), NEEDS_TRANS("Soft Pedal (on/off)"), + NEEDS_TRANS("Legato Pedal (on/off)"), NEEDS_TRANS("Hold 2 Pedal (on/off)"), NEEDS_TRANS("Sound Variation"), NEEDS_TRANS("Sound Timbre"), + NEEDS_TRANS("Sound Release Time"), NEEDS_TRANS("Sound Attack Time"), NEEDS_TRANS("Sound Brightness"), NEEDS_TRANS("Sound Control 6"), + NEEDS_TRANS("Sound Control 7"), NEEDS_TRANS("Sound Control 8"), NEEDS_TRANS("Sound Control 9"), NEEDS_TRANS("Sound Control 10"), + NEEDS_TRANS("General Purpose Button 1 (on/off)"), NEEDS_TRANS("General Purpose Button 2 (on/off)"), + NEEDS_TRANS("General Purpose Button 3 (on/off)"), NEEDS_TRANS("General Purpose Button 4 (on/off)"), + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + NEEDS_TRANS("Reverb Level"), NEEDS_TRANS("Tremolo Level"), NEEDS_TRANS("Chorus Level"), NEEDS_TRANS("Celeste Level"), + NEEDS_TRANS("Phaser Level"), NEEDS_TRANS("Data Button increment"), NEEDS_TRANS("Data Button decrement"), NEEDS_TRANS("Non-registered Parameter (fine)"), + NEEDS_TRANS("Non-registered Parameter (coarse)"), NEEDS_TRANS("Registered Parameter (fine)"), NEEDS_TRANS("Registered Parameter (coarse)"), + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + NEEDS_TRANS("All Sound Off"), NEEDS_TRANS("All Controllers Off"), NEEDS_TRANS("Local Keyboard (on/off)"), NEEDS_TRANS("All Notes Off"), + NEEDS_TRANS("Omni Mode Off"), NEEDS_TRANS("Omni Mode On"), NEEDS_TRANS("Mono Operation"), NEEDS_TRANS("Poly Operation") + }; + + return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] : nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h new file mode 100644 index 0000000000..9002aa0336 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h @@ -0,0 +1,903 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIMESSAGE_H_INCLUDED +#define JUCE_MIDIMESSAGE_H_INCLUDED + + +//============================================================================== +/** + Encapsulates a MIDI message. + + @see MidiMessageSequence, MidiOutput, MidiInput +*/ +class JUCE_API MidiMessage +{ +public: + //============================================================================== + /** Creates a 3-byte short midi message. + + @param byte1 message byte 1 + @param byte2 message byte 2 + @param byte3 message byte 3 + @param timeStamp the time to give the midi message - this value doesn't + use any particular units, so will be application-specific + */ + MidiMessage (int byte1, int byte2, int byte3, double timeStamp = 0) noexcept; + + /** Creates a 2-byte short midi message. + + @param byte1 message byte 1 + @param byte2 message byte 2 + @param timeStamp the time to give the midi message - this value doesn't + use any particular units, so will be application-specific + */ + MidiMessage (int byte1, int byte2, double timeStamp = 0) noexcept; + + /** Creates a 1-byte short midi message. + + @param byte1 message byte 1 + @param timeStamp the time to give the midi message - this value doesn't + use any particular units, so will be application-specific + */ + MidiMessage (int byte1, double timeStamp = 0) noexcept; + + /** Creates a midi message from a block of data. */ + MidiMessage (const void* data, int numBytes, double timeStamp = 0); + + /** Reads the next midi message from some data. + + This will read as many bytes from a data stream as it needs to make a + complete message, and will return the number of bytes it used. This lets + you read a sequence of midi messages from a file or stream. + + @param data the data to read from + @param maxBytesToUse the maximum number of bytes it's allowed to read + @param numBytesUsed returns the number of bytes that were actually needed + @param lastStatusByte in a sequence of midi messages, the initial byte + can be dropped from a message if it's the same as the + first byte of the previous message, so this lets you + supply the byte to use if the first byte of the message + has in fact been dropped. + @param timeStamp the time to give the midi message - this value doesn't + use any particular units, so will be application-specific + @param sysexHasEmbeddedLength when reading sysexes, this flag indicates whether + to expect the data to begin with a variable-length field + indicating its size + */ + MidiMessage (const void* data, int maxBytesToUse, + int& numBytesUsed, uint8 lastStatusByte, + double timeStamp = 0, + bool sysexHasEmbeddedLength = true); + + /** Creates an active-sense message. + Since the MidiMessage has to contain a valid message, this default constructor + just initialises it with an empty sysex message. + */ + MidiMessage() noexcept; + + /** Creates a copy of another midi message. */ + MidiMessage (const MidiMessage&); + + /** Creates a copy of another midi message, with a different timestamp. */ + MidiMessage (const MidiMessage&, double newTimeStamp); + + /** Destructor. */ + ~MidiMessage(); + + /** Copies this message from another one. */ + MidiMessage& operator= (const MidiMessage& other); + + #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS + MidiMessage (MidiMessage&&) noexcept; + MidiMessage& operator= (MidiMessage&&) noexcept; + #endif + + //============================================================================== + /** Returns a pointer to the raw midi data. + @see getRawDataSize + */ + const uint8* getRawData() const noexcept { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; } + + /** Returns the number of bytes of data in the message. + @see getRawData + */ + int getRawDataSize() const noexcept { return size; } + + //============================================================================== + /** Returns the timestamp associated with this message. + + The exact meaning of this time and its units will vary, as messages are used in + a variety of different contexts. + + If you're getting the message from a midi file, this could be a time in seconds, or + a number of ticks - see MidiFile::convertTimestampTicksToSeconds(). + + If the message is being used in a MidiBuffer, it might indicate the number of + audio samples from the start of the buffer. + + If the message was created by a MidiInput, see MidiInputCallback::handleIncomingMidiMessage() + for details of the way that it initialises this value. + + @see setTimeStamp, addToTimeStamp + */ + double getTimeStamp() const noexcept { return timeStamp; } + + /** Changes the message's associated timestamp. + The units for the timestamp will be application-specific - see the notes for getTimeStamp(). + @see addToTimeStamp, getTimeStamp + */ + void setTimeStamp (double newTimestamp) noexcept { timeStamp = newTimestamp; } + + /** Adds a value to the message's timestamp. + The units for the timestamp will be application-specific. + */ + void addToTimeStamp (double delta) noexcept { timeStamp += delta; } + + //============================================================================== + /** Returns the midi channel associated with the message. + + @returns a value 1 to 16 if the message has a channel, or 0 if it hasn't (e.g. + if it's a sysex) + @see isForChannel, setChannel + */ + int getChannel() const noexcept; + + /** Returns true if the message applies to the given midi channel. + + @param channelNumber the channel number to look for, in the range 1 to 16 + @see getChannel, setChannel + */ + bool isForChannel (int channelNumber) const noexcept; + + /** Changes the message's midi channel. + This won't do anything for non-channel messages like sysexes. + @param newChannelNumber the channel number to change it to, in the range 1 to 16 + */ + void setChannel (int newChannelNumber) noexcept; + + //============================================================================== + /** Returns true if this is a system-exclusive message. + */ + bool isSysEx() const noexcept; + + /** Returns a pointer to the sysex data inside the message. + If this event isn't a sysex event, it'll return 0. + @see getSysExDataSize + */ + const uint8* getSysExData() const noexcept; + + /** Returns the size of the sysex data. + This value excludes the 0xf0 header byte and the 0xf7 at the end. + @see getSysExData + */ + int getSysExDataSize() const noexcept; + + //============================================================================== + /** Returns true if this message is a 'key-down' event. + + @param returnTrueForVelocity0 if true, then if this event is a note-on with + velocity 0, it will still be considered to be a note-on and the + method will return true. If returnTrueForVelocity0 is false, then + if this is a note-on event with velocity 0, it'll be regarded as + a note-off, and the method will return false + + @see isNoteOff, getNoteNumber, getVelocity, noteOn + */ + bool isNoteOn (bool returnTrueForVelocity0 = false) const noexcept; + + /** Creates a key-down message (using a floating-point velocity). + + @param channel the midi channel, in the range 1 to 16 + @param noteNumber the key number, 0 to 127 + @param velocity in the range 0 to 1.0 + @see isNoteOn + */ + static MidiMessage noteOn (int channel, int noteNumber, float velocity) noexcept; + + /** Creates a key-down message (using an integer velocity). + + @param channel the midi channel, in the range 1 to 16 + @param noteNumber the key number, 0 to 127 + @param velocity in the range 0 to 127 + @see isNoteOn + */ + static MidiMessage noteOn (int channel, int noteNumber, uint8 velocity) noexcept; + + /** Returns true if this message is a 'key-up' event. + + If returnTrueForNoteOnVelocity0 is true, then his will also return true + for a note-on event with a velocity of 0. + + @see isNoteOn, getNoteNumber, getVelocity, noteOff + */ + bool isNoteOff (bool returnTrueForNoteOnVelocity0 = true) const noexcept; + + /** Creates a key-up message. + + @param channel the midi channel, in the range 1 to 16 + @param noteNumber the key number, 0 to 127 + @param velocity in the range 0 to 127 + @see isNoteOff + */ + static MidiMessage noteOff (int channel, int noteNumber, uint8 velocity = 0) noexcept; + + /** Returns true if this message is a 'key-down' or 'key-up' event. + + @see isNoteOn, isNoteOff + */ + bool isNoteOnOrOff() const noexcept; + + /** Returns the midi note number for note-on and note-off messages. + If the message isn't a note-on or off, the value returned is undefined. + @see isNoteOff, getMidiNoteName, getMidiNoteInHertz, setNoteNumber + */ + int getNoteNumber() const noexcept; + + /** Changes the midi note number of a note-on or note-off message. + If the message isn't a note on or off, this will do nothing. + */ + void setNoteNumber (int newNoteNumber) noexcept; + + //============================================================================== + /** Returns the velocity of a note-on or note-off message. + + The value returned will be in the range 0 to 127. + If the message isn't a note-on or off event, it will return 0. + + @see getFloatVelocity + */ + uint8 getVelocity() const noexcept; + + /** Returns the velocity of a note-on or note-off message. + + The value returned will be in the range 0 to 1.0 + If the message isn't a note-on or off event, it will return 0. + + @see getVelocity, setVelocity + */ + float getFloatVelocity() const noexcept; + + /** Changes the velocity of a note-on or note-off message. + + If the message isn't a note on or off, this will do nothing. + + @param newVelocity the new velocity, in the range 0 to 1.0 + @see getFloatVelocity, multiplyVelocity + */ + void setVelocity (float newVelocity) noexcept; + + /** Multiplies the velocity of a note-on or note-off message by a given amount. + + If the message isn't a note on or off, this will do nothing. + + @param scaleFactor the value by which to multiply the velocity + @see setVelocity + */ + void multiplyVelocity (float scaleFactor) noexcept; + + //============================================================================== + /** Returns true if this message is a 'sustain pedal down' controller message. */ + bool isSustainPedalOn() const noexcept; + /** Returns true if this message is a 'sustain pedal up' controller message. */ + bool isSustainPedalOff() const noexcept; + + /** Returns true if this message is a 'sostenuto pedal down' controller message. */ + bool isSostenutoPedalOn() const noexcept; + /** Returns true if this message is a 'sostenuto pedal up' controller message. */ + bool isSostenutoPedalOff() const noexcept; + + /** Returns true if this message is a 'soft pedal down' controller message. */ + bool isSoftPedalOn() const noexcept; + /** Returns true if this message is a 'soft pedal up' controller message. */ + bool isSoftPedalOff() const noexcept; + + //============================================================================== + /** Returns true if the message is a program (patch) change message. + @see getProgramChangeNumber, getGMInstrumentName + */ + bool isProgramChange() const noexcept; + + /** Returns the new program number of a program change message. + If the message isn't a program change, the value returned is undefined. + @see isProgramChange, getGMInstrumentName + */ + int getProgramChangeNumber() const noexcept; + + /** Creates a program-change message. + + @param channel the midi channel, in the range 1 to 16 + @param programNumber the midi program number, 0 to 127 + @see isProgramChange, getGMInstrumentName + */ + static MidiMessage programChange (int channel, int programNumber) noexcept; + + //============================================================================== + /** Returns true if the message is a pitch-wheel move. + @see getPitchWheelValue, pitchWheel + */ + bool isPitchWheel() const noexcept; + + /** Returns the pitch wheel position from a pitch-wheel move message. + + The value returned is a 14-bit number from 0 to 0x3fff, indicating the wheel position. + If called for messages which aren't pitch wheel events, the number returned will be + nonsense. + + @see isPitchWheel + */ + int getPitchWheelValue() const noexcept; + + /** Creates a pitch-wheel move message. + + @param channel the midi channel, in the range 1 to 16 + @param position the wheel position, in the range 0 to 16383 + @see isPitchWheel + */ + static MidiMessage pitchWheel (int channel, int position) noexcept; + + //============================================================================== + /** Returns true if the message is an aftertouch event. + + For aftertouch events, use the getNoteNumber() method to find out the key + that it applies to, and getAftertouchValue() to find out the amount. Use + getChannel() to find out the channel. + + @see getAftertouchValue, getNoteNumber + */ + bool isAftertouch() const noexcept; + + /** Returns the amount of aftertouch from an aftertouch messages. + + The value returned is in the range 0 to 127, and will be nonsense for messages + other than aftertouch messages. + + @see isAftertouch + */ + int getAfterTouchValue() const noexcept; + + /** Creates an aftertouch message. + + @param channel the midi channel, in the range 1 to 16 + @param noteNumber the key number, 0 to 127 + @param aftertouchAmount the amount of aftertouch, 0 to 127 + @see isAftertouch + */ + static MidiMessage aftertouchChange (int channel, + int noteNumber, + int aftertouchAmount) noexcept; + + /** Returns true if the message is a channel-pressure change event. + + This is like aftertouch, but common to the whole channel rather than a specific + note. Use getChannelPressureValue() to find out the pressure, and getChannel() + to find out the channel. + + @see channelPressureChange + */ + bool isChannelPressure() const noexcept; + + /** Returns the pressure from a channel pressure change message. + + @returns the pressure, in the range 0 to 127 + @see isChannelPressure, channelPressureChange + */ + int getChannelPressureValue() const noexcept; + + /** Creates a channel-pressure change event. + + @param channel the midi channel: 1 to 16 + @param pressure the pressure, 0 to 127 + @see isChannelPressure + */ + static MidiMessage channelPressureChange (int channel, int pressure) noexcept; + + //============================================================================== + /** Returns true if this is a midi controller message. + + @see getControllerNumber, getControllerValue, controllerEvent + */ + bool isController() const noexcept; + + /** Returns the controller number of a controller message. + + The name of the controller can be looked up using the getControllerName() method. + Note that the value returned is invalid for messages that aren't controller changes. + + @see isController, getControllerName, getControllerValue + */ + int getControllerNumber() const noexcept; + + /** Returns the controller value from a controller message. + + A value 0 to 127 is returned to indicate the new controller position. + Note that the value returned is invalid for messages that aren't controller changes. + + @see isController, getControllerNumber + */ + int getControllerValue() const noexcept; + + /** Returns true if this message is a controller message and if it has the specified + controller type. + */ + bool isControllerOfType (int controllerType) const noexcept; + + /** Creates a controller message. + + @param channel the midi channel, in the range 1 to 16 + @param controllerType the type of controller + @param value the controller value + @see isController + */ + static MidiMessage controllerEvent (int channel, + int controllerType, + int value) noexcept; + + /** Checks whether this message is an all-notes-off message. + @see allNotesOff + */ + bool isAllNotesOff() const noexcept; + + /** Checks whether this message is an all-sound-off message. + @see allSoundOff + */ + bool isAllSoundOff() const noexcept; + + /** Creates an all-notes-off message. + + @param channel the midi channel, in the range 1 to 16 + @see isAllNotesOff + */ + static MidiMessage allNotesOff (int channel) noexcept; + + /** Creates an all-sound-off message. + + @param channel the midi channel, in the range 1 to 16 + @see isAllSoundOff + */ + static MidiMessage allSoundOff (int channel) noexcept; + + /** Creates an all-controllers-off message. + + @param channel the midi channel, in the range 1 to 16 + */ + static MidiMessage allControllersOff (int channel) noexcept; + + //============================================================================== + /** Returns true if this event is a meta-event. + + Meta-events are things like tempo changes, track names, etc. + + @see getMetaEventType, isTrackMetaEvent, isEndOfTrackMetaEvent, + isTextMetaEvent, isTrackNameEvent, isTempoMetaEvent, isTimeSignatureMetaEvent, + isKeySignatureMetaEvent, isMidiChannelMetaEvent + */ + bool isMetaEvent() const noexcept; + + /** Returns a meta-event's type number. + + If the message isn't a meta-event, this will return -1. + + @see isMetaEvent, isTrackMetaEvent, isEndOfTrackMetaEvent, + isTextMetaEvent, isTrackNameEvent, isTempoMetaEvent, isTimeSignatureMetaEvent, + isKeySignatureMetaEvent, isMidiChannelMetaEvent + */ + int getMetaEventType() const noexcept; + + /** Returns a pointer to the data in a meta-event. + @see isMetaEvent, getMetaEventLength + */ + const uint8* getMetaEventData() const noexcept; + + /** Returns the length of the data for a meta-event. + @see isMetaEvent, getMetaEventData + */ + int getMetaEventLength() const noexcept; + + //============================================================================== + /** Returns true if this is a 'track' meta-event. */ + bool isTrackMetaEvent() const noexcept; + + /** Returns true if this is an 'end-of-track' meta-event. */ + bool isEndOfTrackMetaEvent() const noexcept; + + /** Creates an end-of-track meta-event. + @see isEndOfTrackMetaEvent + */ + static MidiMessage endOfTrack() noexcept; + + /** Returns true if this is an 'track name' meta-event. + You can use the getTextFromTextMetaEvent() method to get the track's name. + */ + bool isTrackNameEvent() const noexcept; + + /** Returns true if this is a 'text' meta-event. + @see getTextFromTextMetaEvent + */ + bool isTextMetaEvent() const noexcept; + + /** Returns the text from a text meta-event. + @see isTextMetaEvent + */ + String getTextFromTextMetaEvent() const; + + /** Creates a text meta-event. */ + static MidiMessage textMetaEvent (int type, StringRef text); + + //============================================================================== + /** Returns true if this is a 'tempo' meta-event. + @see getTempoMetaEventTickLength, getTempoSecondsPerQuarterNote + */ + bool isTempoMetaEvent() const noexcept; + + /** Returns the tick length from a tempo meta-event. + + @param timeFormat the 16-bit time format value from the midi file's header. + @returns the tick length (in seconds). + @see isTempoMetaEvent + */ + double getTempoMetaEventTickLength (short timeFormat) const noexcept; + + /** Calculates the seconds-per-quarter-note from a tempo meta-event. + @see isTempoMetaEvent, getTempoMetaEventTickLength + */ + double getTempoSecondsPerQuarterNote() const noexcept; + + /** Creates a tempo meta-event. + @see isTempoMetaEvent + */ + static MidiMessage tempoMetaEvent (int microsecondsPerQuarterNote) noexcept; + + //============================================================================== + /** Returns true if this is a 'time-signature' meta-event. + @see getTimeSignatureInfo + */ + bool isTimeSignatureMetaEvent() const noexcept; + + /** Returns the time-signature values from a time-signature meta-event. + @see isTimeSignatureMetaEvent + */ + void getTimeSignatureInfo (int& numerator, int& denominator) const noexcept; + + /** Creates a time-signature meta-event. + @see isTimeSignatureMetaEvent + */ + static MidiMessage timeSignatureMetaEvent (int numerator, int denominator); + + //============================================================================== + /** Returns true if this is a 'key-signature' meta-event. + @see getKeySignatureNumberOfSharpsOrFlats, isKeySignatureMajorKey + */ + bool isKeySignatureMetaEvent() const noexcept; + + /** Returns the key from a key-signature meta-event. + This method must only be called if isKeySignatureMetaEvent() is true. + A positive number here indicates the number of sharps in the key signature, + and a negative number indicates a number of flats. So e.g. 3 = F# + C# + G#, + -2 = Bb + Eb + @see isKeySignatureMetaEvent, isKeySignatureMajorKey + */ + int getKeySignatureNumberOfSharpsOrFlats() const noexcept; + + /** Returns true if this key-signature event is major, or false if it's minor. + This method must only be called if isKeySignatureMetaEvent() is true. + */ + bool isKeySignatureMajorKey() const noexcept; + + /** Creates a key-signature meta-event. + @param numberOfSharpsOrFlats if positive, this indicates the number of sharps + in the key; if negative, the number of flats + @param isMinorKey if true, the key is minor; if false, it is major + @see isKeySignatureMetaEvent + */ + static MidiMessage keySignatureMetaEvent (int numberOfSharpsOrFlats, bool isMinorKey); + + //============================================================================== + /** Returns true if this is a 'channel' meta-event. + + A channel meta-event specifies the midi channel that should be used + for subsequent meta-events. + + @see getMidiChannelMetaEventChannel + */ + bool isMidiChannelMetaEvent() const noexcept; + + /** Returns the channel number from a channel meta-event. + + @returns the channel, in the range 1 to 16. + @see isMidiChannelMetaEvent + */ + int getMidiChannelMetaEventChannel() const noexcept; + + /** Creates a midi channel meta-event. + + @param channel the midi channel, in the range 1 to 16 + @see isMidiChannelMetaEvent + */ + static MidiMessage midiChannelMetaEvent (int channel) noexcept; + + //============================================================================== + /** Returns true if this is an active-sense message. */ + bool isActiveSense() const noexcept; + + //============================================================================== + /** Returns true if this is a midi start event. + @see midiStart + */ + bool isMidiStart() const noexcept; + + /** Creates a midi start event. */ + static MidiMessage midiStart() noexcept; + + /** Returns true if this is a midi continue event. + @see midiContinue + */ + bool isMidiContinue() const noexcept; + + /** Creates a midi continue event. */ + static MidiMessage midiContinue() noexcept; + + /** Returns true if this is a midi stop event. + @see midiStop + */ + bool isMidiStop() const noexcept; + + /** Creates a midi stop event. */ + static MidiMessage midiStop() noexcept; + + /** Returns true if this is a midi clock event. + @see midiClock, songPositionPointer + */ + bool isMidiClock() const noexcept; + + /** Creates a midi clock event. */ + static MidiMessage midiClock() noexcept; + + /** Returns true if this is a song-position-pointer message. + @see getSongPositionPointerMidiBeat, songPositionPointer + */ + bool isSongPositionPointer() const noexcept; + + /** Returns the midi beat-number of a song-position-pointer message. + @see isSongPositionPointer, songPositionPointer + */ + int getSongPositionPointerMidiBeat() const noexcept; + + /** Creates a song-position-pointer message. + + The position is a number of midi beats from the start of the song, where 1 midi + beat is 6 midi clocks, and there are 24 midi clocks in a quarter-note. So there + are 4 midi beats in a quarter-note. + + @see isSongPositionPointer, getSongPositionPointerMidiBeat + */ + static MidiMessage songPositionPointer (int positionInMidiBeats) noexcept; + + //============================================================================== + /** Returns true if this is a quarter-frame midi timecode message. + @see quarterFrame, getQuarterFrameSequenceNumber, getQuarterFrameValue + */ + bool isQuarterFrame() const noexcept; + + /** Returns the sequence number of a quarter-frame midi timecode message. + This will be a value between 0 and 7. + @see isQuarterFrame, getQuarterFrameValue, quarterFrame + */ + int getQuarterFrameSequenceNumber() const noexcept; + + /** Returns the value from a quarter-frame message. + This will be the lower nybble of the message's data-byte, a value between 0 and 15 + */ + int getQuarterFrameValue() const noexcept; + + /** Creates a quarter-frame MTC message. + + @param sequenceNumber a value 0 to 7 for the upper nybble of the message's data byte + @param value a value 0 to 15 for the lower nybble of the message's data byte + */ + static MidiMessage quarterFrame (int sequenceNumber, int value) noexcept; + + /** SMPTE timecode types. + Used by the getFullFrameParameters() and fullFrame() methods. + */ + enum SmpteTimecodeType + { + fps24 = 0, + fps25 = 1, + fps30drop = 2, + fps30 = 3 + }; + + /** Returns true if this is a full-frame midi timecode message. */ + bool isFullFrame() const noexcept; + + /** Extracts the timecode information from a full-frame midi timecode message. + + You should only call this on messages where you've used isFullFrame() to + check that they're the right kind. + */ + void getFullFrameParameters (int& hours, + int& minutes, + int& seconds, + int& frames, + SmpteTimecodeType& timecodeType) const noexcept; + + /** Creates a full-frame MTC message. */ + static MidiMessage fullFrame (int hours, + int minutes, + int seconds, + int frames, + SmpteTimecodeType timecodeType); + + //============================================================================== + /** Types of MMC command. + + @see isMidiMachineControlMessage, getMidiMachineControlCommand, midiMachineControlCommand + */ + enum MidiMachineControlCommand + { + mmc_stop = 1, + mmc_play = 2, + mmc_deferredplay = 3, + mmc_fastforward = 4, + mmc_rewind = 5, + mmc_recordStart = 6, + mmc_recordStop = 7, + mmc_pause = 9 + }; + + /** Checks whether this is an MMC message. + If it is, you can use the getMidiMachineControlCommand() to find out its type. + */ + bool isMidiMachineControlMessage() const noexcept; + + /** For an MMC message, this returns its type. + + Make sure it's actually an MMC message with isMidiMachineControlMessage() before + calling this method. + */ + MidiMachineControlCommand getMidiMachineControlCommand() const noexcept; + + /** Creates an MMC message. */ + static MidiMessage midiMachineControlCommand (MidiMachineControlCommand command); + + /** Checks whether this is an MMC "goto" message. + If it is, the parameters passed-in are set to the time that the message contains. + @see midiMachineControlGoto + */ + bool isMidiMachineControlGoto (int& hours, + int& minutes, + int& seconds, + int& frames) const noexcept; + + /** Creates an MMC "goto" message. + This messages tells the device to go to a specific frame. + @see isMidiMachineControlGoto + */ + static MidiMessage midiMachineControlGoto (int hours, + int minutes, + int seconds, + int frames); + + //============================================================================== + /** Creates a master-volume change message. + @param volume the volume, 0 to 1.0 + */ + static MidiMessage masterVolume (float volume); + + //============================================================================== + /** Creates a system-exclusive message. + The data passed in is wrapped with header and tail bytes of 0xf0 and 0xf7. + */ + static MidiMessage createSysExMessage (const void* sysexData, + int dataSize); + + + //============================================================================== + /** Reads a midi variable-length integer. + + @param data the data to read the number from + @param numBytesUsed on return, this will be set to the number of bytes that were read + */ + static int readVariableLengthVal (const uint8* data, + int& numBytesUsed) noexcept; + + /** Based on the first byte of a short midi message, this uses a lookup table + to return the message length (either 1, 2, or 3 bytes). + + The value passed in must be 0x80 or higher. + */ + static int getMessageLengthFromFirstByte (const uint8 firstByte) noexcept; + + //============================================================================== + /** Returns the name of a midi note number. + + E.g "C", "D#", etc. + + @param noteNumber the midi note number, 0 to 127 + @param useSharps if true, sharpened notes are used, e.g. "C#", otherwise + they'll be flattened, e.g. "Db" + @param includeOctaveNumber if true, the octave number will be appended to the string, + e.g. "C#4" + @param octaveNumForMiddleC if an octave number is being appended, this indicates the + number that will be used for middle C's octave + + @see getMidiNoteInHertz + */ + static String getMidiNoteName (int noteNumber, + bool useSharps, + bool includeOctaveNumber, + int octaveNumForMiddleC); + + /** Returns the frequency of a midi note number. + + The frequencyOfA parameter is an optional frequency for 'A', normally 440-444Hz for concert pitch. + @see getMidiNoteName + */ + static double getMidiNoteInHertz (int noteNumber, const double frequencyOfA = 440.0) noexcept; + + /** Returns true if the given midi note number is a black key. */ + static bool isMidiNoteBlack (int noteNumber) noexcept; + + /** Returns the standard name of a GM instrument, or nullptr if unknown for this index. + + @param midiInstrumentNumber the program number 0 to 127 + @see getProgramChangeNumber + */ + static const char* getGMInstrumentName (int midiInstrumentNumber); + + /** Returns the name of a bank of GM instruments, or nullptr if unknown for this bank number. + @param midiBankNumber the bank, 0 to 15 + */ + static const char* getGMInstrumentBankName (int midiBankNumber); + + /** Returns the standard name of a channel 10 percussion sound, or nullptr if unknown for this note number. + @param midiNoteNumber the key number, 35 to 81 + */ + static const char* getRhythmInstrumentName (int midiNoteNumber); + + /** Returns the name of a controller type number, or nullptr if unknown for this controller number. + @see getControllerNumber + */ + static const char* getControllerName (int controllerNumber); + +private: + //============================================================================== + double timeStamp; + HeapBlock allocatedData; + int size; + + #ifndef DOXYGEN + union + { + uint8 asBytes[4]; + uint32 asInt32; + } preallocatedData; + #endif + + inline uint8* getData() noexcept { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; } + uint8* allocateSpace (int); +}; + +#endif // JUCE_MIDIMESSAGE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp new file mode 100644 index 0000000000..94a6b9bcfd --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp @@ -0,0 +1,331 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +MidiMessageSequence::MidiMessageSequence() +{ +} + +MidiMessageSequence::MidiMessageSequence (const MidiMessageSequence& other) +{ + list.addCopiesOf (other.list); + updateMatchedPairs(); +} + +MidiMessageSequence& MidiMessageSequence::operator= (const MidiMessageSequence& other) +{ + MidiMessageSequence otherCopy (other); + swapWith (otherCopy); + return *this; +} + +void MidiMessageSequence::swapWith (MidiMessageSequence& other) noexcept +{ + list.swapWith (other.list); +} + +MidiMessageSequence::~MidiMessageSequence() +{ +} + +void MidiMessageSequence::clear() +{ + list.clear(); +} + +int MidiMessageSequence::getNumEvents() const noexcept +{ + return list.size(); +} + +MidiMessageSequence::MidiEventHolder* MidiMessageSequence::getEventPointer (const int index) const noexcept +{ + return list [index]; +} + +double MidiMessageSequence::getTimeOfMatchingKeyUp (const int index) const noexcept +{ + if (const MidiEventHolder* const meh = list [index]) + if (meh->noteOffObject != nullptr) + return meh->noteOffObject->message.getTimeStamp(); + + return 0.0; +} + +int MidiMessageSequence::getIndexOfMatchingKeyUp (const int index) const noexcept +{ + if (const MidiEventHolder* const meh = list [index]) + return list.indexOf (meh->noteOffObject); + + return -1; +} + +int MidiMessageSequence::getIndexOf (MidiEventHolder* const event) const noexcept +{ + return list.indexOf (event); +} + +int MidiMessageSequence::getNextIndexAtTime (const double timeStamp) const noexcept +{ + const int numEvents = list.size(); + + int i; + for (i = 0; i < numEvents; ++i) + if (list.getUnchecked(i)->message.getTimeStamp() >= timeStamp) + break; + + return i; +} + +//============================================================================== +double MidiMessageSequence::getStartTime() const noexcept +{ + return getEventTime (0); +} + +double MidiMessageSequence::getEndTime() const noexcept +{ + return getEventTime (list.size() - 1); +} + +double MidiMessageSequence::getEventTime (const int index) const noexcept +{ + if (const MidiEventHolder* const meh = list [index]) + return meh->message.getTimeStamp(); + + return 0.0; +} + +//============================================================================== +MidiMessageSequence::MidiEventHolder* MidiMessageSequence::addEvent (const MidiMessage& newMessage, + double timeAdjustment) +{ + MidiEventHolder* const newOne = new MidiEventHolder (newMessage); + + timeAdjustment += newMessage.getTimeStamp(); + newOne->message.setTimeStamp (timeAdjustment); + + int i; + for (i = list.size(); --i >= 0;) + if (list.getUnchecked(i)->message.getTimeStamp() <= timeAdjustment) + break; + + list.insert (i + 1, newOne); + return newOne; +} + +void MidiMessageSequence::deleteEvent (const int index, + const bool deleteMatchingNoteUp) +{ + if (isPositiveAndBelow (index, list.size())) + { + if (deleteMatchingNoteUp) + deleteEvent (getIndexOfMatchingKeyUp (index), false); + + list.remove (index); + } +} + +struct MidiMessageSequenceSorter +{ + static int compareElements (const MidiMessageSequence::MidiEventHolder* const first, + const MidiMessageSequence::MidiEventHolder* const second) noexcept + { + const double diff = first->message.getTimeStamp() - second->message.getTimeStamp(); + return (diff > 0) - (diff < 0); + } +}; + +void MidiMessageSequence::addSequence (const MidiMessageSequence& other, + double timeAdjustment, + double firstAllowableTime, + double endOfAllowableDestTimes) +{ + firstAllowableTime -= timeAdjustment; + endOfAllowableDestTimes -= timeAdjustment; + + for (int i = 0; i < other.list.size(); ++i) + { + const MidiMessage& m = other.list.getUnchecked(i)->message; + const double t = m.getTimeStamp(); + + if (t >= firstAllowableTime && t < endOfAllowableDestTimes) + { + MidiEventHolder* const newOne = new MidiEventHolder (m); + newOne->message.setTimeStamp (timeAdjustment + t); + + list.add (newOne); + } + } + + sort(); +} + +//============================================================================== +void MidiMessageSequence::sort() noexcept +{ + MidiMessageSequenceSorter sorter; + list.sort (sorter, true); +} + +void MidiMessageSequence::updateMatchedPairs() noexcept +{ + for (int i = 0; i < list.size(); ++i) + { + MidiEventHolder* const meh = list.getUnchecked(i); + const MidiMessage& m1 = meh->message; + + if (m1.isNoteOn()) + { + meh->noteOffObject = nullptr; + const int note = m1.getNoteNumber(); + const int chan = m1.getChannel(); + const int len = list.size(); + + for (int j = i + 1; j < len; ++j) + { + const MidiMessage& m = list.getUnchecked(j)->message; + + if (m.getNoteNumber() == note && m.getChannel() == chan) + { + if (m.isNoteOff()) + { + meh->noteOffObject = list[j]; + break; + } + else if (m.isNoteOn()) + { + MidiEventHolder* const newEvent = new MidiEventHolder (MidiMessage::noteOff (chan, note)); + list.insert (j, newEvent); + newEvent->message.setTimeStamp (m.getTimeStamp()); + meh->noteOffObject = newEvent; + break; + } + } + } + } + } +} + +void MidiMessageSequence::addTimeToMessages (const double delta) noexcept +{ + for (int i = list.size(); --i >= 0;) + { + MidiMessage& mm = list.getUnchecked(i)->message; + mm.setTimeStamp (mm.getTimeStamp() + delta); + } +} + +//============================================================================== +void MidiMessageSequence::extractMidiChannelMessages (const int channelNumberToExtract, + MidiMessageSequence& destSequence, + const bool alsoIncludeMetaEvents) const +{ + for (int i = 0; i < list.size(); ++i) + { + const MidiMessage& mm = list.getUnchecked(i)->message; + + if (mm.isForChannel (channelNumberToExtract) || (alsoIncludeMetaEvents && mm.isMetaEvent())) + destSequence.addEvent (mm); + } +} + +void MidiMessageSequence::extractSysExMessages (MidiMessageSequence& destSequence) const +{ + for (int i = 0; i < list.size(); ++i) + { + const MidiMessage& mm = list.getUnchecked(i)->message; + + if (mm.isSysEx()) + destSequence.addEvent (mm); + } +} + +void MidiMessageSequence::deleteMidiChannelMessages (const int channelNumberToRemove) +{ + for (int i = list.size(); --i >= 0;) + if (list.getUnchecked(i)->message.isForChannel (channelNumberToRemove)) + list.remove(i); +} + +void MidiMessageSequence::deleteSysExMessages() +{ + for (int i = list.size(); --i >= 0;) + if (list.getUnchecked(i)->message.isSysEx()) + list.remove(i); +} + +//============================================================================== +void MidiMessageSequence::createControllerUpdatesForTime (const int channelNumber, + const double time, + OwnedArray& dest) +{ + bool doneProg = false; + bool donePitchWheel = false; + Array doneControllers; + doneControllers.ensureStorageAllocated (32); + + for (int i = list.size(); --i >= 0;) + { + const MidiMessage& mm = list.getUnchecked(i)->message; + + if (mm.isForChannel (channelNumber) && mm.getTimeStamp() <= time) + { + if (mm.isProgramChange()) + { + if (! doneProg) + { + dest.add (new MidiMessage (mm, 0.0)); + doneProg = true; + } + } + else if (mm.isController()) + { + if (! doneControllers.contains (mm.getControllerNumber())) + { + dest.add (new MidiMessage (mm, 0.0)); + doneControllers.add (mm.getControllerNumber()); + } + } + else if (mm.isPitchWheel()) + { + if (! donePitchWheel) + { + dest.add (new MidiMessage (mm, 0.0)); + donePitchWheel = true; + } + } + } + } +} + + +//============================================================================== +MidiMessageSequence::MidiEventHolder::MidiEventHolder (const MidiMessage& mm) + : message (mm), noteOffObject (nullptr) +{ +} + +MidiMessageSequence::MidiEventHolder::~MidiEventHolder() +{ +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h new file mode 100644 index 0000000000..b62940c2d0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h @@ -0,0 +1,265 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED +#define JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED + + +//============================================================================== +/** + A sequence of timestamped midi messages. + + This allows the sequence to be manipulated, and also to be read from and + written to a standard midi file. + + @see MidiMessage, MidiFile +*/ +class JUCE_API MidiMessageSequence +{ +public: + //============================================================================== + /** Creates an empty midi sequence object. */ + MidiMessageSequence(); + + /** Creates a copy of another sequence. */ + MidiMessageSequence (const MidiMessageSequence&); + + /** Replaces this sequence with another one. */ + MidiMessageSequence& operator= (const MidiMessageSequence&); + + /** Destructor. */ + ~MidiMessageSequence(); + + //============================================================================== + /** Structure used to hold midi events in the sequence. + + These structures act as 'handles' on the events as they are moved about in + the list, and make it quick to find the matching note-offs for note-on events. + + @see MidiMessageSequence::getEventPointer + */ + class MidiEventHolder + { + public: + //============================================================================== + /** Destructor. */ + ~MidiEventHolder(); + + /** The message itself, whose timestamp is used to specify the event's time. */ + MidiMessage message; + + /** The matching note-off event (if this is a note-on event). + + If this isn't a note-on, this pointer will be nullptr. + + Use the MidiMessageSequence::updateMatchedPairs() method to keep these + note-offs up-to-date after events have been moved around in the sequence + or deleted. + */ + MidiEventHolder* noteOffObject; + + private: + //============================================================================== + friend class MidiMessageSequence; + MidiEventHolder (const MidiMessage&); + JUCE_LEAK_DETECTOR (MidiEventHolder) + }; + + //============================================================================== + /** Clears the sequence. */ + void clear(); + + /** Returns the number of events in the sequence. */ + int getNumEvents() const noexcept; + + /** Returns a pointer to one of the events. */ + MidiEventHolder* getEventPointer (int index) const noexcept; + + /** Returns the time of the note-up that matches the note-on at this index. + If the event at this index isn't a note-on, it'll just return 0. + @see MidiMessageSequence::MidiEventHolder::noteOffObject + */ + double getTimeOfMatchingKeyUp (int index) const noexcept; + + /** Returns the index of the note-up that matches the note-on at this index. + If the event at this index isn't a note-on, it'll just return -1. + @see MidiMessageSequence::MidiEventHolder::noteOffObject + */ + int getIndexOfMatchingKeyUp (int index) const noexcept; + + /** Returns the index of an event. */ + int getIndexOf (MidiEventHolder* event) const noexcept; + + /** Returns the index of the first event on or after the given timestamp. + If the time is beyond the end of the sequence, this will return the + number of events. + */ + int getNextIndexAtTime (double timeStamp) const noexcept; + + //============================================================================== + /** Returns the timestamp of the first event in the sequence. + @see getEndTime + */ + double getStartTime() const noexcept; + + /** Returns the timestamp of the last event in the sequence. + @see getStartTime + */ + double getEndTime() const noexcept; + + /** Returns the timestamp of the event at a given index. + If the index is out-of-range, this will return 0.0 + */ + double getEventTime (int index) const noexcept; + + //============================================================================== + /** Inserts a midi message into the sequence. + + The index at which the new message gets inserted will depend on its timestamp, + because the sequence is kept sorted. + + Remember to call updateMatchedPairs() after adding note-on events. + + @param newMessage the new message to add (an internal copy will be made) + @param timeAdjustment an optional value to add to the timestamp of the message + that will be inserted + @see updateMatchedPairs + */ + MidiEventHolder* addEvent (const MidiMessage& newMessage, + double timeAdjustment = 0); + + /** Deletes one of the events in the sequence. + + Remember to call updateMatchedPairs() after removing events. + + @param index the index of the event to delete + @param deleteMatchingNoteUp whether to also remove the matching note-off + if the event you're removing is a note-on + */ + void deleteEvent (int index, bool deleteMatchingNoteUp); + + /** Merges another sequence into this one. + + Remember to call updateMatchedPairs() after using this method. + + @param other the sequence to add from + @param timeAdjustmentDelta an amount to add to the timestamps of the midi events + as they are read from the other sequence + @param firstAllowableDestTime events will not be added if their time is earlier + than this time. (This is after their time has been adjusted + by the timeAdjustmentDelta) + @param endOfAllowableDestTimes events will not be added if their time is equal to + or greater than this time. (This is after their time has + been adjusted by the timeAdjustmentDelta) + */ + void addSequence (const MidiMessageSequence& other, + double timeAdjustmentDelta, + double firstAllowableDestTime, + double endOfAllowableDestTimes); + + //============================================================================== + /** Makes sure all the note-on and note-off pairs are up-to-date. + + Call this after re-ordering messages or deleting/adding messages, and it + will scan the list and make sure all the note-offs in the MidiEventHolder + structures are pointing at the correct ones. + */ + void updateMatchedPairs() noexcept; + + /** Forces a sort of the sequence. + You may need to call this if you've manually modified the timestamps of some + events such that the overall order now needs updating. + */ + void sort() noexcept; + + //============================================================================== + /** Copies all the messages for a particular midi channel to another sequence. + + @param channelNumberToExtract the midi channel to look for, in the range 1 to 16 + @param destSequence the sequence that the chosen events should be copied to + @param alsoIncludeMetaEvents if true, any meta-events (which don't apply to a specific + channel) will also be copied across. + @see extractSysExMessages + */ + void extractMidiChannelMessages (int channelNumberToExtract, + MidiMessageSequence& destSequence, + bool alsoIncludeMetaEvents) const; + + /** Copies all midi sys-ex messages to another sequence. + @param destSequence this is the sequence to which any sys-exes in this sequence + will be added + @see extractMidiChannelMessages + */ + void extractSysExMessages (MidiMessageSequence& destSequence) const; + + /** Removes any messages in this sequence that have a specific midi channel. + @param channelNumberToRemove the midi channel to look for, in the range 1 to 16 + */ + void deleteMidiChannelMessages (int channelNumberToRemove); + + /** Removes any sys-ex messages from this sequence. */ + void deleteSysExMessages(); + + /** Adds an offset to the timestamps of all events in the sequence. + @param deltaTime the amount to add to each timestamp. + */ + void addTimeToMessages (double deltaTime) noexcept; + + //============================================================================== + /** Scans through the sequence to determine the state of any midi controllers at + a given time. + + This will create a sequence of midi controller changes that can be + used to set all midi controllers to the state they would be in at the + specified time within this sequence. + + As well as controllers, it will also recreate the midi program number + and pitch bend position. + + @param channelNumber the midi channel to look for, in the range 1 to 16. Controllers + for other channels will be ignored. + @param time the time at which you want to find out the state - there are + no explicit units for this time measurement, it's the same units + as used for the timestamps of the messages + @param resultMessages an array to which midi controller-change messages will be added. This + will be the minimum number of controller changes to recreate the + state at the required time. + */ + void createControllerUpdatesForTime (int channelNumber, double time, + OwnedArray& resultMessages); + + //============================================================================== + /** Swaps this sequence with another one. */ + void swapWith (MidiMessageSequence&) noexcept; + +private: + //============================================================================== + friend class MidiFile; + OwnedArray list; + + JUCE_LEAK_DETECTOR (MidiMessageSequence) +}; + + +#endif // JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h new file mode 100644 index 0000000000..cfbd59fe98 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h @@ -0,0 +1,181 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOSOURCE_H_INCLUDED +#define JUCE_AUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + Used by AudioSource::getNextAudioBlock(). +*/ +struct JUCE_API AudioSourceChannelInfo +{ + /** Creates an uninitialised AudioSourceChannelInfo. */ + AudioSourceChannelInfo() noexcept + { + } + + /** Creates an AudioSourceChannelInfo. */ + AudioSourceChannelInfo (AudioSampleBuffer* bufferToUse, + int startSampleOffset, int numSamplesToUse) noexcept + : buffer (bufferToUse), + startSample (startSampleOffset), + numSamples (numSamplesToUse) + { + } + + /** Creates an AudioSourceChannelInfo that uses the whole of a buffer. + Note that the buffer provided must not be deleted while the + AudioSourceChannelInfo is still using it. + */ + explicit AudioSourceChannelInfo (AudioSampleBuffer& bufferToUse) noexcept + : buffer (&bufferToUse), + startSample (0), + numSamples (bufferToUse.getNumSamples()) + { + } + + /** The destination buffer to fill with audio data. + + When the AudioSource::getNextAudioBlock() method is called, the active section + of this buffer should be filled with whatever output the source produces. + + Only the samples specified by the startSample and numSamples members of this structure + should be affected by the call. + + The contents of the buffer when it is passed to the AudioSource::getNextAudioBlock() + method can be treated as the input if the source is performing some kind of filter operation, + but should be cleared if this is not the case - the clearActiveBufferRegion() is + a handy way of doing this. + + The number of channels in the buffer could be anything, so the AudioSource + must cope with this in whatever way is appropriate for its function. + */ + AudioSampleBuffer* buffer; + + /** The first sample in the buffer from which the callback is expected + to write data. */ + int startSample; + + /** The number of samples in the buffer which the callback is expected to + fill with data. */ + int numSamples; + + /** Convenient method to clear the buffer if the source is not producing any data. */ + void clearActiveBufferRegion() const + { + if (buffer != nullptr) + buffer->clear (startSample, numSamples); + } +}; + + +//============================================================================== +/** + Base class for objects that can produce a continuous stream of audio. + + An AudioSource has two states: 'prepared' and 'unprepared'. + + When a source needs to be played, it is first put into a 'prepared' state by a call to + prepareToPlay(), and then repeated calls will be made to its getNextAudioBlock() method to + process the audio data. + + Once playback has finished, the releaseResources() method is called to put the stream + back into an 'unprepared' state. + + @see AudioFormatReaderSource, ResamplingAudioSource +*/ +class JUCE_API AudioSource +{ +protected: + //============================================================================== + /** Creates an AudioSource. */ + AudioSource() noexcept {} + +public: + /** Destructor. */ + virtual ~AudioSource() {} + + //============================================================================== + /** Tells the source to prepare for playing. + + An AudioSource has two states: prepared and unprepared. + + The prepareToPlay() method is guaranteed to be called at least once on an 'unpreprared' + source to put it into a 'prepared' state before any calls will be made to getNextAudioBlock(). + This callback allows the source to initialise any resources it might need when playing. + + Once playback has finished, the releaseResources() method is called to put the stream + back into an 'unprepared' state. + + Note that this method could be called more than once in succession without + a matching call to releaseResources(), so make sure your code is robust and + can handle that kind of situation. + + @param samplesPerBlockExpected the number of samples that the source + will be expected to supply each time its + getNextAudioBlock() method is called. This + number may vary slightly, because it will be dependent + on audio hardware callbacks, and these aren't + guaranteed to always use a constant block size, so + the source should be able to cope with small variations. + @param sampleRate the sample rate that the output will be used at - this + is needed by sources such as tone generators. + @see releaseResources, getNextAudioBlock + */ + virtual void prepareToPlay (int samplesPerBlockExpected, + double sampleRate) = 0; + + /** Allows the source to release anything it no longer needs after playback has stopped. + + This will be called when the source is no longer going to have its getNextAudioBlock() + method called, so it should release any spare memory, etc. that it might have + allocated during the prepareToPlay() call. + + Note that there's no guarantee that prepareToPlay() will actually have been called before + releaseResources(), and it may be called more than once in succession, so make sure your + code is robust and doesn't make any assumptions about when it will be called. + + @see prepareToPlay, getNextAudioBlock + */ + virtual void releaseResources() = 0; + + /** Called repeatedly to fetch subsequent blocks of audio data. + + After calling the prepareToPlay() method, this callback will be made each + time the audio playback hardware (or whatever other destination the audio + data is going to) needs another block of data. + + It will generally be called on a high-priority system thread, or possibly even + an interrupt, so be careful not to do too much work here, as that will cause + audio glitches! + + @see AudioSourceChannelInfo, prepareToPlay, releaseResources + */ + virtual void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) = 0; +}; + + +#endif // JUCE_AUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp new file mode 100644 index 0000000000..21dc173a60 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp @@ -0,0 +1,259 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* s, + TimeSliceThread& thread, + const bool deleteSourceWhenDeleted, + const int bufferSizeSamples, + const int numChannels) + : source (s, deleteSourceWhenDeleted), + backgroundThread (thread), + numberOfSamplesToBuffer (jmax (1024, bufferSizeSamples)), + numberOfChannels (numChannels), + bufferValidStart (0), + bufferValidEnd (0), + nextPlayPos (0), + sampleRate (0), + wasSourceLooping (false), + isPrepared (false) +{ + jassert (source != nullptr); + + jassert (numberOfSamplesToBuffer > 1024); // not much point using this class if you're + // not using a larger buffer.. +} + +BufferingAudioSource::~BufferingAudioSource() +{ + releaseResources(); +} + +//============================================================================== +void BufferingAudioSource::prepareToPlay (int samplesPerBlockExpected, double newSampleRate) +{ + const int bufferSizeNeeded = jmax (samplesPerBlockExpected * 2, numberOfSamplesToBuffer); + + if (newSampleRate != sampleRate + || bufferSizeNeeded != buffer.getNumSamples() + || ! isPrepared) + { + backgroundThread.removeTimeSliceClient (this); + + isPrepared = true; + sampleRate = newSampleRate; + + source->prepareToPlay (samplesPerBlockExpected, newSampleRate); + + buffer.setSize (numberOfChannels, bufferSizeNeeded); + buffer.clear(); + + bufferValidStart = 0; + bufferValidEnd = 0; + + backgroundThread.addTimeSliceClient (this); + + while (bufferValidEnd - bufferValidStart < jmin (((int) newSampleRate) / 4, + buffer.getNumSamples() / 2)) + { + backgroundThread.moveToFrontOfQueue (this); + Thread::sleep (5); + } + } +} + +void BufferingAudioSource::releaseResources() +{ + isPrepared = false; + backgroundThread.removeTimeSliceClient (this); + + buffer.setSize (numberOfChannels, 0); + source->releaseResources(); +} + +void BufferingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) +{ + const ScopedLock sl (bufferStartPosLock); + + const int validStart = (int) (jlimit (bufferValidStart, bufferValidEnd, nextPlayPos) - nextPlayPos); + const int validEnd = (int) (jlimit (bufferValidStart, bufferValidEnd, nextPlayPos + info.numSamples) - nextPlayPos); + + if (validStart == validEnd) + { + // total cache miss + info.clearActiveBufferRegion(); + } + else + { + if (validStart > 0) + info.buffer->clear (info.startSample, validStart); // partial cache miss at start + + if (validEnd < info.numSamples) + info.buffer->clear (info.startSample + validEnd, + info.numSamples - validEnd); // partial cache miss at end + + if (validStart < validEnd) + { + for (int chan = jmin (numberOfChannels, info.buffer->getNumChannels()); --chan >= 0;) + { + jassert (buffer.getNumSamples() > 0); + const int startBufferIndex = (int) ((validStart + nextPlayPos) % buffer.getNumSamples()); + const int endBufferIndex = (int) ((validEnd + nextPlayPos) % buffer.getNumSamples()); + + if (startBufferIndex < endBufferIndex) + { + info.buffer->copyFrom (chan, info.startSample + validStart, + buffer, + chan, startBufferIndex, + validEnd - validStart); + } + else + { + const int initialSize = buffer.getNumSamples() - startBufferIndex; + + info.buffer->copyFrom (chan, info.startSample + validStart, + buffer, + chan, startBufferIndex, + initialSize); + + info.buffer->copyFrom (chan, info.startSample + validStart + initialSize, + buffer, + chan, 0, + (validEnd - validStart) - initialSize); + } + } + } + + nextPlayPos += info.numSamples; + } +} + +int64 BufferingAudioSource::getNextReadPosition() const +{ + jassert (source->getTotalLength() > 0); + return (source->isLooping() && nextPlayPos > 0) + ? nextPlayPos % source->getTotalLength() + : nextPlayPos; +} + +void BufferingAudioSource::setNextReadPosition (int64 newPosition) +{ + const ScopedLock sl (bufferStartPosLock); + + nextPlayPos = newPosition; + backgroundThread.moveToFrontOfQueue (this); +} + +bool BufferingAudioSource::readNextBufferChunk() +{ + int64 newBVS, newBVE, sectionToReadStart, sectionToReadEnd; + + { + const ScopedLock sl (bufferStartPosLock); + + if (wasSourceLooping != isLooping()) + { + wasSourceLooping = isLooping(); + bufferValidStart = 0; + bufferValidEnd = 0; + } + + newBVS = jmax ((int64) 0, nextPlayPos); + newBVE = newBVS + buffer.getNumSamples() - 4; + sectionToReadStart = 0; + sectionToReadEnd = 0; + + const int maxChunkSize = 2048; + + if (newBVS < bufferValidStart || newBVS >= bufferValidEnd) + { + newBVE = jmin (newBVE, newBVS + maxChunkSize); + + sectionToReadStart = newBVS; + sectionToReadEnd = newBVE; + + bufferValidStart = 0; + bufferValidEnd = 0; + } + else if (std::abs ((int) (newBVS - bufferValidStart)) > 512 + || std::abs ((int) (newBVE - bufferValidEnd)) > 512) + { + newBVE = jmin (newBVE, bufferValidEnd + maxChunkSize); + + sectionToReadStart = bufferValidEnd; + sectionToReadEnd = newBVE; + + bufferValidStart = newBVS; + bufferValidEnd = jmin (bufferValidEnd, newBVE); + } + } + + if (sectionToReadStart == sectionToReadEnd) + return false; + + jassert (buffer.getNumSamples() > 0); + const int bufferIndexStart = (int) (sectionToReadStart % buffer.getNumSamples()); + const int bufferIndexEnd = (int) (sectionToReadEnd % buffer.getNumSamples()); + + if (bufferIndexStart < bufferIndexEnd) + { + readBufferSection (sectionToReadStart, + (int) (sectionToReadEnd - sectionToReadStart), + bufferIndexStart); + } + else + { + const int initialSize = buffer.getNumSamples() - bufferIndexStart; + + readBufferSection (sectionToReadStart, + initialSize, + bufferIndexStart); + + readBufferSection (sectionToReadStart + initialSize, + (int) (sectionToReadEnd - sectionToReadStart) - initialSize, + 0); + } + + { + const ScopedLock sl2 (bufferStartPosLock); + + bufferValidStart = newBVS; + bufferValidEnd = newBVE; + } + + return true; +} + +void BufferingAudioSource::readBufferSection (const int64 start, const int length, const int bufferOffset) +{ + if (source->getNextReadPosition() != start) + source->setNextReadPosition (start); + + AudioSourceChannelInfo info (&buffer, bufferOffset, length); + source->getNextAudioBlock (info); +} + +int BufferingAudioSource::useTimeSlice() +{ + return readNextBufferChunk() ? 1 : 100; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h new file mode 100644 index 0000000000..b0ab4d2f75 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h @@ -0,0 +1,111 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED +#define JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + An AudioSource which takes another source as input, and buffers it using a thread. + + Create this as a wrapper around another thread, and it will read-ahead with + a background thread to smooth out playback. You can either create one of these + directly, or use it indirectly using an AudioTransportSource. + + @see PositionableAudioSource, AudioTransportSource +*/ +class JUCE_API BufferingAudioSource : public PositionableAudioSource, + private TimeSliceClient +{ +public: + //============================================================================== + /** Creates a BufferingAudioSource. + + @param source the input source to read from + @param backgroundThread a background thread that will be used for the + background read-ahead. This object must not be deleted + until after any BufferedAudioSources that are using it + have been deleted! + @param deleteSourceWhenDeleted if true, then the input source object will + be deleted when this object is deleted + @param numberOfSamplesToBuffer the size of buffer to use for reading ahead + @param numberOfChannels the number of channels that will be played + */ + BufferingAudioSource (PositionableAudioSource* source, + TimeSliceThread& backgroundThread, + bool deleteSourceWhenDeleted, + int numberOfSamplesToBuffer, + int numberOfChannels = 2); + + /** Destructor. + + The input source may be deleted depending on whether the deleteSourceWhenDeleted + flag was set in the constructor. + */ + ~BufferingAudioSource(); + + //============================================================================== + /** Implementation of the AudioSource method. */ + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + + /** Implementation of the AudioSource method. */ + void releaseResources() override; + + /** Implementation of the AudioSource method. */ + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + + //============================================================================== + /** Implements the PositionableAudioSource method. */ + void setNextReadPosition (int64 newPosition) override; + + /** Implements the PositionableAudioSource method. */ + int64 getNextReadPosition() const override; + + /** Implements the PositionableAudioSource method. */ + int64 getTotalLength() const override { return source->getTotalLength(); } + + /** Implements the PositionableAudioSource method. */ + bool isLooping() const override { return source->isLooping(); } + +private: + //============================================================================== + OptionalScopedPointer source; + TimeSliceThread& backgroundThread; + int numberOfSamplesToBuffer, numberOfChannels; + AudioSampleBuffer buffer; + CriticalSection bufferStartPosLock; + int64 volatile bufferValidStart, bufferValidEnd, nextPlayPos; + double volatile sampleRate; + bool wasSourceLooping, isPrepared; + + bool readNextBufferChunk(); + void readBufferSection (int64 start, int length, int bufferOffset); + int useTimeSlice() override; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferingAudioSource) +}; + + +#endif // JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp new file mode 100644 index 0000000000..7e0a58cb46 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp @@ -0,0 +1,184 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, + const bool deleteSourceWhenDeleted) + : source (source_, deleteSourceWhenDeleted), + requiredNumberOfChannels (2) +{ + remappedInfo.buffer = &buffer; + remappedInfo.startSample = 0; +} + +ChannelRemappingAudioSource::~ChannelRemappingAudioSource() {} + +//============================================================================== +void ChannelRemappingAudioSource::setNumberOfChannelsToProduce (const int requiredNumberOfChannels_) +{ + const ScopedLock sl (lock); + requiredNumberOfChannels = requiredNumberOfChannels_; +} + +void ChannelRemappingAudioSource::clearAllMappings() +{ + const ScopedLock sl (lock); + + remappedInputs.clear(); + remappedOutputs.clear(); +} + +void ChannelRemappingAudioSource::setInputChannelMapping (const int destIndex, const int sourceIndex) +{ + const ScopedLock sl (lock); + + while (remappedInputs.size() < destIndex) + remappedInputs.add (-1); + + remappedInputs.set (destIndex, sourceIndex); +} + +void ChannelRemappingAudioSource::setOutputChannelMapping (const int sourceIndex, const int destIndex) +{ + const ScopedLock sl (lock); + + while (remappedOutputs.size() < sourceIndex) + remappedOutputs.add (-1); + + remappedOutputs.set (sourceIndex, destIndex); +} + +int ChannelRemappingAudioSource::getRemappedInputChannel (const int inputChannelIndex) const +{ + const ScopedLock sl (lock); + + if (inputChannelIndex >= 0 && inputChannelIndex < remappedInputs.size()) + return remappedInputs.getUnchecked (inputChannelIndex); + + return -1; +} + +int ChannelRemappingAudioSource::getRemappedOutputChannel (const int outputChannelIndex) const +{ + const ScopedLock sl (lock); + + if (outputChannelIndex >= 0 && outputChannelIndex < remappedOutputs.size()) + return remappedOutputs .getUnchecked (outputChannelIndex); + + return -1; +} + +//============================================================================== +void ChannelRemappingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) +{ + source->prepareToPlay (samplesPerBlockExpected, sampleRate); +} + +void ChannelRemappingAudioSource::releaseResources() +{ + source->releaseResources(); +} + +void ChannelRemappingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) +{ + const ScopedLock sl (lock); + + buffer.setSize (requiredNumberOfChannels, bufferToFill.numSamples, false, false, true); + + const int numChans = bufferToFill.buffer->getNumChannels(); + + for (int i = 0; i < buffer.getNumChannels(); ++i) + { + const int remappedChan = getRemappedInputChannel (i); + + if (remappedChan >= 0 && remappedChan < numChans) + { + buffer.copyFrom (i, 0, *bufferToFill.buffer, + remappedChan, + bufferToFill.startSample, + bufferToFill.numSamples); + } + else + { + buffer.clear (i, 0, bufferToFill.numSamples); + } + } + + remappedInfo.numSamples = bufferToFill.numSamples; + + source->getNextAudioBlock (remappedInfo); + + bufferToFill.clearActiveBufferRegion(); + + for (int i = 0; i < requiredNumberOfChannels; ++i) + { + const int remappedChan = getRemappedOutputChannel (i); + + if (remappedChan >= 0 && remappedChan < numChans) + { + bufferToFill.buffer->addFrom (remappedChan, bufferToFill.startSample, + buffer, i, 0, bufferToFill.numSamples); + + } + } +} + +//============================================================================== +XmlElement* ChannelRemappingAudioSource::createXml() const +{ + XmlElement* e = new XmlElement ("MAPPINGS"); + String ins, outs; + + const ScopedLock sl (lock); + + for (int i = 0; i < remappedInputs.size(); ++i) + ins << remappedInputs.getUnchecked(i) << ' '; + + for (int i = 0; i < remappedOutputs.size(); ++i) + outs << remappedOutputs.getUnchecked(i) << ' '; + + e->setAttribute ("inputs", ins.trimEnd()); + e->setAttribute ("outputs", outs.trimEnd()); + + return e; +} + +void ChannelRemappingAudioSource::restoreFromXml (const XmlElement& e) +{ + if (e.hasTagName ("MAPPINGS")) + { + const ScopedLock sl (lock); + + clearAllMappings(); + + StringArray ins, outs; + ins.addTokens (e.getStringAttribute ("inputs"), false); + outs.addTokens (e.getStringAttribute ("outputs"), false); + + for (int i = 0; i < ins.size(); ++i) + remappedInputs.add (ins[i].getIntValue()); + + for (int i = 0; i < outs.size(); ++i) + remappedOutputs.add (outs[i].getIntValue()); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h new file mode 100644 index 0000000000..483fe99deb --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h @@ -0,0 +1,143 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED +#define JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + An AudioSource that takes the audio from another source, and re-maps its + input and output channels to a different arrangement. + + You can use this to increase or decrease the number of channels that an + audio source uses, or to re-order those channels. + + Call the reset() method before using it to set up a default mapping, and then + the setInputChannelMapping() and setOutputChannelMapping() methods to + create an appropriate mapping, otherwise no channels will be connected and + it'll produce silence. + + @see AudioSource +*/ +class ChannelRemappingAudioSource : public AudioSource +{ +public: + //============================================================================== + /** Creates a remapping source that will pass on audio from the given input. + + @param source the input source to use. Make sure that this doesn't + get deleted before the ChannelRemappingAudioSource object + @param deleteSourceWhenDeleted if true, the input source will be deleted + when this object is deleted, if false, the caller is + responsible for its deletion + */ + ChannelRemappingAudioSource (AudioSource* source, + bool deleteSourceWhenDeleted); + + /** Destructor. */ + ~ChannelRemappingAudioSource(); + + //============================================================================== + /** Specifies a number of channels that this audio source must produce from its + getNextAudioBlock() callback. + */ + void setNumberOfChannelsToProduce (int requiredNumberOfChannels); + + /** Clears any mapped channels. + + After this, no channels are mapped, so this object will produce silence. Create + some mappings with setInputChannelMapping() and setOutputChannelMapping(). + */ + void clearAllMappings(); + + /** Creates an input channel mapping. + + When the getNextAudioBlock() method is called, the data in channel sourceChannelIndex of the incoming + data will be sent to destChannelIndex of our input source. + + @param destChannelIndex the index of an input channel in our input audio source (i.e. the + source specified when this object was created). + @param sourceChannelIndex the index of the input channel in the incoming audio data buffer + during our getNextAudioBlock() callback + */ + void setInputChannelMapping (int destChannelIndex, + int sourceChannelIndex); + + /** Creates an output channel mapping. + + When the getNextAudioBlock() method is called, the data returned in channel sourceChannelIndex by + our input audio source will be copied to channel destChannelIndex of the final buffer. + + @param sourceChannelIndex the index of an output channel coming from our input audio source + (i.e. the source specified when this object was created). + @param destChannelIndex the index of the output channel in the incoming audio data buffer + during our getNextAudioBlock() callback + */ + void setOutputChannelMapping (int sourceChannelIndex, + int destChannelIndex); + + /** Returns the channel from our input that will be sent to channel inputChannelIndex of + our input audio source. + */ + int getRemappedInputChannel (int inputChannelIndex) const; + + /** Returns the output channel to which channel outputChannelIndex of our input audio + source will be sent to. + */ + int getRemappedOutputChannel (int outputChannelIndex) const; + + + //============================================================================== + /** Returns an XML object to encapsulate the state of the mappings. + @see restoreFromXml + */ + XmlElement* createXml() const; + + /** Restores the mappings from an XML object created by createXML(). + @see createXml + */ + void restoreFromXml (const XmlElement&); + + //============================================================================== + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + void releaseResources() override; + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + + +private: + //============================================================================== + OptionalScopedPointer source; + Array remappedInputs, remappedOutputs; + int requiredNumberOfChannels; + + AudioSampleBuffer buffer; + AudioSourceChannelInfo remappedInfo; + CriticalSection lock; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelRemappingAudioSource) +}; + + +#endif // JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp new file mode 100644 index 0000000000..08e87f0c1d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp @@ -0,0 +1,77 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, + const bool deleteInputWhenDeleted) + : input (inputSource, deleteInputWhenDeleted) +{ + jassert (inputSource != nullptr); + + for (int i = 2; --i >= 0;) + iirFilters.add (new IIRFilter()); +} + +IIRFilterAudioSource::~IIRFilterAudioSource() {} + +//============================================================================== +void IIRFilterAudioSource::setCoefficients (const IIRCoefficients& newCoefficients) +{ + for (int i = iirFilters.size(); --i >= 0;) + iirFilters.getUnchecked(i)->setCoefficients (newCoefficients); +} + +void IIRFilterAudioSource::makeInactive() +{ + for (int i = iirFilters.size(); --i >= 0;) + iirFilters.getUnchecked(i)->makeInactive(); +} + +//============================================================================== +void IIRFilterAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) +{ + input->prepareToPlay (samplesPerBlockExpected, sampleRate); + + for (int i = iirFilters.size(); --i >= 0;) + iirFilters.getUnchecked(i)->reset(); +} + +void IIRFilterAudioSource::releaseResources() +{ + input->releaseResources(); +} + +void IIRFilterAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) +{ + input->getNextAudioBlock (bufferToFill); + + const int numChannels = bufferToFill.buffer->getNumChannels(); + + while (numChannels > iirFilters.size()) + iirFilters.add (new IIRFilter (*iirFilters.getUnchecked (0))); + + for (int i = 0; i < numChannels; ++i) + iirFilters.getUnchecked(i) + ->processSamples (bufferToFill.buffer->getWritePointer (i, bufferToFill.startSample), + bufferToFill.numSamples); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h new file mode 100644 index 0000000000..40844c568d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h @@ -0,0 +1,70 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED +#define JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + An AudioSource that performs an IIR filter on another source. +*/ +class JUCE_API IIRFilterAudioSource : public AudioSource +{ +public: + //============================================================================== + /** Creates a IIRFilterAudioSource for a given input source. + + @param inputSource the input source to read from - this must not be null + @param deleteInputWhenDeleted if true, the input source will be deleted when + this object is deleted + */ + IIRFilterAudioSource (AudioSource* inputSource, + bool deleteInputWhenDeleted); + + /** Destructor. */ + ~IIRFilterAudioSource(); + + //============================================================================== + /** Changes the filter to use the same parameters as the one being passed in. */ + void setCoefficients (const IIRCoefficients& newCoefficients); + + /** Calls IIRFilter::makeInactive() on all the filters being used internally. */ + void makeInactive(); + + //============================================================================== + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + void releaseResources() override; + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + +private: + //============================================================================== + OptionalScopedPointer input; + OwnedArray iirFilters; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource) +}; + + +#endif // JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp new file mode 100644 index 0000000000..60ae1919fe --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp @@ -0,0 +1,155 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +MixerAudioSource::MixerAudioSource() + : currentSampleRate (0.0), bufferSizeExpected (0) +{ +} + +MixerAudioSource::~MixerAudioSource() +{ + removeAllInputs(); +} + +//============================================================================== +void MixerAudioSource::addInputSource (AudioSource* input, const bool deleteWhenRemoved) +{ + if (input != nullptr && ! inputs.contains (input)) + { + double localRate; + int localBufferSize; + + { + const ScopedLock sl (lock); + localRate = currentSampleRate; + localBufferSize = bufferSizeExpected; + } + + if (localRate > 0.0) + input->prepareToPlay (localBufferSize, localRate); + + const ScopedLock sl (lock); + + inputsToDelete.setBit (inputs.size(), deleteWhenRemoved); + inputs.add (input); + } +} + +void MixerAudioSource::removeInputSource (AudioSource* const input) +{ + if (input != nullptr) + { + ScopedPointer toDelete; + + { + const ScopedLock sl (lock); + const int index = inputs.indexOf (input); + + if (index < 0) + return; + + if (inputsToDelete [index]) + toDelete = input; + + inputsToDelete.shiftBits (-1, index); + inputs.remove (index); + } + + input->releaseResources(); + } +} + +void MixerAudioSource::removeAllInputs() +{ + OwnedArray toDelete; + + { + const ScopedLock sl (lock); + + for (int i = inputs.size(); --i >= 0;) + if (inputsToDelete[i]) + toDelete.add (inputs.getUnchecked(i)); + + inputs.clear(); + } + + for (int i = toDelete.size(); --i >= 0;) + toDelete.getUnchecked(i)->releaseResources(); +} + +void MixerAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) +{ + tempBuffer.setSize (2, samplesPerBlockExpected); + + const ScopedLock sl (lock); + + currentSampleRate = sampleRate; + bufferSizeExpected = samplesPerBlockExpected; + + for (int i = inputs.size(); --i >= 0;) + inputs.getUnchecked(i)->prepareToPlay (samplesPerBlockExpected, sampleRate); +} + +void MixerAudioSource::releaseResources() +{ + const ScopedLock sl (lock); + + for (int i = inputs.size(); --i >= 0;) + inputs.getUnchecked(i)->releaseResources(); + + tempBuffer.setSize (2, 0); + + currentSampleRate = 0; + bufferSizeExpected = 0; +} + +void MixerAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) +{ + const ScopedLock sl (lock); + + if (inputs.size() > 0) + { + inputs.getUnchecked(0)->getNextAudioBlock (info); + + if (inputs.size() > 1) + { + tempBuffer.setSize (jmax (1, info.buffer->getNumChannels()), + info.buffer->getNumSamples()); + + AudioSourceChannelInfo info2 (&tempBuffer, 0, info.numSamples); + + for (int i = 1; i < inputs.size(); ++i) + { + inputs.getUnchecked(i)->getNextAudioBlock (info2); + + for (int chan = 0; chan < info.buffer->getNumChannels(); ++chan) + info.buffer->addFrom (chan, info.startSample, tempBuffer, chan, 0, info.numSamples); + } + } + } + else + { + info.clearActiveBufferRegion(); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h new file mode 100644 index 0000000000..f581ac31e1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h @@ -0,0 +1,101 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIXERAUDIOSOURCE_H_INCLUDED +#define JUCE_MIXERAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + An AudioSource that mixes together the output of a set of other AudioSources. + + Input sources can be added and removed while the mixer is running as long as their + prepareToPlay() and releaseResources() methods are called before and after adding + them to the mixer. +*/ +class JUCE_API MixerAudioSource : public AudioSource +{ +public: + //============================================================================== + /** Creates a MixerAudioSource. */ + MixerAudioSource(); + + /** Destructor. */ + ~MixerAudioSource(); + + //============================================================================== + /** Adds an input source to the mixer. + + If the mixer is running you'll need to make sure that the input source + is ready to play by calling its prepareToPlay() method before adding it. + If the mixer is stopped, then its input sources will be automatically + prepared when the mixer's prepareToPlay() method is called. + + @param newInput the source to add to the mixer + @param deleteWhenRemoved if true, then this source will be deleted when + no longer needed by the mixer. + */ + void addInputSource (AudioSource* newInput, bool deleteWhenRemoved); + + /** Removes an input source. + If the source was added by calling addInputSource() with the deleteWhenRemoved + flag set, it will be deleted by this method. + */ + void removeInputSource (AudioSource* input); + + /** Removes all the input sources. + Any sources which were added by calling addInputSource() with the deleteWhenRemoved + flag set will be deleted by this method. + */ + void removeAllInputs(); + + //============================================================================== + /** Implementation of the AudioSource method. + This will call prepareToPlay() on all its input sources. + */ + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + + /** Implementation of the AudioSource method. + This will call releaseResources() on all its input sources. + */ + void releaseResources() override; + + /** Implementation of the AudioSource method. */ + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + + +private: + //============================================================================== + Array inputs; + BigInteger inputsToDelete; + CriticalSection lock; + AudioSampleBuffer tempBuffer; + double currentSampleRate; + int bufferSizeExpected; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MixerAudioSource) +}; + + +#endif // JUCE_MIXERAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h new file mode 100644 index 0000000000..2213722bd7 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED +#define JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + A type of AudioSource which can be repositioned. + + The basic AudioSource just streams continuously with no idea of a current + time or length, so the PositionableAudioSource is used for a finite stream + that has a current read position. + + @see AudioSource, AudioTransportSource +*/ +class JUCE_API PositionableAudioSource : public AudioSource +{ +protected: + //============================================================================== + /** Creates the PositionableAudioSource. */ + PositionableAudioSource() noexcept {} + +public: + /** Destructor */ + ~PositionableAudioSource() {} + + //============================================================================== + /** Tells the stream to move to a new position. + + Calling this indicates that the next call to AudioSource::getNextAudioBlock() + should return samples from this position. + + Note that this may be called on a different thread to getNextAudioBlock(), + so the subclass should make sure it's synchronised. + */ + virtual void setNextReadPosition (int64 newPosition) = 0; + + /** Returns the position from which the next block will be returned. + + @see setNextReadPosition + */ + virtual int64 getNextReadPosition() const = 0; + + /** Returns the total length of the stream (in samples). */ + virtual int64 getTotalLength() const = 0; + + /** Returns true if this source is actually playing in a loop. */ + virtual bool isLooping() const = 0; + + /** Tells the source whether you'd like it to play in a loop. */ + virtual void setLooping (bool shouldLoop) { (void) shouldLoop; } +}; + + +#endif // JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp new file mode 100644 index 0000000000..6a0704e0f1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp @@ -0,0 +1,261 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, + const bool deleteInputWhenDeleted, + const int numChannels_) + : input (inputSource, deleteInputWhenDeleted), + ratio (1.0), + lastRatio (1.0), + bufferPos (0), + sampsInBuffer (0), + subSampleOffset (0), + numChannels (numChannels_) +{ + jassert (input != nullptr); + zeromem (coefficients, sizeof (coefficients)); +} + +ResamplingAudioSource::~ResamplingAudioSource() {} + +void ResamplingAudioSource::setResamplingRatio (const double samplesInPerOutputSample) +{ + jassert (samplesInPerOutputSample > 0); + + const SpinLock::ScopedLockType sl (ratioLock); + ratio = jmax (0.0, samplesInPerOutputSample); +} + +void ResamplingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) +{ + const SpinLock::ScopedLockType sl (ratioLock); + + input->prepareToPlay (samplesPerBlockExpected, sampleRate); + + buffer.setSize (numChannels, roundToInt (samplesPerBlockExpected * ratio) + 32); + + filterStates.calloc ((size_t) numChannels); + srcBuffers.calloc ((size_t) numChannels); + destBuffers.calloc ((size_t) numChannels); + createLowPass (ratio); + + flushBuffers(); +} + +void ResamplingAudioSource::flushBuffers() +{ + buffer.clear(); + bufferPos = 0; + sampsInBuffer = 0; + subSampleOffset = 0.0; + resetFilters(); +} + +void ResamplingAudioSource::releaseResources() +{ + input->releaseResources(); + buffer.setSize (numChannels, 0); +} + +void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) +{ + double localRatio; + + { + const SpinLock::ScopedLockType sl (ratioLock); + localRatio = ratio; + } + + if (lastRatio != localRatio) + { + createLowPass (localRatio); + lastRatio = localRatio; + } + + const int sampsNeeded = roundToInt (info.numSamples * localRatio) + 2; + + int bufferSize = buffer.getNumSamples(); + + if (bufferSize < sampsNeeded + 8) + { + bufferPos %= bufferSize; + bufferSize = sampsNeeded + 32; + buffer.setSize (buffer.getNumChannels(), bufferSize, true, true); + } + + bufferPos %= bufferSize; + + int endOfBufferPos = bufferPos + sampsInBuffer; + const int channelsToProcess = jmin (numChannels, info.buffer->getNumChannels()); + + while (sampsNeeded > sampsInBuffer) + { + endOfBufferPos %= bufferSize; + + int numToDo = jmin (sampsNeeded - sampsInBuffer, + bufferSize - endOfBufferPos); + + AudioSourceChannelInfo readInfo (&buffer, endOfBufferPos, numToDo); + input->getNextAudioBlock (readInfo); + + if (localRatio > 1.0001) + { + // for down-sampling, pre-apply the filter.. + + for (int i = channelsToProcess; --i >= 0;) + applyFilter (buffer.getWritePointer (i, endOfBufferPos), numToDo, filterStates[i]); + } + + sampsInBuffer += numToDo; + endOfBufferPos += numToDo; + } + + for (int channel = 0; channel < channelsToProcess; ++channel) + { + destBuffers[channel] = info.buffer->getWritePointer (channel, info.startSample); + srcBuffers[channel] = buffer.getReadPointer (channel); + } + + int nextPos = (bufferPos + 1) % bufferSize; + for (int m = info.numSamples; --m >= 0;) + { + const float alpha = (float) subSampleOffset; + + for (int channel = 0; channel < channelsToProcess; ++channel) + *destBuffers[channel]++ = srcBuffers[channel][bufferPos] + + alpha * (srcBuffers[channel][nextPos] - srcBuffers[channel][bufferPos]); + + subSampleOffset += localRatio; + + jassert (sampsInBuffer > 0); + + while (subSampleOffset >= 1.0) + { + if (++bufferPos >= bufferSize) + bufferPos = 0; + + --sampsInBuffer; + + nextPos = (bufferPos + 1) % bufferSize; + subSampleOffset -= 1.0; + } + } + + if (localRatio < 0.9999) + { + // for up-sampling, apply the filter after transposing.. + for (int i = channelsToProcess; --i >= 0;) + applyFilter (info.buffer->getWritePointer (i, info.startSample), info.numSamples, filterStates[i]); + } + else if (localRatio <= 1.0001 && info.numSamples > 0) + { + // if the filter's not currently being applied, keep it stoked with the last couple of samples to avoid discontinuities + for (int i = channelsToProcess; --i >= 0;) + { + const float* const endOfBuffer = info.buffer->getReadPointer (i, info.startSample + info.numSamples - 1); + FilterState& fs = filterStates[i]; + + if (info.numSamples > 1) + { + fs.y2 = fs.x2 = *(endOfBuffer - 1); + } + else + { + fs.y2 = fs.y1; + fs.x2 = fs.x1; + } + + fs.y1 = fs.x1 = *endOfBuffer; + } + } + + jassert (sampsInBuffer >= 0); +} + +void ResamplingAudioSource::createLowPass (const double frequencyRatio) +{ + const double proportionalRate = (frequencyRatio > 1.0) ? 0.5 / frequencyRatio + : 0.5 * frequencyRatio; + + const double n = 1.0 / std::tan (double_Pi * jmax (0.001, proportionalRate)); + const double nSquared = n * n; + const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); + + setFilterCoefficients (c1, + c1 * 2.0f, + c1, + 1.0, + c1 * 2.0 * (1.0 - nSquared), + c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); +} + +void ResamplingAudioSource::setFilterCoefficients (double c1, double c2, double c3, double c4, double c5, double c6) +{ + const double a = 1.0 / c4; + + c1 *= a; + c2 *= a; + c3 *= a; + c5 *= a; + c6 *= a; + + coefficients[0] = c1; + coefficients[1] = c2; + coefficients[2] = c3; + coefficients[3] = c4; + coefficients[4] = c5; + coefficients[5] = c6; +} + +void ResamplingAudioSource::resetFilters() +{ + if (filterStates != nullptr) + filterStates.clear ((size_t) numChannels); +} + +void ResamplingAudioSource::applyFilter (float* samples, int num, FilterState& fs) +{ + while (--num >= 0) + { + const double in = *samples; + + double out = coefficients[0] * in + + coefficients[1] * fs.x1 + + coefficients[2] * fs.x2 + - coefficients[4] * fs.y1 + - coefficients[5] * fs.y2; + + #if JUCE_INTEL + if (! (out < -1.0e-8 || out > 1.0e-8)) + out = 0; + #endif + + fs.x2 = fs.x1; + fs.x1 = in; + fs.y2 = fs.y1; + fs.y1 = out; + + *samples++ = (float) out; + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h new file mode 100644 index 0000000000..09d27a8751 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h @@ -0,0 +1,107 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED +#define JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + A type of AudioSource that takes an input source and changes its sample rate. + + @see AudioSource +*/ +class JUCE_API ResamplingAudioSource : public AudioSource +{ +public: + //============================================================================== + /** Creates a ResamplingAudioSource for a given input source. + + @param inputSource the input source to read from + @param deleteInputWhenDeleted if true, the input source will be deleted when + this object is deleted + @param numChannels the number of channels to process + */ + ResamplingAudioSource (AudioSource* inputSource, + bool deleteInputWhenDeleted, + int numChannels = 2); + + /** Destructor. */ + ~ResamplingAudioSource(); + + /** Changes the resampling ratio. + + (This value can be changed at any time, even while the source is running). + + @param samplesInPerOutputSample if set to 1.0, the input is passed through; higher + values will speed it up; lower values will slow it + down. The ratio must be greater than 0 + */ + void setResamplingRatio (double samplesInPerOutputSample); + + /** Returns the current resampling ratio. + + This is the value that was set by setResamplingRatio(). + */ + double getResamplingRatio() const noexcept { return ratio; } + + /** Clears any buffers and filters that the resampler is using. */ + void flushBuffers(); + + //============================================================================== + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + void releaseResources() override; + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + +private: + //============================================================================== + OptionalScopedPointer input; + double ratio, lastRatio; + AudioSampleBuffer buffer; + int bufferPos, sampsInBuffer; + double subSampleOffset; + double coefficients[6]; + SpinLock ratioLock; + const int numChannels; + HeapBlock destBuffers; + HeapBlock srcBuffers; + + void setFilterCoefficients (double c1, double c2, double c3, double c4, double c5, double c6); + void createLowPass (double proportionalRate); + + struct FilterState + { + double x1, x2, y1, y2; + }; + + HeapBlock filterStates; + void resetFilters(); + + void applyFilter (float* samples, int num, FilterState& fs); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResamplingAudioSource) +}; + + +#endif // JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp new file mode 100644 index 0000000000..d630075371 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp @@ -0,0 +1,80 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +ReverbAudioSource::ReverbAudioSource (AudioSource* const inputSource, const bool deleteInputWhenDeleted) + : input (inputSource, deleteInputWhenDeleted), + bypass (false) +{ + jassert (inputSource != nullptr); +} + +ReverbAudioSource::~ReverbAudioSource() {} + +void ReverbAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) +{ + const ScopedLock sl (lock); + input->prepareToPlay (samplesPerBlockExpected, sampleRate); + reverb.setSampleRate (sampleRate); +} + +void ReverbAudioSource::releaseResources() {} + +void ReverbAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) +{ + const ScopedLock sl (lock); + + input->getNextAudioBlock (bufferToFill); + + if (! bypass) + { + float* const firstChannel = bufferToFill.buffer->getWritePointer (0, bufferToFill.startSample); + + if (bufferToFill.buffer->getNumChannels() > 1) + { + reverb.processStereo (firstChannel, + bufferToFill.buffer->getWritePointer (1, bufferToFill.startSample), + bufferToFill.numSamples); + } + else + { + reverb.processMono (firstChannel, bufferToFill.numSamples); + } + } +} + +void ReverbAudioSource::setParameters (const Reverb::Parameters& newParams) +{ + const ScopedLock sl (lock); + reverb.setParameters (newParams); +} + +void ReverbAudioSource::setBypassed (bool b) noexcept +{ + if (bypass != b) + { + const ScopedLock sl (lock); + bypass = b; + reverb.reset(); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h new file mode 100644 index 0000000000..6b90e184a1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h @@ -0,0 +1,76 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_REVERBAUDIOSOURCE_H_INCLUDED +#define JUCE_REVERBAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + An AudioSource that uses the Reverb class to apply a reverb to another AudioSource. + + @see Reverb +*/ +class JUCE_API ReverbAudioSource : public AudioSource +{ +public: + /** Creates a ReverbAudioSource to process a given input source. + + @param inputSource the input source to read from - this must not be null + @param deleteInputWhenDeleted if true, the input source will be deleted when + this object is deleted + */ + ReverbAudioSource (AudioSource* inputSource, + bool deleteInputWhenDeleted); + + /** Destructor. */ + ~ReverbAudioSource(); + + //============================================================================== + /** Returns the parameters from the reverb. */ + const Reverb::Parameters& getParameters() const noexcept { return reverb.getParameters(); } + + /** Changes the reverb's parameters. */ + void setParameters (const Reverb::Parameters& newParams); + + void setBypassed (bool isBypassed) noexcept; + bool isBypassed() const noexcept { return bypass; } + + //============================================================================== + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + void releaseResources() override; + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + +private: + //============================================================================== + CriticalSection lock; + OptionalScopedPointer input; + Reverb reverb; + volatile bool bypass; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReverbAudioSource) +}; + + +#endif // JUCE_REVERBAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp new file mode 100644 index 0000000000..a0e04eff24 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp @@ -0,0 +1,75 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +ToneGeneratorAudioSource::ToneGeneratorAudioSource() + : frequency (1000.0), + sampleRate (44100.0), + currentPhase (0.0), + phasePerSample (0.0), + amplitude (0.5f) +{ +} + +ToneGeneratorAudioSource::~ToneGeneratorAudioSource() +{ +} + +//============================================================================== +void ToneGeneratorAudioSource::setAmplitude (const float newAmplitude) +{ + amplitude = newAmplitude; +} + +void ToneGeneratorAudioSource::setFrequency (const double newFrequencyHz) +{ + frequency = newFrequencyHz; + phasePerSample = 0.0; +} + +//============================================================================== +void ToneGeneratorAudioSource::prepareToPlay (int /*samplesPerBlockExpected*/, double rate) +{ + currentPhase = 0.0; + phasePerSample = 0.0; + sampleRate = rate; +} + +void ToneGeneratorAudioSource::releaseResources() +{ +} + +void ToneGeneratorAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) +{ + if (phasePerSample == 0.0) + phasePerSample = double_Pi * 2.0 / (sampleRate / frequency); + + for (int i = 0; i < info.numSamples; ++i) + { + const float sample = amplitude * (float) std::sin (currentPhase); + currentPhase += phasePerSample; + + for (int j = info.buffer->getNumChannels(); --j >= 0;) + info.buffer->setSample (j, info.startSample + i, sample); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h new file mode 100644 index 0000000000..5d09ad8ee9 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h @@ -0,0 +1,73 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED +#define JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED + + +//============================================================================== +/** + A simple AudioSource that generates a sine wave. + +*/ +class JUCE_API ToneGeneratorAudioSource : public AudioSource +{ +public: + //============================================================================== + /** Creates a ToneGeneratorAudioSource. */ + ToneGeneratorAudioSource(); + + /** Destructor. */ + ~ToneGeneratorAudioSource(); + + //============================================================================== + /** Sets the signal's amplitude. */ + void setAmplitude (float newAmplitude); + + /** Sets the signal's frequency. */ + void setFrequency (double newFrequencyHz); + + + //============================================================================== + /** Implementation of the AudioSource method. */ + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + + /** Implementation of the AudioSource method. */ + void releaseResources() override; + + /** Implementation of the AudioSource method. */ + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + + +private: + //============================================================================== + double frequency, sampleRate; + double currentPhase, phasePerSample; + float amplitude; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToneGeneratorAudioSource) +}; + + +#endif // JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp new file mode 100644 index 0000000000..81110ed9f8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp @@ -0,0 +1,503 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +SynthesiserSound::SynthesiserSound() {} +SynthesiserSound::~SynthesiserSound() {} + +//============================================================================== +SynthesiserVoice::SynthesiserVoice() + : currentSampleRate (44100.0), + currentlyPlayingNote (-1), + noteOnTime (0), + keyIsDown (false), + sostenutoPedalDown (false) +{ +} + +SynthesiserVoice::~SynthesiserVoice() +{ +} + +bool SynthesiserVoice::isPlayingChannel (const int midiChannel) const +{ + return currentlyPlayingSound != nullptr + && currentlyPlayingSound->appliesToChannel (midiChannel); +} + +void SynthesiserVoice::setCurrentPlaybackSampleRate (const double newRate) +{ + currentSampleRate = newRate; +} + +bool SynthesiserVoice::isVoiceActive() const +{ + return getCurrentlyPlayingNote() >= 0; +} + +void SynthesiserVoice::clearCurrentNote() +{ + currentlyPlayingNote = -1; + currentlyPlayingSound = nullptr; +} + +void SynthesiserVoice::aftertouchChanged (int) {} + +bool SynthesiserVoice::wasStartedBefore (const SynthesiserVoice& other) const noexcept +{ + return noteOnTime < other.noteOnTime; +} + +//============================================================================== +Synthesiser::Synthesiser() + : sampleRate (0), + lastNoteOnCounter (0), + shouldStealNotes (true) +{ + for (int i = 0; i < numElementsInArray (lastPitchWheelValues); ++i) + lastPitchWheelValues[i] = 0x2000; +} + +Synthesiser::~Synthesiser() +{ +} + +//============================================================================== +SynthesiserVoice* Synthesiser::getVoice (const int index) const +{ + const ScopedLock sl (lock); + return voices [index]; +} + +void Synthesiser::clearVoices() +{ + const ScopedLock sl (lock); + voices.clear(); +} + +SynthesiserVoice* Synthesiser::addVoice (SynthesiserVoice* const newVoice) +{ + const ScopedLock sl (lock); + return voices.add (newVoice); +} + +void Synthesiser::removeVoice (const int index) +{ + const ScopedLock sl (lock); + voices.remove (index); +} + +void Synthesiser::clearSounds() +{ + const ScopedLock sl (lock); + sounds.clear(); +} + +SynthesiserSound* Synthesiser::addSound (const SynthesiserSound::Ptr& newSound) +{ + const ScopedLock sl (lock); + return sounds.add (newSound); +} + +void Synthesiser::removeSound (const int index) +{ + const ScopedLock sl (lock); + sounds.remove (index); +} + +void Synthesiser::setNoteStealingEnabled (const bool shouldSteal) +{ + shouldStealNotes = shouldSteal; +} + +//============================================================================== +void Synthesiser::setCurrentPlaybackSampleRate (const double newRate) +{ + if (sampleRate != newRate) + { + const ScopedLock sl (lock); + + allNotesOff (0, false); + + sampleRate = newRate; + + for (int i = voices.size(); --i >= 0;) + voices.getUnchecked (i)->setCurrentPlaybackSampleRate (newRate); + } +} + +void Synthesiser::renderNextBlock (AudioSampleBuffer& outputBuffer, const MidiBuffer& midiData, + int startSample, int numSamples) +{ + // must set the sample rate before using this! + jassert (sampleRate != 0); + + const ScopedLock sl (lock); + + MidiBuffer::Iterator midiIterator (midiData); + midiIterator.setNextSamplePosition (startSample); + MidiMessage m (0xf4, 0.0); + + while (numSamples > 0) + { + int midiEventPos; + const bool useEvent = midiIterator.getNextEvent (m, midiEventPos) + && midiEventPos < startSample + numSamples; + + const int numThisTime = useEvent ? midiEventPos - startSample + : numSamples; + + if (numThisTime > 0) + renderVoices (outputBuffer, startSample, numThisTime); + + if (useEvent) + handleMidiEvent (m); + + startSample += numThisTime; + numSamples -= numThisTime; + } +} + +void Synthesiser::renderVoices (AudioSampleBuffer& buffer, int startSample, int numSamples) +{ + for (int i = voices.size(); --i >= 0;) + voices.getUnchecked (i)->renderNextBlock (buffer, startSample, numSamples); +} + +void Synthesiser::handleMidiEvent (const MidiMessage& m) +{ + if (m.isNoteOn()) + { + noteOn (m.getChannel(), m.getNoteNumber(), m.getFloatVelocity()); + } + else if (m.isNoteOff()) + { + noteOff (m.getChannel(), m.getNoteNumber(), m.getFloatVelocity(), true); + } + else if (m.isAllNotesOff() || m.isAllSoundOff()) + { + allNotesOff (m.getChannel(), true); + } + else if (m.isPitchWheel()) + { + const int channel = m.getChannel(); + const int wheelPos = m.getPitchWheelValue(); + lastPitchWheelValues [channel - 1] = wheelPos; + + handlePitchWheel (channel, wheelPos); + } + else if (m.isAftertouch()) + { + handleAftertouch (m.getChannel(), m.getNoteNumber(), m.getAfterTouchValue()); + } + else if (m.isController()) + { + handleController (m.getChannel(), m.getControllerNumber(), m.getControllerValue()); + } +} + +//============================================================================== +void Synthesiser::noteOn (const int midiChannel, + const int midiNoteNumber, + const float velocity) +{ + const ScopedLock sl (lock); + + for (int i = sounds.size(); --i >= 0;) + { + SynthesiserSound* const sound = sounds.getUnchecked(i); + + if (sound->appliesToNote (midiNoteNumber) + && sound->appliesToChannel (midiChannel)) + { + // If hitting a note that's still ringing, stop it first (it could be + // still playing because of the sustain or sostenuto pedal). + for (int j = voices.size(); --j >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (j); + + if (voice->getCurrentlyPlayingNote() == midiNoteNumber + && voice->isPlayingChannel (midiChannel)) + stopVoice (voice, 1.0f, true); + } + + startVoice (findFreeVoice (sound, midiChannel, midiNoteNumber, shouldStealNotes), + sound, midiChannel, midiNoteNumber, velocity); + } + } +} + +void Synthesiser::startVoice (SynthesiserVoice* const voice, + SynthesiserSound* const sound, + const int midiChannel, + const int midiNoteNumber, + const float velocity) +{ + if (voice != nullptr && sound != nullptr) + { + if (voice->currentlyPlayingSound != nullptr) + voice->stopNote (0.0f, false); + + voice->startNote (midiNoteNumber, velocity, sound, + lastPitchWheelValues [midiChannel - 1]); + + voice->currentlyPlayingNote = midiNoteNumber; + voice->noteOnTime = ++lastNoteOnCounter; + voice->currentlyPlayingSound = sound; + voice->keyIsDown = true; + voice->sostenutoPedalDown = false; + } +} + +void Synthesiser::stopVoice (SynthesiserVoice* voice, float velocity, const bool allowTailOff) +{ + jassert (voice != nullptr); + + voice->stopNote (velocity, allowTailOff); + + // the subclass MUST call clearCurrentNote() if it's not tailing off! RTFM for stopNote()! + jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == 0)); +} + +void Synthesiser::noteOff (const int midiChannel, + const int midiNoteNumber, + const float velocity, + const bool allowTailOff) +{ + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (voice->getCurrentlyPlayingNote() == midiNoteNumber) + { + if (SynthesiserSound* const sound = voice->getCurrentlyPlayingSound()) + { + if (sound->appliesToNote (midiNoteNumber) + && sound->appliesToChannel (midiChannel)) + { + voice->keyIsDown = false; + + if (! (sustainPedalsDown [midiChannel] || voice->sostenutoPedalDown)) + stopVoice (voice, velocity, allowTailOff); + } + } + } + } +} + +void Synthesiser::allNotesOff (const int midiChannel, const bool allowTailOff) +{ + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) + voice->stopNote (1.0f, allowTailOff); + } + + sustainPedalsDown.clear(); +} + +void Synthesiser::handlePitchWheel (const int midiChannel, const int wheelValue) +{ + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) + voice->pitchWheelMoved (wheelValue); + } +} + +void Synthesiser::handleController (const int midiChannel, + const int controllerNumber, + const int controllerValue) +{ + switch (controllerNumber) + { + case 0x40: handleSustainPedal (midiChannel, controllerValue >= 64); break; + case 0x42: handleSostenutoPedal (midiChannel, controllerValue >= 64); break; + case 0x43: handleSoftPedal (midiChannel, controllerValue >= 64); break; + default: break; + } + + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) + voice->controllerMoved (controllerNumber, controllerValue); + } +} + +void Synthesiser::handleAftertouch (int midiChannel, int midiNoteNumber, int aftertouchValue) +{ + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (voice->getCurrentlyPlayingNote() == midiNoteNumber + && (midiChannel <= 0 || voice->isPlayingChannel (midiChannel))) + voice->aftertouchChanged (aftertouchValue); + } +} + +void Synthesiser::handleSustainPedal (int midiChannel, bool isDown) +{ + jassert (midiChannel > 0 && midiChannel <= 16); + const ScopedLock sl (lock); + + if (isDown) + { + sustainPedalsDown.setBit (midiChannel); + } + else + { + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (voice->isPlayingChannel (midiChannel) && ! voice->keyIsDown) + stopVoice (voice, 1.0f, true); + } + + sustainPedalsDown.clearBit (midiChannel); + } +} + +void Synthesiser::handleSostenutoPedal (int midiChannel, bool isDown) +{ + jassert (midiChannel > 0 && midiChannel <= 16); + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (voice->isPlayingChannel (midiChannel)) + { + if (isDown) + voice->sostenutoPedalDown = true; + else if (voice->sostenutoPedalDown) + stopVoice (voice, 1.0f, true); + } + } +} + +void Synthesiser::handleSoftPedal (int midiChannel, bool /*isDown*/) +{ + (void) midiChannel; + jassert (midiChannel > 0 && midiChannel <= 16); +} + +//============================================================================== +SynthesiserVoice* Synthesiser::findFreeVoice (SynthesiserSound* soundToPlay, + int midiChannel, int midiNoteNumber, + const bool stealIfNoneAvailable) const +{ + const ScopedLock sl (lock); + + for (int i = 0; i < voices.size(); ++i) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if ((! voice->isVoiceActive()) && voice->canPlaySound (soundToPlay)) + return voice; + } + + if (stealIfNoneAvailable) + return findVoiceToSteal (soundToPlay, midiChannel, midiNoteNumber); + + return nullptr; +} + +struct VoiceAgeSorter +{ + static int compareElements (SynthesiserVoice* v1, SynthesiserVoice* v2) noexcept + { + return v1->wasStartedBefore (*v2) ? 1 : (v2->wasStartedBefore (*v1) ? -1 : 0); + } +}; + +SynthesiserVoice* Synthesiser::findVoiceToSteal (SynthesiserSound* soundToPlay, + int /*midiChannel*/, int midiNoteNumber) const +{ + SynthesiserVoice* bottom = nullptr; + SynthesiserVoice* top = nullptr; + + // this is a list of voices we can steal, sorted by how long they've been running + Array usableVoices; + usableVoices.ensureStorageAllocated (voices.size()); + + for (int i = 0; i < voices.size(); ++i) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (voice->canPlaySound (soundToPlay)) + { + VoiceAgeSorter sorter; + usableVoices.addSorted (sorter, voice); + + const int note = voice->getCurrentlyPlayingNote(); + + if (bottom == nullptr || note < bottom->getCurrentlyPlayingNote()) + bottom = voice; + + if (top == nullptr || note > top->getCurrentlyPlayingNote()) + top = voice; + } + } + + jassert (bottom != nullptr && top != nullptr); + + // The oldest note that's playing with the target pitch playing is ideal.. + for (int i = 0; i < usableVoices.size(); ++i) + { + SynthesiserVoice* const voice = usableVoices.getUnchecked (i); + + if (voice->getCurrentlyPlayingNote() == midiNoteNumber) + return voice; + } + + // ..otherwise, look for the oldest note that isn't the top or bottom note.. + for (int i = 0; i < usableVoices.size(); ++i) + { + SynthesiserVoice* const voice = usableVoices.getUnchecked (i); + + if (voice != bottom && voice != top) + return voice; + } + + // ..otherwise, there's only one or two voices to choose from - we'll return the top one.. + return top; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h new file mode 100644 index 0000000000..3c20a85302 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h @@ -0,0 +1,557 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_SYNTHESISER_H_INCLUDED +#define JUCE_SYNTHESISER_H_INCLUDED + + +//============================================================================== +/** + Describes one of the sounds that a Synthesiser can play. + + A synthesiser can contain one or more sounds, and a sound can choose which + midi notes and channels can trigger it. + + The SynthesiserSound is a passive class that just describes what the sound is - + the actual audio rendering for a sound is done by a SynthesiserVoice. This allows + more than one SynthesiserVoice to play the same sound at the same time. + + @see Synthesiser, SynthesiserVoice +*/ +class JUCE_API SynthesiserSound : public ReferenceCountedObject +{ +protected: + //============================================================================== + SynthesiserSound(); + +public: + /** Destructor. */ + virtual ~SynthesiserSound(); + + //============================================================================== + /** Returns true if this sound should be played when a given midi note is pressed. + + The Synthesiser will use this information when deciding which sounds to trigger + for a given note. + */ + virtual bool appliesToNote (int midiNoteNumber) = 0; + + /** Returns true if the sound should be triggered by midi events on a given channel. + + The Synthesiser will use this information when deciding which sounds to trigger + for a given note. + */ + virtual bool appliesToChannel (int midiChannel) = 0; + + /** The class is reference-counted, so this is a handy pointer class for it. */ + typedef ReferenceCountedObjectPtr Ptr; + + +private: + //============================================================================== + JUCE_LEAK_DETECTOR (SynthesiserSound) +}; + + +//============================================================================== +/** + Represents a voice that a Synthesiser can use to play a SynthesiserSound. + + A voice plays a single sound at a time, and a synthesiser holds an array of + voices so that it can play polyphonically. + + @see Synthesiser, SynthesiserSound +*/ +class JUCE_API SynthesiserVoice +{ +public: + //============================================================================== + /** Creates a voice. */ + SynthesiserVoice(); + + /** Destructor. */ + virtual ~SynthesiserVoice(); + + //============================================================================== + /** Returns the midi note that this voice is currently playing. + Returns a value less than 0 if no note is playing. + */ + int getCurrentlyPlayingNote() const noexcept { return currentlyPlayingNote; } + + /** Returns the sound that this voice is currently playing. + Returns nullptr if it's not playing. + */ + SynthesiserSound::Ptr getCurrentlyPlayingSound() const noexcept { return currentlyPlayingSound; } + + /** Must return true if this voice object is capable of playing the given sound. + + If there are different classes of sound, and different classes of voice, a voice can + choose which ones it wants to take on. + + A typical implementation of this method may just return true if there's only one type + of voice and sound, or it might check the type of the sound object passed-in and + see if it's one that it understands. + */ + virtual bool canPlaySound (SynthesiserSound*) = 0; + + /** Called to start a new note. + This will be called during the rendering callback, so must be fast and thread-safe. + */ + virtual void startNote (int midiNoteNumber, + float velocity, + SynthesiserSound* sound, + int currentPitchWheelPosition) = 0; + + /** Called to stop a note. + + This will be called during the rendering callback, so must be fast and thread-safe. + + The velocity indicates how quickly the note was released - 0 is slowly, 1 is quickly. + + If allowTailOff is false or the voice doesn't want to tail-off, then it must stop all + sound immediately, and must call clearCurrentNote() to reset the state of this voice + and allow the synth to reassign it another sound. + + If allowTailOff is true and the voice decides to do a tail-off, then it's allowed to + begin fading out its sound, and it can stop playing until it's finished. As soon as it + finishes playing (during the rendering callback), it must make sure that it calls + clearCurrentNote(). + */ + virtual void stopNote (float velocity, bool allowTailOff) = 0; + + /** Returns true if this voice is currently busy playing a sound. + By default this just checks the getCurrentlyPlayingNote() value, but can + be overridden for more advanced checking. + */ + virtual bool isVoiceActive() const; + + /** Called to let the voice know that the pitch wheel has been moved. + This will be called during the rendering callback, so must be fast and thread-safe. + */ + virtual void pitchWheelMoved (int newPitchWheelValue) = 0; + + /** Called to let the voice know that a midi controller has been moved. + This will be called during the rendering callback, so must be fast and thread-safe. + */ + virtual void controllerMoved (int controllerNumber, int newControllerValue) = 0; + + /** Called to let the voice know that the aftertouch has changed. + This will be called during the rendering callback, so must be fast and thread-safe. + */ + virtual void aftertouchChanged (int newAftertouchValue); + + //============================================================================== + /** Renders the next block of data for this voice. + + The output audio data must be added to the current contents of the buffer provided. + Only the region of the buffer between startSample and (startSample + numSamples) + should be altered by this method. + + If the voice is currently silent, it should just return without doing anything. + + If the sound that the voice is playing finishes during the course of this rendered + block, it must call clearCurrentNote(), to tell the synthesiser that it has finished. + + The size of the blocks that are rendered can change each time it is called, and may + involve rendering as little as 1 sample at a time. In between rendering callbacks, + the voice's methods will be called to tell it about note and controller events. + */ + virtual void renderNextBlock (AudioSampleBuffer& outputBuffer, + int startSample, + int numSamples) = 0; + + /** Changes the voice's reference sample rate. + + The rate is set so that subclasses know the output rate and can set their pitch + accordingly. + + This method is called by the synth, and subclasses can access the current rate with + the currentSampleRate member. + */ + virtual void setCurrentPlaybackSampleRate (double newRate); + + /** Returns the current target sample rate at which rendering is being done. + Subclasses may need to know this so that they can pitch things correctly. + */ + double getSampleRate() const noexcept { return currentSampleRate; } + + /** Returns true if the voice is currently playing a sound which is mapped to the given + midi channel. + + If it's not currently playing, this will return false. + */ + bool isPlayingChannel (int midiChannel) const; + + /** Returns true if the key that triggered this voice is still held down. + Note that the voice may still be playing after the key was released (e.g because the + sostenuto pedal is down). + */ + bool isKeyDown() const noexcept { return keyIsDown; } + + /** Returns true if the sostenuto pedal is currently active for this voice. */ + bool isSostenutoPedalDown() const noexcept { return sostenutoPedalDown; } + + /** Returns true if this voice started playing its current note before the other voice did. */ + bool wasStartedBefore (const SynthesiserVoice& other) const noexcept; + +protected: + /** Resets the state of this voice after a sound has finished playing. + + The subclass must call this when it finishes playing a note and becomes available + to play new ones. + + It must either call it in the stopNote() method, or if the voice is tailing off, + then it should call it later during the renderNextBlock method, as soon as it + finishes its tail-off. + + It can also be called at any time during the render callback if the sound happens + to have finished, e.g. if it's playing a sample and the sample finishes. + */ + void clearCurrentNote(); + + +private: + //============================================================================== + friend class Synthesiser; + + double currentSampleRate; + int currentlyPlayingNote; + uint32 noteOnTime; + SynthesiserSound::Ptr currentlyPlayingSound; + bool keyIsDown, sostenutoPedalDown; + + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // Note the new parameters for this method. + virtual int stopNote (bool) { return 0; } + #endif + + JUCE_LEAK_DETECTOR (SynthesiserVoice) +}; + + +//============================================================================== +/** + Base class for a musical device that can play sounds. + + To create a synthesiser, you'll need to create a subclass of SynthesiserSound + to describe each sound available to your synth, and a subclass of SynthesiserVoice + which can play back one of these sounds. + + Then you can use the addVoice() and addSound() methods to give the synthesiser a + set of sounds, and a set of voices it can use to play them. If you only give it + one voice it will be monophonic - the more voices it has, the more polyphony it'll + have available. + + Then repeatedly call the renderNextBlock() method to produce the audio. Any midi + events that go in will be scanned for note on/off messages, and these are used to + start and stop the voices playing the appropriate sounds. + + While it's playing, you can also cause notes to be triggered by calling the noteOn(), + noteOff() and other controller methods. + + Before rendering, be sure to call the setCurrentPlaybackSampleRate() to tell it + what the target playback rate is. This value is passed on to the voices so that + they can pitch their output correctly. +*/ +class JUCE_API Synthesiser +{ +public: + //============================================================================== + /** Creates a new synthesiser. + You'll need to add some sounds and voices before it'll make any sound. + */ + Synthesiser(); + + /** Destructor. */ + virtual ~Synthesiser(); + + //============================================================================== + /** Deletes all voices. */ + void clearVoices(); + + /** Returns the number of voices that have been added. */ + int getNumVoices() const noexcept { return voices.size(); } + + /** Returns one of the voices that have been added. */ + SynthesiserVoice* getVoice (int index) const; + + /** Adds a new voice to the synth. + + All the voices should be the same class of object and are treated equally. + + The object passed in will be managed by the synthesiser, which will delete + it later on when no longer needed. The caller should not retain a pointer to the + voice. + */ + SynthesiserVoice* addVoice (SynthesiserVoice* newVoice); + + /** Deletes one of the voices. */ + void removeVoice (int index); + + //============================================================================== + /** Deletes all sounds. */ + void clearSounds(); + + /** Returns the number of sounds that have been added to the synth. */ + int getNumSounds() const noexcept { return sounds.size(); } + + /** Returns one of the sounds. */ + SynthesiserSound* getSound (int index) const noexcept { return sounds [index]; } + + /** Adds a new sound to the synthesiser. + + The object passed in is reference counted, so will be deleted when the + synthesiser and all voices are no longer using it. + */ + SynthesiserSound* addSound (const SynthesiserSound::Ptr& newSound); + + /** Removes and deletes one of the sounds. */ + void removeSound (int index); + + //============================================================================== + /** If set to true, then the synth will try to take over an existing voice if + it runs out and needs to play another note. + + The value of this boolean is passed into findFreeVoice(), so the result will + depend on the implementation of this method. + */ + void setNoteStealingEnabled (bool shouldStealNotes); + + /** Returns true if note-stealing is enabled. + @see setNoteStealingEnabled + */ + bool isNoteStealingEnabled() const noexcept { return shouldStealNotes; } + + //============================================================================== + /** Triggers a note-on event. + + The default method here will find all the sounds that want to be triggered by + this note/channel. For each sound, it'll try to find a free voice, and use the + voice to start playing the sound. + + Subclasses might want to override this if they need a more complex algorithm. + + This method will be called automatically according to the midi data passed into + renderNextBlock(), but may be called explicitly too. + + The midiChannel parameter is the channel, between 1 and 16 inclusive. + */ + virtual void noteOn (int midiChannel, + int midiNoteNumber, + float velocity); + + /** Triggers a note-off event. + + This will turn off any voices that are playing a sound for the given note/channel. + + If allowTailOff is true, the voices will be allowed to fade out the notes gracefully + (if they can do). If this is false, the notes will all be cut off immediately. + + This method will be called automatically according to the midi data passed into + renderNextBlock(), but may be called explicitly too. + + The midiChannel parameter is the channel, between 1 and 16 inclusive. + */ + virtual void noteOff (int midiChannel, + int midiNoteNumber, + float velocity, + bool allowTailOff); + + /** Turns off all notes. + + This will turn off any voices that are playing a sound on the given midi channel. + + If midiChannel is 0 or less, then all voices will be turned off, regardless of + which channel they're playing. Otherwise it represents a valid midi channel, from + 1 to 16 inclusive. + + If allowTailOff is true, the voices will be allowed to fade out the notes gracefully + (if they can do). If this is false, the notes will all be cut off immediately. + + This method will be called automatically according to the midi data passed into + renderNextBlock(), but may be called explicitly too. + */ + virtual void allNotesOff (int midiChannel, + bool allowTailOff); + + /** Sends a pitch-wheel message to any active voices. + + This will send a pitch-wheel message to any voices that are playing sounds on + the given midi channel. + + This method will be called automatically according to the midi data passed into + renderNextBlock(), but may be called explicitly too. + + @param midiChannel the midi channel, from 1 to 16 inclusive + @param wheelValue the wheel position, from 0 to 0x3fff, as returned by MidiMessage::getPitchWheelValue() + */ + virtual void handlePitchWheel (int midiChannel, + int wheelValue); + + /** Sends a midi controller message to any active voices. + + This will send a midi controller message to any voices that are playing sounds on + the given midi channel. + + This method will be called automatically according to the midi data passed into + renderNextBlock(), but may be called explicitly too. + + @param midiChannel the midi channel, from 1 to 16 inclusive + @param controllerNumber the midi controller type, as returned by MidiMessage::getControllerNumber() + @param controllerValue the midi controller value, between 0 and 127, as returned by MidiMessage::getControllerValue() + */ + virtual void handleController (int midiChannel, + int controllerNumber, + int controllerValue); + + /** Sends an aftertouch message. + + This will send an aftertouch message to any voices that are playing sounds on + the given midi channel and note number. + + This method will be called automatically according to the midi data passed into + renderNextBlock(), but may be called explicitly too. + + @param midiChannel the midi channel, from 1 to 16 inclusive + @param midiNoteNumber the midi note number, 0 to 127 + @param aftertouchValue the aftertouch value, between 0 and 127, + as returned by MidiMessage::getAftertouchValue() + */ + virtual void handleAftertouch (int midiChannel, int midiNoteNumber, int aftertouchValue); + + /** Handles a sustain pedal event. */ + virtual void handleSustainPedal (int midiChannel, bool isDown); + + /** Handles a sostenuto pedal event. */ + virtual void handleSostenutoPedal (int midiChannel, bool isDown); + + /** Can be overridden to handle soft pedal events. */ + virtual void handleSoftPedal (int midiChannel, bool isDown); + + //============================================================================== + /** Tells the synthesiser what the sample rate is for the audio it's being used to render. + + This value is propagated to the voices so that they can use it to render the correct + pitches. + */ + virtual void setCurrentPlaybackSampleRate (double sampleRate); + + /** Creates the next block of audio output. + + This will process the next numSamples of data from all the voices, and add that output + to the audio block supplied, starting from the offset specified. Note that the + data will be added to the current contents of the buffer, so you should clear it + before calling this method if necessary. + + The midi events in the inputMidi buffer are parsed for note and controller events, + and these are used to trigger the voices. Note that the startSample offset applies + both to the audio output buffer and the midi input buffer, so any midi events + with timestamps outside the specified region will be ignored. + */ + void renderNextBlock (AudioSampleBuffer& outputAudio, + const MidiBuffer& inputMidi, + int startSample, + int numSamples); + + /** Returns the current target sample rate at which rendering is being done. + Subclasses may need to know this so that they can pitch things correctly. + */ + double getSampleRate() const noexcept { return sampleRate; } + +protected: + //============================================================================== + /** This is used to control access to the rendering callback and the note trigger methods. */ + CriticalSection lock; + + OwnedArray voices; + ReferenceCountedArray sounds; + + /** The last pitch-wheel values for each midi channel. */ + int lastPitchWheelValues [16]; + + /** Renders the voices for the given range. + By default this just calls renderNextBlock() on each voice, but you may need + to override it to handle custom cases. + */ + virtual void renderVoices (AudioSampleBuffer& outputAudio, + int startSample, int numSamples); + + /** Searches through the voices to find one that's not currently playing, and + which can play the given sound. + + Returns nullptr if all voices are busy and stealing isn't enabled. + + To implement a custom note-stealing algorithm, you can either override this + method, or (preferably) override findVoiceToSteal(). + */ + virtual SynthesiserVoice* findFreeVoice (SynthesiserSound* soundToPlay, + int midiChannel, + int midiNoteNumber, + bool stealIfNoneAvailable) const; + + /** Chooses a voice that is most suitable for being re-used. + The default method will attempt to find the oldest voice that isn't the + bottom or top note being played. If that's not suitable for your synth, + you can override this method and do something more cunning instead. + */ + virtual SynthesiserVoice* findVoiceToSteal (SynthesiserSound* soundToPlay, + int midiChannel, + int midiNoteNumber) const; + + /** Starts a specified voice playing a particular sound. + + You'll probably never need to call this, it's used internally by noteOn(), but + may be needed by subclasses for custom behaviours. + */ + void startVoice (SynthesiserVoice* voice, + SynthesiserSound* sound, + int midiChannel, + int midiNoteNumber, + float velocity); + + /** Can be overridden to do custom handling of incoming midi events. */ + virtual void handleMidiEvent (const MidiMessage&); + +private: + //============================================================================== + double sampleRate; + uint32 lastNoteOnCounter; + bool shouldStealNotes; + BigInteger sustainPedalsDown; + + void stopVoice (SynthesiserVoice*, float velocity, bool allowTailOff); + + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // Note the new parameters for these methods. + virtual int findFreeVoice (const bool) const { return 0; } + virtual int noteOff (int, int, int) { return 0; } + virtual int findFreeVoice (SynthesiserSound*, const bool) { return 0; } + virtual int findVoiceToSteal (SynthesiserSound*) const { return 0; } + #endif + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Synthesiser) +}; + + +#endif // JUCE_SYNTHESISER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h new file mode 100644 index 0000000000..88b1ef2670 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h @@ -0,0 +1,169 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOCDBURNER_H_INCLUDED +#define JUCE_AUDIOCDBURNER_H_INCLUDED + +#if JUCE_USE_CDBURNER || DOXYGEN + + +//============================================================================== +/** +*/ +class AudioCDBurner : public ChangeBroadcaster +{ +public: + //============================================================================== + /** Returns a list of available optical drives. + + Use openDevice() to open one of the items from this list. + */ + static StringArray findAvailableDevices(); + + /** Tries to open one of the optical drives. + + The deviceIndex is an index into the array returned by findAvailableDevices(). + */ + static AudioCDBurner* openDevice (const int deviceIndex); + + /** Destructor. */ + ~AudioCDBurner(); + + //============================================================================== + enum DiskState + { + unknown, /**< An error condition, if the device isn't responding. */ + trayOpen, /**< The drive is currently open. Note that a slot-loading drive + may seem to be permanently open. */ + noDisc, /**< The drive has no disk in it. */ + writableDiskPresent, /**< The drive contains a writeable disk. */ + readOnlyDiskPresent /**< The drive contains a read-only disk. */ + }; + + /** Returns the current status of the device. + + To get informed when the drive's status changes, attach a ChangeListener to + the AudioCDBurner. + */ + DiskState getDiskState() const; + + /** Returns true if there's a writable disk in the drive. */ + bool isDiskPresent() const; + + /** Sends an eject signal to the drive. + The eject will happen asynchronously, so you can use getDiskState() and + waitUntilStateChange() to monitor its progress. + */ + bool openTray(); + + /** Blocks the current thread until the drive's state changes, or until the timeout expires. + @returns the device's new state + */ + DiskState waitUntilStateChange (int timeOutMilliseconds); + + //============================================================================== + /** Returns the set of possible write speeds that the device can handle. + These are as a multiple of 'normal' speed, so e.g. '24x' returns 24, etc. + Note that if there's no media present in the drive, this value may be unavailable! + @see setWriteSpeed, getWriteSpeed + */ + Array getAvailableWriteSpeeds() const; + + //============================================================================== + /** Tries to enable or disable buffer underrun safety on devices that support it. + @returns true if it's now enabled. If the device doesn't support it, this + will always return false. + */ + bool setBufferUnderrunProtection (bool shouldBeEnabled); + + //============================================================================== + /** Returns the number of free blocks on the disk. + + There are 75 blocks per second, at 44100Hz. + */ + int getNumAvailableAudioBlocks() const; + + /** Adds a track to be written. + + The source passed-in here will be kept by this object, and it will + be used and deleted at some point in the future, either during the + burn() method or when this AudioCDBurner object is deleted. Your caller + method shouldn't keep a reference to it or use it again after passing + it in here. + */ + bool addAudioTrack (AudioSource* source, int numSamples); + + //============================================================================== + /** Receives progress callbacks during a cd-burn operation. + @see AudioCDBurner::burn() + */ + class BurnProgressListener + { + public: + BurnProgressListener() noexcept {} + virtual ~BurnProgressListener() {} + + /** Called at intervals to report on the progress of the AudioCDBurner. + + To cancel the burn, return true from this method. + */ + virtual bool audioCDBurnProgress (float proportionComplete) = 0; + }; + + /** Runs the burn process. + This method will block until the operation is complete. + + @param listener the object to receive callbacks about progress + @param ejectDiscAfterwards whether to eject the disk after the burn completes + @param performFakeBurnForTesting if true, no data will actually be written to the disk + @param writeSpeed one of the write speeds from getAvailableWriteSpeeds(), or + 0 or less to mean the fastest speed. + */ + String burn (BurnProgressListener* listener, + bool ejectDiscAfterwards, + bool performFakeBurnForTesting, + int writeSpeed); + + /** If a burn operation is currently in progress, this tells it to stop + as soon as possible. + + It's also possible to stop the burn process by returning true from + BurnProgressListener::audioCDBurnProgress() + */ + void abortBurn(); + +private: + //============================================================================== + AudioCDBurner (const int deviceIndex); + + class Pimpl; + friend struct ContainerDeletePolicy; + ScopedPointer pimpl; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDBurner) +}; + + +#endif +#endif // JUCE_AUDIOCDBURNER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp new file mode 100644 index 0000000000..ca9c5b0f26 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp @@ -0,0 +1,57 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_CDREADER + +int AudioCDReader::getNumTracks() const +{ + return trackStartSamples.size() - 1; +} + +int AudioCDReader::getPositionOfTrackStart (int trackNum) const +{ + return trackStartSamples [trackNum]; +} + +const Array& AudioCDReader::getTrackOffsets() const +{ + return trackStartSamples; +} + +int AudioCDReader::getCDDBId() +{ + int checksum = 0; + const int numTracks = getNumTracks(); + + for (int i = 0; i < numTracks; ++i) + for (int offset = (trackStartSamples.getUnchecked(i) + 88200) / 44100; offset > 0; offset /= 10) + checksum += offset % 10; + + const int length = (trackStartSamples.getLast() - trackStartSamples.getFirst()) / 44100; + + // CCLLLLTT: checksum, length, tracks + return ((checksum & 0xff) << 24) | (length << 8) | numTracks; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h new file mode 100644 index 0000000000..0e868dba62 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h @@ -0,0 +1,174 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOCDREADER_H_INCLUDED +#define JUCE_AUDIOCDREADER_H_INCLUDED + +#if JUCE_USE_CDREADER || DOXYGEN + + +//============================================================================== +/** + A type of AudioFormatReader that reads from an audio CD. + + One of these can be used to read a CD as if it's one big audio stream. Use the + getPositionOfTrackStart() method to find where the individual tracks are + within the stream. + + @see AudioFormatReader +*/ +class JUCE_API AudioCDReader : public AudioFormatReader +{ +public: + //============================================================================== + /** Returns a list of names of Audio CDs currently available for reading. + + If there's a CD drive but no CD in it, this might return an empty list, or + possibly a device that can be opened but which has no tracks, depending + on the platform. + + @see createReaderForCD + */ + static StringArray getAvailableCDNames(); + + /** Tries to create an AudioFormatReader that can read from an Audio CD. + + @param index the index of one of the available CDs - use getAvailableCDNames() + to find out how many there are. + @returns a new AudioCDReader object, or nullptr if it couldn't be created. The + caller will be responsible for deleting the object returned. + */ + static AudioCDReader* createReaderForCD (const int index); + + //============================================================================== + /** Destructor. */ + ~AudioCDReader(); + + /** Implementation of the AudioFormatReader method. */ + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override; + + /** Checks whether the CD has been removed from the drive. */ + bool isCDStillPresent() const; + + /** Returns the total number of tracks (audio + data). */ + int getNumTracks() const; + + /** Finds the sample offset of the start of a track. + @param trackNum the track number, where trackNum = 0 is the first track + and trackNum = getNumTracks() means the end of the CD. + */ + int getPositionOfTrackStart (int trackNum) const; + + /** Returns true if a given track is an audio track. + @param trackNum the track number, where 0 is the first track. + */ + bool isTrackAudio (int trackNum) const; + + /** Returns an array of sample offsets for the start of each track, followed by + the sample position of the end of the CD. + */ + const Array& getTrackOffsets() const; + + /** Refreshes the object's table of contents. + + If the disc has been ejected and a different one put in since this + object was created, this will cause it to update its idea of how many tracks + there are, etc. + */ + void refreshTrackLengths(); + + /** Enables scanning for indexes within tracks. + @see getLastIndex + */ + void enableIndexScanning (bool enabled); + + /** Returns the index number found during the last read() call. + + Index scanning is turned off by default - turn it on with enableIndexScanning(). + + Then when the read() method is called, if it comes across an index within that + block, the index number is stored and returned by this method. + + Some devices might not support indexes, of course. + + (If you don't know what CD indexes are, it's unlikely you'll ever need them). + + @see enableIndexScanning + */ + int getLastIndex() const; + + /** Scans a track to find the position of any indexes within it. + @param trackNumber the track to look in, where 0 is the first track on the disc + @returns an array of sample positions of any index points found (not including + the index that marks the start of the track) + */ + Array findIndexesInTrack (const int trackNumber); + + /** Returns the CDDB id number for the CD. + It's not a great way of identifying a disc, but it's traditional. + */ + int getCDDBId(); + + /** Tries to eject the disk. + Ejecting the disk might not actually be possible, e.g. if some other process is using it. + */ + void ejectDisk(); + + //============================================================================== + enum + { + framesPerSecond = 75, + samplesPerFrame = 44100 / framesPerSecond + }; + +private: + //============================================================================== + Array trackStartSamples; + + #if JUCE_MAC + File volumeDir; + Array tracks; + int currentReaderTrack; + ScopedPointer reader; + AudioCDReader (const File& volume); + + #elif JUCE_WINDOWS + bool audioTracks [100]; + void* handle; + MemoryBlock buffer; + bool indexingEnabled; + int lastIndex, firstFrameInBuffer, samplesInBuffer; + AudioCDReader (void* handle); + int getIndexAt (int samplePos); + + #elif JUCE_LINUX + AudioCDReader(); + #endif + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDReader) +}; + +#endif +#endif // JUCE_AUDIOCDREADER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp new file mode 100644 index 0000000000..fad5eea593 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp @@ -0,0 +1,987 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioDeviceManager::AudioDeviceSetup::AudioDeviceSetup() + : sampleRate (0), + bufferSize (0), + useDefaultInputChannels (true), + useDefaultOutputChannels (true) +{ +} + +bool AudioDeviceManager::AudioDeviceSetup::operator== (const AudioDeviceManager::AudioDeviceSetup& other) const +{ + return outputDeviceName == other.outputDeviceName + && inputDeviceName == other.inputDeviceName + && sampleRate == other.sampleRate + && bufferSize == other.bufferSize + && inputChannels == other.inputChannels + && useDefaultInputChannels == other.useDefaultInputChannels + && outputChannels == other.outputChannels + && useDefaultOutputChannels == other.useDefaultOutputChannels; +} + +//============================================================================== +class AudioDeviceManager::CallbackHandler : public AudioIODeviceCallback, + public MidiInputCallback, + public AudioIODeviceType::Listener +{ +public: + CallbackHandler (AudioDeviceManager& adm) noexcept : owner (adm) {} + +private: + void audioDeviceIOCallback (const float** ins, int numIns, float** outs, int numOuts, int numSamples) override + { + owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples); + } + + void audioDeviceAboutToStart (AudioIODevice* device) override + { + owner.audioDeviceAboutToStartInt (device); + } + + void audioDeviceStopped() override + { + owner.audioDeviceStoppedInt(); + } + + void audioDeviceError (const String& message) override + { + owner.audioDeviceErrorInt (message); + } + + void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) override + { + owner.handleIncomingMidiMessageInt (source, message); + } + + void audioDeviceListChanged() override + { + owner.audioDeviceListChanged(); + } + + AudioDeviceManager& owner; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CallbackHandler) +}; + + +//============================================================================== +AudioDeviceManager::AudioDeviceManager() + : numInputChansNeeded (0), + numOutputChansNeeded (2), + listNeedsScanning (true), + useInputNames (false), + inputLevel (0), + testSoundPosition (0), + cpuUsageMs (0), + timeToCpuScale (0) +{ + callbackHandler = new CallbackHandler (*this); +} + +AudioDeviceManager::~AudioDeviceManager() +{ + currentAudioDevice = nullptr; + defaultMidiOutput = nullptr; +} + + +//============================================================================== +void AudioDeviceManager::createDeviceTypesIfNeeded() +{ + if (availableDeviceTypes.size() == 0) + { + OwnedArray types; + createAudioDeviceTypes (types); + + for (int i = 0; i < types.size(); ++i) + addAudioDeviceType (types.getUnchecked(i)); + + types.clear (false); + + if (AudioIODeviceType* first = availableDeviceTypes.getFirst()) + currentDeviceType = first->getTypeName(); + } +} + +const OwnedArray& AudioDeviceManager::getAvailableDeviceTypes() +{ + scanDevicesIfNeeded(); + return availableDeviceTypes; +} + +void AudioDeviceManager::audioDeviceListChanged() +{ + if (currentAudioDevice != nullptr) + { + currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); + currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); + currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); + currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels(); + } + + sendChangeMessage(); +} + +//============================================================================== +static void addIfNotNull (OwnedArray& list, AudioIODeviceType* const device) +{ + if (device != nullptr) + list.add (device); +} + +void AudioDeviceManager::createAudioDeviceTypes (OwnedArray& list) +{ + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_WASAPI()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_DirectSound()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ASIO()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_CoreAudio()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_iOSAudio()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ALSA()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_JACK()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_OpenSLES()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_Android()); +} + +void AudioDeviceManager::addAudioDeviceType (AudioIODeviceType* newDeviceType) +{ + if (newDeviceType != nullptr) + { + jassert (lastDeviceTypeConfigs.size() == availableDeviceTypes.size()); + availableDeviceTypes.add (newDeviceType); + lastDeviceTypeConfigs.add (new AudioDeviceSetup()); + + newDeviceType->addListener (callbackHandler); + } +} + +//============================================================================== +String AudioDeviceManager::initialise (const int numInputChannelsNeeded, + const int numOutputChannelsNeeded, + const XmlElement* const xml, + const bool selectDefaultDeviceOnFailure, + const String& preferredDefaultDeviceName, + const AudioDeviceSetup* preferredSetupOptions) +{ + scanDevicesIfNeeded(); + + numInputChansNeeded = numInputChannelsNeeded; + numOutputChansNeeded = numOutputChannelsNeeded; + + if (xml != nullptr && xml->hasTagName ("DEVICESETUP")) + return initialiseFromXML (*xml, selectDefaultDeviceOnFailure, + preferredDefaultDeviceName, preferredSetupOptions); + + return initialiseDefault (preferredDefaultDeviceName, preferredSetupOptions); +} + +String AudioDeviceManager::initialiseDefault (const String& preferredDefaultDeviceName, + const AudioDeviceSetup* preferredSetupOptions) +{ + AudioDeviceSetup setup; + + if (preferredSetupOptions != nullptr) + { + setup = *preferredSetupOptions; + } + else if (preferredDefaultDeviceName.isNotEmpty()) + { + for (int j = availableDeviceTypes.size(); --j >= 0;) + { + AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(j); + + const StringArray outs (type->getDeviceNames (false)); + + for (int i = 0; i < outs.size(); ++i) + { + if (outs[i].matchesWildcard (preferredDefaultDeviceName, true)) + { + setup.outputDeviceName = outs[i]; + break; + } + } + + const StringArray ins (type->getDeviceNames (true)); + + for (int i = 0; i < ins.size(); ++i) + { + if (ins[i].matchesWildcard (preferredDefaultDeviceName, true)) + { + setup.inputDeviceName = ins[i]; + break; + } + } + } + } + + insertDefaultDeviceNames (setup); + return setAudioDeviceSetup (setup, false); +} + +String AudioDeviceManager::initialiseFromXML (const XmlElement& xml, + const bool selectDefaultDeviceOnFailure, + const String& preferredDefaultDeviceName, + const AudioDeviceSetup* preferredSetupOptions) +{ + lastExplicitSettings = new XmlElement (xml); + + String error; + AudioDeviceSetup setup; + + if (preferredSetupOptions != nullptr) + setup = *preferredSetupOptions; + + if (xml.getStringAttribute ("audioDeviceName").isNotEmpty()) + { + setup.inputDeviceName = setup.outputDeviceName + = xml.getStringAttribute ("audioDeviceName"); + } + else + { + setup.inputDeviceName = xml.getStringAttribute ("audioInputDeviceName"); + setup.outputDeviceName = xml.getStringAttribute ("audioOutputDeviceName"); + } + + currentDeviceType = xml.getStringAttribute ("deviceType"); + + if (findType (currentDeviceType) == nullptr) + { + if (AudioIODeviceType* const type = findType (setup.inputDeviceName, setup.outputDeviceName)) + currentDeviceType = type->getTypeName(); + else if (availableDeviceTypes.size() > 0) + currentDeviceType = availableDeviceTypes.getUnchecked(0)->getTypeName(); + } + + setup.bufferSize = xml.getIntAttribute ("audioDeviceBufferSize"); + setup.sampleRate = xml.getDoubleAttribute ("audioDeviceRate"); + + setup.inputChannels .parseString (xml.getStringAttribute ("audioDeviceInChans", "11"), 2); + setup.outputChannels.parseString (xml.getStringAttribute ("audioDeviceOutChans", "11"), 2); + + setup.useDefaultInputChannels = ! xml.hasAttribute ("audioDeviceInChans"); + setup.useDefaultOutputChannels = ! xml.hasAttribute ("audioDeviceOutChans"); + + error = setAudioDeviceSetup (setup, true); + + midiInsFromXml.clear(); + + forEachXmlChildElementWithTagName (xml, c, "MIDIINPUT") + midiInsFromXml.add (c->getStringAttribute ("name")); + + const StringArray allMidiIns (MidiInput::getDevices()); + + for (int i = allMidiIns.size(); --i >= 0;) + setMidiInputEnabled (allMidiIns[i], midiInsFromXml.contains (allMidiIns[i])); + + if (error.isNotEmpty() && selectDefaultDeviceOnFailure) + error = initialise (numInputChansNeeded, numOutputChansNeeded, + nullptr, false, preferredDefaultDeviceName); + + setDefaultMidiOutput (xml.getStringAttribute ("defaultMidiOutput")); + + return error; +} + +String AudioDeviceManager::initialiseWithDefaultDevices (int numInputChannelsNeeded, + int numOutputChannelsNeeded) +{ + lastExplicitSettings = nullptr; + + return initialise (numInputChannelsNeeded, numOutputChannelsNeeded, + nullptr, false, String(), nullptr); +} + +void AudioDeviceManager::insertDefaultDeviceNames (AudioDeviceSetup& setup) const +{ + if (AudioIODeviceType* type = getCurrentDeviceTypeObject()) + { + if (setup.outputDeviceName.isEmpty()) + setup.outputDeviceName = type->getDeviceNames (false) [type->getDefaultDeviceIndex (false)]; + + if (setup.inputDeviceName.isEmpty()) + setup.inputDeviceName = type->getDeviceNames (true) [type->getDefaultDeviceIndex (true)]; + } +} + +XmlElement* AudioDeviceManager::createStateXml() const +{ + return lastExplicitSettings.createCopy(); +} + +//============================================================================== +void AudioDeviceManager::scanDevicesIfNeeded() +{ + if (listNeedsScanning) + { + listNeedsScanning = false; + + createDeviceTypesIfNeeded(); + + for (int i = availableDeviceTypes.size(); --i >= 0;) + availableDeviceTypes.getUnchecked(i)->scanForDevices(); + } +} + +AudioIODeviceType* AudioDeviceManager::findType (const String& typeName) +{ + scanDevicesIfNeeded(); + + for (int i = availableDeviceTypes.size(); --i >= 0;) + if (availableDeviceTypes.getUnchecked(i)->getTypeName() == typeName) + return availableDeviceTypes.getUnchecked(i); + + return nullptr; +} + +AudioIODeviceType* AudioDeviceManager::findType (const String& inputName, const String& outputName) +{ + scanDevicesIfNeeded(); + + for (int i = availableDeviceTypes.size(); --i >= 0;) + { + AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(i); + + if ((inputName.isNotEmpty() && type->getDeviceNames (true).contains (inputName, true)) + || (outputName.isNotEmpty() && type->getDeviceNames (false).contains (outputName, true))) + { + return type; + } + } + + return nullptr; +} + +void AudioDeviceManager::getAudioDeviceSetup (AudioDeviceSetup& setup) +{ + setup = currentSetup; +} + +void AudioDeviceManager::deleteCurrentDevice() +{ + currentAudioDevice = nullptr; + currentSetup.inputDeviceName.clear(); + currentSetup.outputDeviceName.clear(); +} + +void AudioDeviceManager::setCurrentAudioDeviceType (const String& type, + const bool treatAsChosenDevice) +{ + for (int i = 0; i < availableDeviceTypes.size(); ++i) + { + if (availableDeviceTypes.getUnchecked(i)->getTypeName() == type + && currentDeviceType != type) + { + if (currentAudioDevice != nullptr) + { + closeAudioDevice(); + Thread::sleep (1500); // allow a moment for OS devices to sort themselves out, to help + // avoid things like DirectSound/ASIO clashes + } + + currentDeviceType = type; + + AudioDeviceSetup s (*lastDeviceTypeConfigs.getUnchecked(i)); + insertDefaultDeviceNames (s); + + setAudioDeviceSetup (s, treatAsChosenDevice); + + sendChangeMessage(); + break; + } + } +} + +AudioIODeviceType* AudioDeviceManager::getCurrentDeviceTypeObject() const +{ + for (int i = 0; i < availableDeviceTypes.size(); ++i) + if (availableDeviceTypes.getUnchecked(i)->getTypeName() == currentDeviceType) + return availableDeviceTypes.getUnchecked(i); + + return availableDeviceTypes[0]; +} + +String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup, + const bool treatAsChosenDevice) +{ + jassert (&newSetup != ¤tSetup); // this will have no effect + + if (newSetup == currentSetup && currentAudioDevice != nullptr) + return String(); + + if (! (newSetup == currentSetup)) + sendChangeMessage(); + + stopDevice(); + + const String newInputDeviceName (numInputChansNeeded == 0 ? String() : newSetup.inputDeviceName); + const String newOutputDeviceName (numOutputChansNeeded == 0 ? String() : newSetup.outputDeviceName); + + String error; + AudioIODeviceType* type = getCurrentDeviceTypeObject(); + + if (type == nullptr || (newInputDeviceName.isEmpty() && newOutputDeviceName.isEmpty())) + { + deleteCurrentDevice(); + + if (treatAsChosenDevice) + updateXml(); + + return String(); + } + + if (currentSetup.inputDeviceName != newInputDeviceName + || currentSetup.outputDeviceName != newOutputDeviceName + || currentAudioDevice == nullptr) + { + deleteCurrentDevice(); + scanDevicesIfNeeded(); + + if (newOutputDeviceName.isNotEmpty() + && ! type->getDeviceNames (false).contains (newOutputDeviceName)) + { + return "No such device: " + newOutputDeviceName; + } + + if (newInputDeviceName.isNotEmpty() + && ! type->getDeviceNames (true).contains (newInputDeviceName)) + { + return "No such device: " + newInputDeviceName; + } + + currentAudioDevice = type->createDevice (newOutputDeviceName, newInputDeviceName); + + if (currentAudioDevice == nullptr) + error = "Can't open the audio device!\n\n" + "This may be because another application is currently using the same device - " + "if so, you should close any other applications and try again!"; + else + error = currentAudioDevice->getLastError(); + + if (error.isNotEmpty()) + { + deleteCurrentDevice(); + return error; + } + + if (newSetup.useDefaultInputChannels) + { + inputChannels.clear(); + inputChannels.setRange (0, numInputChansNeeded, true); + } + + if (newSetup.useDefaultOutputChannels) + { + outputChannels.clear(); + outputChannels.setRange (0, numOutputChansNeeded, true); + } + + if (newInputDeviceName.isEmpty()) inputChannels.clear(); + if (newOutputDeviceName.isEmpty()) outputChannels.clear(); + } + + if (! newSetup.useDefaultInputChannels) inputChannels = newSetup.inputChannels; + if (! newSetup.useDefaultOutputChannels) outputChannels = newSetup.outputChannels; + + currentSetup = newSetup; + + currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); + currentSetup.bufferSize = chooseBestBufferSize (newSetup.bufferSize); + + error = currentAudioDevice->open (inputChannels, + outputChannels, + currentSetup.sampleRate, + currentSetup.bufferSize); + + if (error.isEmpty()) + { + currentDeviceType = currentAudioDevice->getTypeName(); + + currentAudioDevice->start (callbackHandler); + + currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); + currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); + currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); + currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels(); + + for (int i = 0; i < availableDeviceTypes.size(); ++i) + if (availableDeviceTypes.getUnchecked (i)->getTypeName() == currentDeviceType) + *(lastDeviceTypeConfigs.getUnchecked (i)) = currentSetup; + + if (treatAsChosenDevice) + updateXml(); + } + else + { + deleteCurrentDevice(); + } + + return error; +} + +double AudioDeviceManager::chooseBestSampleRate (double rate) const +{ + jassert (currentAudioDevice != nullptr); + + const Array rates (currentAudioDevice->getAvailableSampleRates()); + + if (rate > 0 && rates.contains (rate)) + return rate; + + double lowestAbove44 = 0.0; + + for (int i = rates.size(); --i >= 0;) + { + const double sr = rates[i]; + + if (sr >= 44100.0 && (lowestAbove44 < 1.0 || sr < lowestAbove44)) + lowestAbove44 = sr; + } + + if (lowestAbove44 > 0.0) + return lowestAbove44; + + return rates[0]; +} + +int AudioDeviceManager::chooseBestBufferSize (int bufferSize) const +{ + jassert (currentAudioDevice != nullptr); + + if (bufferSize > 0 && currentAudioDevice->getAvailableBufferSizes().contains (bufferSize)) + return bufferSize; + + return currentAudioDevice->getDefaultBufferSize(); +} + +void AudioDeviceManager::stopDevice() +{ + if (currentAudioDevice != nullptr) + currentAudioDevice->stop(); + + testSound = nullptr; +} + +void AudioDeviceManager::closeAudioDevice() +{ + stopDevice(); + currentAudioDevice = nullptr; +} + +void AudioDeviceManager::restartLastAudioDevice() +{ + if (currentAudioDevice == nullptr) + { + if (currentSetup.inputDeviceName.isEmpty() + && currentSetup.outputDeviceName.isEmpty()) + { + // This method will only reload the last device that was running + // before closeAudioDevice() was called - you need to actually open + // one first, with setAudioDevice(). + jassertfalse; + return; + } + + AudioDeviceSetup s (currentSetup); + setAudioDeviceSetup (s, false); + } +} + +void AudioDeviceManager::updateXml() +{ + lastExplicitSettings = new XmlElement ("DEVICESETUP"); + + lastExplicitSettings->setAttribute ("deviceType", currentDeviceType); + lastExplicitSettings->setAttribute ("audioOutputDeviceName", currentSetup.outputDeviceName); + lastExplicitSettings->setAttribute ("audioInputDeviceName", currentSetup.inputDeviceName); + + if (currentAudioDevice != nullptr) + { + lastExplicitSettings->setAttribute ("audioDeviceRate", currentAudioDevice->getCurrentSampleRate()); + + if (currentAudioDevice->getDefaultBufferSize() != currentAudioDevice->getCurrentBufferSizeSamples()) + lastExplicitSettings->setAttribute ("audioDeviceBufferSize", currentAudioDevice->getCurrentBufferSizeSamples()); + + if (! currentSetup.useDefaultInputChannels) + lastExplicitSettings->setAttribute ("audioDeviceInChans", currentSetup.inputChannels.toString (2)); + + if (! currentSetup.useDefaultOutputChannels) + lastExplicitSettings->setAttribute ("audioDeviceOutChans", currentSetup.outputChannels.toString (2)); + } + + for (int i = 0; i < enabledMidiInputs.size(); ++i) + lastExplicitSettings->createNewChildElement ("MIDIINPUT") + ->setAttribute ("name", enabledMidiInputs[i]->getName()); + + if (midiInsFromXml.size() > 0) + { + // Add any midi devices that have been enabled before, but which aren't currently + // open because the device has been disconnected. + const StringArray availableMidiDevices (MidiInput::getDevices()); + + for (int i = 0; i < midiInsFromXml.size(); ++i) + if (! availableMidiDevices.contains (midiInsFromXml[i], true)) + lastExplicitSettings->createNewChildElement ("MIDIINPUT") + ->setAttribute ("name", midiInsFromXml[i]); + } + + if (defaultMidiOutputName.isNotEmpty()) + lastExplicitSettings->setAttribute ("defaultMidiOutput", defaultMidiOutputName); +} + +//============================================================================== +void AudioDeviceManager::addAudioCallback (AudioIODeviceCallback* newCallback) +{ + { + const ScopedLock sl (audioCallbackLock); + if (callbacks.contains (newCallback)) + return; + } + + if (currentAudioDevice != nullptr && newCallback != nullptr) + newCallback->audioDeviceAboutToStart (currentAudioDevice); + + const ScopedLock sl (audioCallbackLock); + callbacks.add (newCallback); +} + +void AudioDeviceManager::removeAudioCallback (AudioIODeviceCallback* callbackToRemove) +{ + if (callbackToRemove != nullptr) + { + bool needsDeinitialising = currentAudioDevice != nullptr; + + { + const ScopedLock sl (audioCallbackLock); + + needsDeinitialising = needsDeinitialising && callbacks.contains (callbackToRemove); + callbacks.removeFirstMatchingValue (callbackToRemove); + } + + if (needsDeinitialising) + callbackToRemove->audioDeviceStopped(); + } +} + +void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples) +{ + const ScopedLock sl (audioCallbackLock); + + if (inputLevelMeasurementEnabledCount.get() > 0 && numInputChannels > 0) + { + for (int j = 0; j < numSamples; ++j) + { + float s = 0; + + for (int i = 0; i < numInputChannels; ++i) + s += std::abs (inputChannelData[i][j]); + + s /= numInputChannels; + + const double decayFactor = 0.99992; + + if (s > inputLevel) + inputLevel = s; + else if (inputLevel > 0.001f) + inputLevel *= decayFactor; + else + inputLevel = 0; + } + } + else + { + inputLevel = 0; + } + + if (callbacks.size() > 0) + { + const double callbackStartTime = Time::getMillisecondCounterHiRes(); + + tempBuffer.setSize (jmax (1, numOutputChannels), jmax (1, numSamples), false, false, true); + + callbacks.getUnchecked(0)->audioDeviceIOCallback (inputChannelData, numInputChannels, + outputChannelData, numOutputChannels, numSamples); + + float** const tempChans = tempBuffer.getArrayOfWritePointers(); + + for (int i = callbacks.size(); --i > 0;) + { + callbacks.getUnchecked(i)->audioDeviceIOCallback (inputChannelData, numInputChannels, + tempChans, numOutputChannels, numSamples); + + for (int chan = 0; chan < numOutputChannels; ++chan) + { + if (const float* const src = tempChans [chan]) + if (float* const dst = outputChannelData [chan]) + for (int j = 0; j < numSamples; ++j) + dst[j] += src[j]; + } + } + + const double msTaken = Time::getMillisecondCounterHiRes() - callbackStartTime; + const double filterAmount = 0.2; + cpuUsageMs += filterAmount * (msTaken - cpuUsageMs); + } + else + { + for (int i = 0; i < numOutputChannels; ++i) + zeromem (outputChannelData[i], sizeof (float) * (size_t) numSamples); + } + + if (testSound != nullptr) + { + const int numSamps = jmin (numSamples, testSound->getNumSamples() - testSoundPosition); + const float* const src = testSound->getReadPointer (0, testSoundPosition); + + for (int i = 0; i < numOutputChannels; ++i) + for (int j = 0; j < numSamps; ++j) + outputChannelData [i][j] += src[j]; + + testSoundPosition += numSamps; + if (testSoundPosition >= testSound->getNumSamples()) + testSound = nullptr; + } +} + +void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device) +{ + cpuUsageMs = 0; + + const double sampleRate = device->getCurrentSampleRate(); + const int blockSize = device->getCurrentBufferSizeSamples(); + + if (sampleRate > 0.0 && blockSize > 0) + { + const double msPerBlock = 1000.0 * blockSize / sampleRate; + timeToCpuScale = (msPerBlock > 0.0) ? (1.0 / msPerBlock) : 0.0; + } + + { + const ScopedLock sl (audioCallbackLock); + for (int i = callbacks.size(); --i >= 0;) + callbacks.getUnchecked(i)->audioDeviceAboutToStart (device); + } + + sendChangeMessage(); +} + +void AudioDeviceManager::audioDeviceStoppedInt() +{ + cpuUsageMs = 0; + timeToCpuScale = 0; + sendChangeMessage(); + + const ScopedLock sl (audioCallbackLock); + for (int i = callbacks.size(); --i >= 0;) + callbacks.getUnchecked(i)->audioDeviceStopped(); +} + +void AudioDeviceManager::audioDeviceErrorInt (const String& message) +{ + const ScopedLock sl (audioCallbackLock); + for (int i = callbacks.size(); --i >= 0;) + callbacks.getUnchecked(i)->audioDeviceError (message); +} + +double AudioDeviceManager::getCpuUsage() const +{ + return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs); +} + +//============================================================================== +void AudioDeviceManager::setMidiInputEnabled (const String& name, const bool enabled) +{ + if (enabled != isMidiInputEnabled (name)) + { + if (enabled) + { + const int index = MidiInput::getDevices().indexOf (name); + + if (index >= 0) + { + if (MidiInput* const midiIn = MidiInput::openDevice (index, callbackHandler)) + { + enabledMidiInputs.add (midiIn); + midiIn->start(); + } + } + } + else + { + for (int i = enabledMidiInputs.size(); --i >= 0;) + if (enabledMidiInputs[i]->getName() == name) + enabledMidiInputs.remove (i); + } + + updateXml(); + sendChangeMessage(); + } +} + +bool AudioDeviceManager::isMidiInputEnabled (const String& name) const +{ + for (int i = enabledMidiInputs.size(); --i >= 0;) + if (enabledMidiInputs[i]->getName() == name) + return true; + + return false; +} + +void AudioDeviceManager::addMidiInputCallback (const String& name, MidiInputCallback* callbackToAdd) +{ + removeMidiInputCallback (name, callbackToAdd); + + if (name.isEmpty() || isMidiInputEnabled (name)) + { + const ScopedLock sl (midiCallbackLock); + + MidiCallbackInfo mc; + mc.deviceName = name; + mc.callback = callbackToAdd; + midiCallbacks.add (mc); + } +} + +void AudioDeviceManager::removeMidiInputCallback (const String& name, MidiInputCallback* callbackToRemove) +{ + for (int i = midiCallbacks.size(); --i >= 0;) + { + const MidiCallbackInfo& mc = midiCallbacks.getReference(i); + + if (mc.callback == callbackToRemove && mc.deviceName == name) + { + const ScopedLock sl (midiCallbackLock); + midiCallbacks.remove (i); + } + } +} + +void AudioDeviceManager::handleIncomingMidiMessageInt (MidiInput* source, const MidiMessage& message) +{ + if (! message.isActiveSense()) + { + const ScopedLock sl (midiCallbackLock); + + for (int i = 0; i < midiCallbacks.size(); ++i) + { + const MidiCallbackInfo& mc = midiCallbacks.getReference(i); + + if (mc.deviceName.isEmpty() || mc.deviceName == source->getName()) + mc.callback->handleIncomingMidiMessage (source, message); + } + } +} + +//============================================================================== +void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) +{ + if (defaultMidiOutputName != deviceName) + { + Array oldCallbacks; + + { + const ScopedLock sl (audioCallbackLock); + oldCallbacks.swapWith (callbacks); + } + + if (currentAudioDevice != nullptr) + for (int i = oldCallbacks.size(); --i >= 0;) + oldCallbacks.getUnchecked(i)->audioDeviceStopped(); + + defaultMidiOutput = nullptr; + defaultMidiOutputName = deviceName; + + if (deviceName.isNotEmpty()) + defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); + + if (currentAudioDevice != nullptr) + for (int i = oldCallbacks.size(); --i >= 0;) + oldCallbacks.getUnchecked(i)->audioDeviceAboutToStart (currentAudioDevice); + + { + const ScopedLock sl (audioCallbackLock); + oldCallbacks.swapWith (callbacks); + } + + updateXml(); + sendChangeMessage(); + } +} + +//============================================================================== +void AudioDeviceManager::playTestSound() +{ + { // cunningly nested to swap, unlock and delete in that order. + ScopedPointer oldSound; + + { + const ScopedLock sl (audioCallbackLock); + oldSound = testSound; + } + } + + testSoundPosition = 0; + + if (currentAudioDevice != nullptr) + { + const double sampleRate = currentAudioDevice->getCurrentSampleRate(); + const int soundLength = (int) sampleRate; + + const double frequency = 440.0; + const float amplitude = 0.5f; + + const double phasePerSample = double_Pi * 2.0 / (sampleRate / frequency); + + AudioSampleBuffer* const newSound = new AudioSampleBuffer (1, soundLength); + + for (int i = 0; i < soundLength; ++i) + newSound->setSample (0, i, amplitude * (float) std::sin (i * phasePerSample)); + + newSound->applyGainRamp (0, 0, soundLength / 10, 0.0f, 1.0f); + newSound->applyGainRamp (0, soundLength - soundLength / 4, soundLength / 4, 1.0f, 0.0f); + + const ScopedLock sl (audioCallbackLock); + testSound = newSound; + } +} + +void AudioDeviceManager::enableInputLevelMeasurement (const bool enableMeasurement) +{ + if (enableMeasurement) + ++inputLevelMeasurementEnabledCount; + else + --inputLevelMeasurementEnabledCount; + + inputLevel = 0; +} + +double AudioDeviceManager::getCurrentInputLevel() const +{ + jassert (inputLevelMeasurementEnabledCount.get() > 0); // you need to call enableInputLevelMeasurement() before using this! + return inputLevel; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h new file mode 100644 index 0000000000..f1e483f332 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h @@ -0,0 +1,512 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIODEVICEMANAGER_H_INCLUDED +#define JUCE_AUDIODEVICEMANAGER_H_INCLUDED + + +//============================================================================== +/** + Manages the state of some audio and midi i/o devices. + + This class keeps tracks of a currently-selected audio device, through + with which it continuously streams data from an audio callback, as well as + one or more midi inputs. + + The idea is that your application will create one global instance of this object, + and let it take care of creating and deleting specific types of audio devices + internally. So when the device is changed, your callbacks will just keep running + without having to worry about this. + + The manager can save and reload all of its device settings as XML, which + makes it very easy for you to save and reload the audio setup of your + application. + + And to make it easy to let the user change its settings, there's a component + to do just that - the AudioDeviceSelectorComponent class, which contains a set of + device selection/sample-rate/latency controls. + + To use an AudioDeviceManager, create one, and use initialise() to set it up. Then + call addAudioCallback() to register your audio callback with it, and use that to process + your audio data. + + The manager also acts as a handy hub for incoming midi messages, allowing a + listener to register for messages from either a specific midi device, or from whatever + the current default midi input device is. The listener then doesn't have to worry about + re-registering with different midi devices if they are changed or deleted. + + And yet another neat trick is that amount of CPU time being used is measured and + available with the getCpuUsage() method. + + The AudioDeviceManager is a ChangeBroadcaster, and will send a change message to + listeners whenever one of its settings is changed. + + @see AudioDeviceSelectorComponent, AudioIODevice, AudioIODeviceType +*/ +class JUCE_API AudioDeviceManager : public ChangeBroadcaster +{ +public: + //============================================================================== + /** Creates a default AudioDeviceManager. + + Initially no audio device will be selected. You should call the initialise() method + and register an audio callback with setAudioCallback() before it'll be able to + actually make any noise. + */ + AudioDeviceManager(); + + /** Destructor. */ + ~AudioDeviceManager(); + + //============================================================================== + /** + This structure holds a set of properties describing the current audio setup. + + An AudioDeviceManager uses this class to save/load its current settings, and to + specify your preferred options when opening a device. + + @see AudioDeviceManager::setAudioDeviceSetup(), AudioDeviceManager::initialise() + */ + struct JUCE_API AudioDeviceSetup + { + /** Creates an AudioDeviceSetup object. + + The default constructor sets all the member variables to indicate default values. + You can then fill-in any values you want to before passing the object to + AudioDeviceManager::initialise(). + */ + AudioDeviceSetup(); + + bool operator== (const AudioDeviceSetup& other) const; + + /** The name of the audio device used for output. + The name has to be one of the ones listed by the AudioDeviceManager's currently + selected device type. + This may be the same as the input device. + An empty string indicates the default device. + */ + String outputDeviceName; + + /** The name of the audio device used for input. + This may be the same as the output device. + An empty string indicates the default device. + */ + String inputDeviceName; + + /** The current sample rate. + This rate is used for both the input and output devices. + A value of 0 indicates that you don't care what rate is used, and the + device will choose a sensible rate for you. + */ + double sampleRate; + + /** The buffer size, in samples. + This buffer size is used for both the input and output devices. + A value of 0 indicates the default buffer size. + */ + int bufferSize; + + /** The set of active input channels. + The bits that are set in this array indicate the channels of the + input device that are active. + If useDefaultInputChannels is true, this value is ignored. + */ + BigInteger inputChannels; + + /** If this is true, it indicates that the inputChannels array + should be ignored, and instead, the device's default channels + should be used. + */ + bool useDefaultInputChannels; + + /** The set of active output channels. + The bits that are set in this array indicate the channels of the + input device that are active. + If useDefaultOutputChannels is true, this value is ignored. + */ + BigInteger outputChannels; + + /** If this is true, it indicates that the outputChannels array + should be ignored, and instead, the device's default channels + should be used. + */ + bool useDefaultOutputChannels; + }; + + + //============================================================================== + /** Opens a set of audio devices ready for use. + + This will attempt to open either a default audio device, or one that was + previously saved as XML. + + @param numInputChannelsNeeded the maximum number of input channels your app would like to + use (the actual number of channels opened may be less than + the number requested) + @param numOutputChannelsNeeded the maximum number of output channels your app would like to + use (the actual number of channels opened may be less than + the number requested) + @param savedState either a previously-saved state that was produced + by createStateXml(), or nullptr if you want the manager + to choose the best device to open. + @param selectDefaultDeviceOnFailure if true, then if the device specified in the XML + fails to open, then a default device will be used + instead. If false, then on failure, no device is + opened. + @param preferredDefaultDeviceName if this is not empty, and there's a device with this + name, then that will be used as the default device + (assuming that there wasn't one specified in the XML). + The string can actually be a simple wildcard, containing "*" + and "?" characters + @param preferredSetupOptions if this is non-null, the structure will be used as the + set of preferred settings when opening the device. If you + use this parameter, the preferredDefaultDeviceName + field will be ignored + + @returns an error message if anything went wrong, or an empty string if it worked ok. + */ + String initialise (int numInputChannelsNeeded, + int numOutputChannelsNeeded, + const XmlElement* savedState, + bool selectDefaultDeviceOnFailure, + const String& preferredDefaultDeviceName = String(), + const AudioDeviceSetup* preferredSetupOptions = nullptr); + + /** Resets everything to a default device setup, clearing any stored settings. */ + String initialiseWithDefaultDevices (int numInputChannelsNeeded, + int numOutputChannelsNeeded); + + /** Returns some XML representing the current state of the manager. + + This stores the current device, its samplerate, block size, etc, and + can be restored later with initialise(). + + Note that this can return a null pointer if no settings have been explicitly changed + (i.e. if the device manager has just been left in its default state). + */ + XmlElement* createStateXml() const; + + //============================================================================== + /** Returns the current device properties that are in use. + @see setAudioDeviceSetup + */ + void getAudioDeviceSetup (AudioDeviceSetup& result); + + /** Changes the current device or its settings. + + If you want to change a device property, like the current sample rate or + block size, you can call getAudioDeviceSetup() to retrieve the current + settings, then tweak the appropriate fields in the AudioDeviceSetup structure, + and pass it back into this method to apply the new settings. + + @param newSetup the settings that you'd like to use + @param treatAsChosenDevice if this is true and if the device opens correctly, these new + settings will be taken as having been explicitly chosen by the + user, and the next time createStateXml() is called, these settings + will be returned. If it's false, then the device is treated as a + temporary or default device, and a call to createStateXml() will + return either the last settings that were made with treatAsChosenDevice + as true, or the last XML settings that were passed into initialise(). + @returns an error message if anything went wrong, or an empty string if it worked ok. + + @see getAudioDeviceSetup + */ + String setAudioDeviceSetup (const AudioDeviceSetup& newSetup, + bool treatAsChosenDevice); + + + /** Returns the currently-active audio device. */ + AudioIODevice* getCurrentAudioDevice() const noexcept { return currentAudioDevice; } + + /** Returns the type of audio device currently in use. + @see setCurrentAudioDeviceType + */ + String getCurrentAudioDeviceType() const { return currentDeviceType; } + + /** Returns the currently active audio device type object. + Don't keep a copy of this pointer - it's owned by the device manager and could + change at any time. + */ + AudioIODeviceType* getCurrentDeviceTypeObject() const; + + /** Changes the class of audio device being used. + + This switches between, e.g. ASIO and DirectSound. On the Mac you probably won't ever call + this because there's only one type: CoreAudio. + + For a list of types, see getAvailableDeviceTypes(). + */ + void setCurrentAudioDeviceType (const String& type, + bool treatAsChosenDevice); + + /** Closes the currently-open device. + You can call restartLastAudioDevice() later to reopen it in the same state + that it was just in. + */ + void closeAudioDevice(); + + /** Tries to reload the last audio device that was running. + + Note that this only reloads the last device that was running before + closeAudioDevice() was called - it doesn't reload any kind of saved-state, + and can only be called after a device has been opened with SetAudioDevice(). + + If a device is already open, this call will do nothing. + */ + void restartLastAudioDevice(); + + //============================================================================== + /** Registers an audio callback to be used. + + The manager will redirect callbacks from whatever audio device is currently + in use to all registered callback objects. If more than one callback is + active, they will all be given the same input data, and their outputs will + be summed. + + If necessary, this method will invoke audioDeviceAboutToStart() on the callback + object before returning. + + To remove a callback, use removeAudioCallback(). + */ + void addAudioCallback (AudioIODeviceCallback* newCallback); + + /** Deregisters a previously added callback. + + If necessary, this method will invoke audioDeviceStopped() on the callback + object before returning. + + @see addAudioCallback + */ + void removeAudioCallback (AudioIODeviceCallback* callback); + + //============================================================================== + /** Returns the average proportion of available CPU being spent inside the audio callbacks. + @returns A value between 0 and 1.0 to indicate the approximate proportion of CPU + time spent in the callbacks. + */ + double getCpuUsage() const; + + //============================================================================== + /** Enables or disables a midi input device. + + The list of devices can be obtained with the MidiInput::getDevices() method. + + Any incoming messages from enabled input devices will be forwarded on to all the + listeners that have been registered with the addMidiInputCallback() method. They + can either register for messages from a particular device, or from just the + "default" midi input. + + Routing the midi input via an AudioDeviceManager means that when a listener + registers for the default midi input, this default device can be changed by the + manager without the listeners having to know about it or re-register. + + It also means that a listener can stay registered for a midi input that is disabled + or not present, so that when the input is re-enabled, the listener will start + receiving messages again. + + @see addMidiInputCallback, isMidiInputEnabled + */ + void setMidiInputEnabled (const String& midiInputDeviceName, bool enabled); + + /** Returns true if a given midi input device is being used. + @see setMidiInputEnabled + */ + bool isMidiInputEnabled (const String& midiInputDeviceName) const; + + /** Registers a listener for callbacks when midi events arrive from a midi input. + + The device name can be empty to indicate that it wants to receive all incoming + events from all the enabled MIDI inputs. Or it can be the name of one of the + MIDI input devices if it just wants the events from that device. (see + MidiInput::getDevices() for the list of device names). + + Only devices which are enabled (see the setMidiInputEnabled() method) will have their + events forwarded on to listeners. + */ + void addMidiInputCallback (const String& midiInputDeviceName, + MidiInputCallback* callback); + + /** Removes a listener that was previously registered with addMidiInputCallback(). */ + void removeMidiInputCallback (const String& midiInputDeviceName, + MidiInputCallback* callback); + + //============================================================================== + /** Sets a midi output device to use as the default. + + The list of devices can be obtained with the MidiOutput::getDevices() method. + + The specified device will be opened automatically and can be retrieved with the + getDefaultMidiOutput() method. + + Pass in an empty string to deselect all devices. For the default device, you + can use MidiOutput::getDevices() [MidiOutput::getDefaultDeviceIndex()]. + + @see getDefaultMidiOutput, getDefaultMidiOutputName + */ + void setDefaultMidiOutput (const String& deviceName); + + /** Returns the name of the default midi output. + @see setDefaultMidiOutput, getDefaultMidiOutput + */ + const String& getDefaultMidiOutputName() const noexcept { return defaultMidiOutputName; } + + /** Returns the current default midi output device. + If no device has been selected, or the device can't be opened, this will return nullptr. + @see getDefaultMidiOutputName + */ + MidiOutput* getDefaultMidiOutput() const noexcept { return defaultMidiOutput; } + + /** Returns a list of the types of device supported. */ + const OwnedArray& getAvailableDeviceTypes(); + + //============================================================================== + /** Creates a list of available types. + + This will add a set of new AudioIODeviceType objects to the specified list, to + represent each available types of device. + + You can override this if your app needs to do something specific, like avoid + using DirectSound devices, etc. + */ + virtual void createAudioDeviceTypes (OwnedArray& types); + + /** Adds a new device type to the list of types. + The manager will take ownership of the object that is passed-in. + */ + void addAudioDeviceType (AudioIODeviceType* newDeviceType); + + //============================================================================== + /** Plays a beep through the current audio device. + + This is here to allow the audio setup UI panels to easily include a "test" + button so that the user can check where the audio is coming from. + */ + void playTestSound(); + + /** Turns on level-measuring. + + When enabled, the device manager will measure the peak input level + across all channels, and you can get this level by calling getCurrentInputLevel(). + + This is mainly intended for audio setup UI panels to use to create a mic + level display, so that the user can check that they've selected the right + device. + + A simple filter is used to make the level decay smoothly, but this is + only intended for giving rough feedback, and not for any kind of accurate + measurement. + */ + void enableInputLevelMeasurement (bool enableMeasurement); + + /** Returns the current input level. + To use this, you must first enable it by calling enableInputLevelMeasurement(). + See enableInputLevelMeasurement() for more info. + */ + double getCurrentInputLevel() const; + + /** Returns the a lock that can be used to synchronise access to the audio callback. + Obviously while this is locked, you're blocking the audio thread from running, so + it must only be used for very brief periods when absolutely necessary. + */ + CriticalSection& getAudioCallbackLock() noexcept { return audioCallbackLock; } + + /** Returns the a lock that can be used to synchronise access to the midi callback. + Obviously while this is locked, you're blocking the midi system from running, so + it must only be used for very brief periods when absolutely necessary. + */ + CriticalSection& getMidiCallbackLock() noexcept { return midiCallbackLock; } + +private: + //============================================================================== + OwnedArray availableDeviceTypes; + OwnedArray lastDeviceTypeConfigs; + + AudioDeviceSetup currentSetup; + ScopedPointer currentAudioDevice; + Array callbacks; + int numInputChansNeeded, numOutputChansNeeded; + String currentDeviceType; + BigInteger inputChannels, outputChannels; + ScopedPointer lastExplicitSettings; + mutable bool listNeedsScanning; + bool useInputNames; + Atomic inputLevelMeasurementEnabledCount; + double inputLevel; + ScopedPointer testSound; + int testSoundPosition; + AudioSampleBuffer tempBuffer; + + struct MidiCallbackInfo + { + String deviceName; + MidiInputCallback* callback; + }; + + StringArray midiInsFromXml; + OwnedArray enabledMidiInputs; + Array midiCallbacks; + + String defaultMidiOutputName; + ScopedPointer defaultMidiOutput; + CriticalSection audioCallbackLock, midiCallbackLock; + + double cpuUsageMs, timeToCpuScale; + + //============================================================================== + class CallbackHandler; + friend class CallbackHandler; + friend struct ContainerDeletePolicy; + ScopedPointer callbackHandler; + + void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels, + float** outputChannelData, int totalNumOutputChannels, int numSamples); + void audioDeviceAboutToStartInt (AudioIODevice*); + void audioDeviceStoppedInt(); + void audioDeviceErrorInt (const String&); + void handleIncomingMidiMessageInt (MidiInput*, const MidiMessage&); + void audioDeviceListChanged(); + + String restartDevice (int blockSizeToUse, double sampleRateToUse, + const BigInteger& ins, const BigInteger& outs); + void stopDevice(); + + void updateXml(); + + void createDeviceTypesIfNeeded(); + void scanDevicesIfNeeded(); + void deleteCurrentDevice(); + double chooseBestSampleRate (double preferred) const; + int chooseBestBufferSize (int preferred) const; + void insertDefaultDeviceNames (AudioDeviceSetup&) const; + String initialiseDefault (const String& preferredDefaultDeviceName, const AudioDeviceSetup*); + String initialiseFromXML (const XmlElement&, bool selectDefaultDeviceOnFailure, + const String& preferredDefaultDeviceName, const AudioDeviceSetup*); + + AudioIODeviceType* findType (const String& inputName, const String& outputName); + AudioIODeviceType* findType (const String& typeName); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioDeviceManager) +}; + +#endif // JUCE_AUDIODEVICEMANAGER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp new file mode 100644 index 0000000000..95221ba037 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp @@ -0,0 +1,41 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioIODevice::AudioIODevice (const String& deviceName, const String& deviceTypeName) + : name (deviceName), typeName (deviceTypeName) +{ +} + +AudioIODevice::~AudioIODevice() {} + +void AudioIODeviceCallback::audioDeviceError (const String&) {} +bool AudioIODevice::setAudioPreprocessingEnabled (bool) { return false; } +bool AudioIODevice::hasControlPanel() const { return false; } + +bool AudioIODevice::showControlPanel() +{ + jassertfalse; // this should only be called for devices which return true from + // their hasControlPanel() method. + return false; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h new file mode 100644 index 0000000000..8ce41d091e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h @@ -0,0 +1,309 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOIODEVICE_H_INCLUDED +#define JUCE_AUDIOIODEVICE_H_INCLUDED + +class AudioIODevice; + + +//============================================================================== +/** + One of these is passed to an AudioIODevice object to stream the audio data + in and out. + + The AudioIODevice will repeatedly call this class's audioDeviceIOCallback() + method on its own high-priority audio thread, when it needs to send or receive + the next block of data. + + @see AudioIODevice, AudioDeviceManager +*/ +class JUCE_API AudioIODeviceCallback +{ +public: + /** Destructor. */ + virtual ~AudioIODeviceCallback() {} + + /** Processes a block of incoming and outgoing audio data. + + The subclass's implementation should use the incoming audio for whatever + purposes it needs to, and must fill all the output channels with the next + block of output data before returning. + + The channel data is arranged with the same array indices as the channel name + array returned by AudioIODevice::getOutputChannelNames(), but those channels + that aren't specified in AudioIODevice::open() will have a null pointer for their + associated channel, so remember to check for this. + + @param inputChannelData a set of arrays containing the audio data for each + incoming channel - this data is valid until the function + returns. There will be one channel of data for each input + channel that was enabled when the audio device was opened + (see AudioIODevice::open()) + @param numInputChannels the number of pointers to channel data in the + inputChannelData array. + @param outputChannelData a set of arrays which need to be filled with the data + that should be sent to each outgoing channel of the device. + There will be one channel of data for each output channel + that was enabled when the audio device was opened (see + AudioIODevice::open()) + The initial contents of the array is undefined, so the + callback function must fill all the channels with zeros if + its output is silence. Failing to do this could cause quite + an unpleasant noise! + @param numOutputChannels the number of pointers to channel data in the + outputChannelData array. + @param numSamples the number of samples in each channel of the input and + output arrays. The number of samples will depend on the + audio device's buffer size and will usually remain constant, + although this isn't guaranteed, so make sure your code can + cope with reasonable changes in the buffer size from one + callback to the next. + */ + virtual void audioDeviceIOCallback (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples) = 0; + + /** Called to indicate that the device is about to start calling back. + + This will be called just before the audio callbacks begin, either when this + callback has just been added to an audio device, or after the device has been + restarted because of a sample-rate or block-size change. + + You can use this opportunity to find out the sample rate and block size + that the device is going to use by calling the AudioIODevice::getCurrentSampleRate() + and AudioIODevice::getCurrentBufferSizeSamples() on the supplied pointer. + + @param device the audio IO device that will be used to drive the callback. + Note that if you're going to store this this pointer, it is + only valid until the next time that audioDeviceStopped is called. + */ + virtual void audioDeviceAboutToStart (AudioIODevice* device) = 0; + + /** Called to indicate that the device has stopped. */ + virtual void audioDeviceStopped() = 0; + + /** This can be overridden to be told if the device generates an error while operating. + Be aware that this could be called by any thread! And not all devices perform + this callback. + */ + virtual void audioDeviceError (const String& errorMessage); +}; + + +//============================================================================== +/** + Base class for an audio device with synchronised input and output channels. + + Subclasses of this are used to implement different protocols such as DirectSound, + ASIO, CoreAudio, etc. + + To create one of these, you'll need to use the AudioIODeviceType class - see the + documentation for that class for more info. + + For an easier way of managing audio devices and their settings, have a look at the + AudioDeviceManager class. + + @see AudioIODeviceType, AudioDeviceManager +*/ +class JUCE_API AudioIODevice +{ +public: + /** Destructor. */ + virtual ~AudioIODevice(); + + //============================================================================== + /** Returns the device's name, (as set in the constructor). */ + const String& getName() const noexcept { return name; } + + /** Returns the type of the device. + + E.g. "CoreAudio", "ASIO", etc. - this comes from the AudioIODeviceType that created it. + */ + const String& getTypeName() const noexcept { return typeName; } + + //============================================================================== + /** Returns the names of all the available output channels on this device. + To find out which of these are currently in use, call getActiveOutputChannels(). + */ + virtual StringArray getOutputChannelNames() = 0; + + /** Returns the names of all the available input channels on this device. + To find out which of these are currently in use, call getActiveInputChannels(). + */ + virtual StringArray getInputChannelNames() = 0; + + //============================================================================== + /** Returns the set of sample-rates this device supports. + @see getCurrentSampleRate + */ + virtual Array getAvailableSampleRates() = 0; + + /** Returns the set of buffer sizes that are available. + @see getCurrentBufferSizeSamples, getDefaultBufferSize + */ + virtual Array getAvailableBufferSizes() = 0; + + /** Returns the default buffer-size to use. + @returns a number of samples + @see getAvailableBufferSizes + */ + virtual int getDefaultBufferSize() = 0; + + //============================================================================== + /** Tries to open the device ready to play. + + @param inputChannels a BigInteger in which a set bit indicates that the corresponding + input channel should be enabled + @param outputChannels a BigInteger in which a set bit indicates that the corresponding + output channel should be enabled + @param sampleRate the sample rate to try to use - to find out which rates are + available, see getAvailableSampleRates() + @param bufferSizeSamples the size of i/o buffer to use - to find out the available buffer + sizes, see getAvailableBufferSizes() + @returns an error description if there's a problem, or an empty string if it succeeds in + opening the device + @see close + */ + virtual String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate, + int bufferSizeSamples) = 0; + + /** Closes and releases the device if it's open. */ + virtual void close() = 0; + + /** Returns true if the device is still open. + + A device might spontaneously close itself if something goes wrong, so this checks if + it's still open. + */ + virtual bool isOpen() = 0; + + /** Starts the device actually playing. + + This must be called after the device has been opened. + + @param callback the callback to use for streaming the data. + @see AudioIODeviceCallback, open + */ + virtual void start (AudioIODeviceCallback* callback) = 0; + + /** Stops the device playing. + + Once a device has been started, this will stop it. Any pending calls to the + callback class will be flushed before this method returns. + */ + virtual void stop() = 0; + + /** Returns true if the device is still calling back. + + The device might mysteriously stop, so this checks whether it's + still playing. + */ + virtual bool isPlaying() = 0; + + /** Returns the last error that happened if anything went wrong. */ + virtual String getLastError() = 0; + + //============================================================================== + /** Returns the buffer size that the device is currently using. + + If the device isn't actually open, this value doesn't really mean much. + */ + virtual int getCurrentBufferSizeSamples() = 0; + + /** Returns the sample rate that the device is currently using. + + If the device isn't actually open, this value doesn't really mean much. + */ + virtual double getCurrentSampleRate() = 0; + + /** Returns the device's current physical bit-depth. + + If the device isn't actually open, this value doesn't really mean much. + */ + virtual int getCurrentBitDepth() = 0; + + /** Returns a mask showing which of the available output channels are currently + enabled. + @see getOutputChannelNames + */ + virtual BigInteger getActiveOutputChannels() const = 0; + + /** Returns a mask showing which of the available input channels are currently + enabled. + @see getInputChannelNames + */ + virtual BigInteger getActiveInputChannels() const = 0; + + /** Returns the device's output latency. + + This is the delay in samples between a callback getting a block of data, and + that data actually getting played. + */ + virtual int getOutputLatencyInSamples() = 0; + + /** Returns the device's input latency. + + This is the delay in samples between some audio actually arriving at the soundcard, + and the callback getting passed this block of data. + */ + virtual int getInputLatencyInSamples() = 0; + + + //============================================================================== + /** True if this device can show a pop-up control panel for editing its settings. + + This is generally just true of ASIO devices. If true, you can call showControlPanel() + to display it. + */ + virtual bool hasControlPanel() const; + + /** Shows a device-specific control panel if there is one. + + This should only be called for devices which return true from hasControlPanel(). + */ + virtual bool showControlPanel(); + + /** On devices which support it, this allows automatic gain control or other + mic processing to be disabled. + If the device doesn't support this operation, it'll return false. + */ + virtual bool setAudioPreprocessingEnabled (bool shouldBeEnabled); + + //============================================================================== +protected: + /** Creates a device, setting its name and type member variables. */ + AudioIODevice (const String& deviceName, + const String& typeName); + + /** @internal */ + String name, typeName; +}; + + +#endif // JUCE_AUDIOIODEVICE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp new file mode 100644 index 0000000000..80026e7ae5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioIODeviceType::AudioIODeviceType (const String& name) + : typeName (name) +{ +} + +AudioIODeviceType::~AudioIODeviceType() +{ +} + +//============================================================================== +void AudioIODeviceType::addListener (Listener* l) { listeners.add (l); } +void AudioIODeviceType::removeListener (Listener* l) { listeners.remove (l); } + +void AudioIODeviceType::callDeviceChangeListeners() +{ + listeners.call (&AudioIODeviceType::Listener::audioDeviceListChanged); +} + +//============================================================================== +#if ! JUCE_MAC +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio() { return nullptr; } +#endif + +#if ! JUCE_IOS +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() { return nullptr; } +#endif + +#if ! (JUCE_WINDOWS && JUCE_WASAPI) +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() { return nullptr; } +#endif + +#if ! (JUCE_WINDOWS && JUCE_DIRECTSOUND) +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound() { return nullptr; } +#endif + +#if ! (JUCE_WINDOWS && JUCE_ASIO) +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO() { return nullptr; } +#endif + +#if ! (JUCE_LINUX && JUCE_ALSA) +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA() { return nullptr; } +#endif + +#if ! (JUCE_LINUX && JUCE_JACK) +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK() { return nullptr; } +#endif + +#if ! JUCE_ANDROID +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android() { return nullptr; } +#endif + +#if ! (JUCE_ANDROID && JUCE_USE_ANDROID_OPENSLES) +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES() { return nullptr; } +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h new file mode 100644 index 0000000000..d6cd99a5a6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h @@ -0,0 +1,182 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOIODEVICETYPE_H_INCLUDED +#define JUCE_AUDIOIODEVICETYPE_H_INCLUDED + + +//============================================================================== +/** + Represents a type of audio driver, such as DirectSound, ASIO, CoreAudio, etc. + + To get a list of available audio driver types, use the AudioDeviceManager::createAudioDeviceTypes() + method. Each of the objects returned can then be used to list the available + devices of that type. E.g. + @code + OwnedArray types; + myAudioDeviceManager.createAudioDeviceTypes (types); + + for (int i = 0; i < types.size(); ++i) + { + String typeName (types[i]->getTypeName()); // This will be things like "DirectSound", "CoreAudio", etc. + + types[i]->scanForDevices(); // This must be called before getting the list of devices + + StringArray deviceNames (types[i]->getDeviceNames()); // This will now return a list of available devices of this type + + for (int j = 0; j < deviceNames.size(); ++j) + { + AudioIODevice* device = types[i]->createDevice (deviceNames [j]); + + ... + } + } + @endcode + + For an easier way of managing audio devices and their settings, have a look at the + AudioDeviceManager class. + + @see AudioIODevice, AudioDeviceManager +*/ +class JUCE_API AudioIODeviceType +{ +public: + //============================================================================== + /** Returns the name of this type of driver that this object manages. + + This will be something like "DirectSound", "ASIO", "CoreAudio", "ALSA", etc. + */ + const String& getTypeName() const noexcept { return typeName; } + + //============================================================================== + /** Refreshes the object's cached list of known devices. + + This must be called at least once before calling getDeviceNames() or any of + the other device creation methods. + */ + virtual void scanForDevices() = 0; + + /** Returns the list of available devices of this type. + + The scanForDevices() method must have been called to create this list. + + @param wantInputNames only really used by DirectSound where devices are split up + into inputs and outputs, this indicates whether to use + the input or output name to refer to a pair of devices. + */ + virtual StringArray getDeviceNames (bool wantInputNames = false) const = 0; + + /** Returns the name of the default device. + + This will be one of the names from the getDeviceNames() list. + + @param forInput if true, this means that a default input device should be + returned; if false, it should return the default output + */ + virtual int getDefaultDeviceIndex (bool forInput) const = 0; + + /** Returns the index of a given device in the list of device names. + If asInput is true, it shows the index in the inputs list, otherwise it + looks for it in the outputs list. + */ + virtual int getIndexOfDevice (AudioIODevice* device, bool asInput) const = 0; + + /** Returns true if two different devices can be used for the input and output. + */ + virtual bool hasSeparateInputsAndOutputs() const = 0; + + /** Creates one of the devices of this type. + + The deviceName must be one of the strings returned by getDeviceNames(), and + scanForDevices() must have been called before this method is used. + */ + virtual AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) = 0; + + //============================================================================== + /** + A class for receiving events when audio devices are inserted or removed. + + You can register an AudioIODeviceType::Listener with an~AudioIODeviceType object + using the AudioIODeviceType::addListener() method, and it will be called when + devices of that type are added or removed. + + @see AudioIODeviceType::addListener, AudioIODeviceType::removeListener + */ + class Listener + { + public: + virtual ~Listener() {} + + /** Called when the list of available audio devices changes. */ + virtual void audioDeviceListChanged() = 0; + }; + + /** Adds a listener that will be called when this type of device is added or + removed from the system. + */ + void addListener (Listener* listener); + + /** Removes a listener that was previously added with addListener(). */ + void removeListener (Listener* listener); + + //============================================================================== + /** Destructor. */ + virtual ~AudioIODeviceType(); + + //============================================================================== + /** Creates a CoreAudio device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_CoreAudio(); + /** Creates an iOS device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_iOSAudio(); + /** Creates a WASAPI device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_WASAPI(); + /** Creates a DirectSound device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_DirectSound(); + /** Creates an ASIO device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_ASIO(); + /** Creates an ALSA device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_ALSA(); + /** Creates a JACK device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_JACK(); + /** Creates an Android device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_Android(); + /** Creates an Android OpenSLES device type if it's available on this platform, or returns null. */ + static AudioIODeviceType* createAudioIODeviceType_OpenSLES(); + +protected: + explicit AudioIODeviceType (const String& typeName); + + /** Synchronously calls all the registered device list change listeners. */ + void callDeviceChangeListeners(); + +private: + String typeName; + ListenerList listeners; + + JUCE_DECLARE_NON_COPYABLE (AudioIODeviceType) +}; + + +#endif // JUCE_AUDIOIODEVICETYPE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h new file mode 100644 index 0000000000..689e1f2919 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h @@ -0,0 +1,61 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_SYSTEMAUDIOVOLUME_H_INCLUDED +#define JUCE_SYSTEMAUDIOVOLUME_H_INCLUDED + + +//============================================================================== +/** + Contains functions to control the system's master volume. +*/ +class JUCE_API SystemAudioVolume +{ +public: + //============================================================================== + /** Returns the operating system's current volume level in the range 0 to 1.0 */ + static float JUCE_CALLTYPE getGain(); + + /** Attempts to set the operating system's current volume level. + @param newGain the level, between 0 and 1.0 + @returns true if the operation succeeds + */ + static bool JUCE_CALLTYPE setGain (float newGain); + + /** Returns true if the system's audio output is currently muted. */ + static bool JUCE_CALLTYPE isMuted(); + + /** Attempts to mute the operating system's audio output. + @param shouldBeMuted true if you want it to be muted + @returns true if the operation succeeds + */ + static bool JUCE_CALLTYPE setMuted (bool shouldBeMuted); + +private: + SystemAudioVolume(); // Don't instantiate this class, just call its static fns. + JUCE_DECLARE_NON_COPYABLE (SystemAudioVolume) +}; + + +#endif // JUCE_SYSTEMAUDIOVOLUME_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp new file mode 100644 index 0000000000..a9733db06c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp @@ -0,0 +1,227 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if defined (JUCE_AUDIO_DEVICES_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE + /* When you add this cpp file to your project, you mustn't include it in a file where you've + already included any other headers - just put it inside a file on its own, possibly with your config + flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix + header files that the compiler may be using. + */ + #error "Incorrect use of JUCE cpp file" +#endif + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" + +#include "../juce_core/native/juce_BasicNativeHeaders.h" +#include "juce_audio_devices.h" + +//============================================================================== +#if JUCE_MAC + #define Point CarbonDummyPointName + #define Component CarbonDummyCompName + #import + #import + #import + #import + #undef Point + #undef Component + +#elif JUCE_IOS + #import + #import + #import + +//============================================================================== +#elif JUCE_WINDOWS + #if JUCE_WASAPI + #include + #endif + + #if JUCE_ASIO + /* This is very frustrating - we only need to use a handful of definitions from + a couple of the header files in Steinberg's ASIO SDK, and it'd be easy to copy + about 30 lines of code into this cpp file to create a fully stand-alone ASIO + implementation... + + ..unfortunately that would break Steinberg's license agreement for use of + their SDK, so I'm not allowed to do this. + + This means that anyone who wants to use JUCE's ASIO abilities will have to: + + 1) Agree to Steinberg's licensing terms and download the ASIO SDK + (see www.steinberg.net/Steinberg/Developers.asp). + + 2) Enable this code with a global definition #define JUCE_ASIO 1. + + 3) Make sure that your header search path contains the iasiodrv.h file that + comes with the SDK. (Only about a handful of the SDK header files are actually + needed - so to simplify things, you could just copy these into your JUCE directory). + */ + #include + #endif + + #if JUCE_USE_CDBURNER + /* You'll need the Platform SDK for these headers - if you don't have it and don't + need to use CD-burning, then you might just want to set the JUCE_USE_CDBURNER flag + to 0, to avoid these includes. + */ + #include + #include + #endif + +//============================================================================== +#elif JUCE_LINUX + #if JUCE_ALSA + /* Got an include error here? If so, you've either not got ALSA installed, or you've + not got your paths set up correctly to find its header files. + + The package you need to install to get ASLA support is "libasound2-dev". + + If you don't have the ALSA library and don't want to build Juce with audio support, + just set the JUCE_ALSA flag to 0. + */ + #include + #endif + + #if JUCE_JACK + /* Got an include error here? If so, you've either not got jack-audio-connection-kit + installed, or you've not got your paths set up correctly to find its header files. + + The package you need to install to get JACK support is "libjack-dev". + + If you don't have the jack-audio-connection-kit library and don't want to build + Juce with low latency audio support, just set the JUCE_JACK flag to 0. + */ + #include + #endif + #undef SIZEOF + +//============================================================================== +#elif JUCE_ANDROID + + #if JUCE_USE_ANDROID_OPENSLES + #include + #include + #include + #endif + +#endif + +namespace juce +{ + +#include "audio_io/juce_AudioDeviceManager.cpp" +#include "audio_io/juce_AudioIODevice.cpp" +#include "audio_io/juce_AudioIODeviceType.cpp" +#include "midi_io/juce_MidiMessageCollector.cpp" +#include "midi_io/juce_MidiOutput.cpp" +#include "audio_cd/juce_AudioCDReader.cpp" +#include "sources/juce_AudioSourcePlayer.cpp" +#include "sources/juce_AudioTransportSource.cpp" +#include "native/juce_MidiDataConcatenator.h" + +//============================================================================== +#if JUCE_MAC + #include "../juce_core/native/juce_osx_ObjCHelpers.h" + #include "native/juce_mac_CoreAudio.cpp" + #include "native/juce_mac_CoreMidi.cpp" + + #if JUCE_USE_CDREADER + #include "native/juce_mac_AudioCDReader.mm" + #endif + + #if JUCE_USE_CDBURNER + #include "native/juce_mac_AudioCDBurner.mm" + #endif + +//============================================================================== +#elif JUCE_IOS + #include "native/juce_ios_Audio.cpp" + #include "native/juce_mac_CoreMidi.cpp" + +//============================================================================== +#elif JUCE_WINDOWS + #include "../juce_core/native/juce_win32_ComSmartPtr.h" + #include "../juce_events/native/juce_win32_HiddenMessageWindow.h" + + #if JUCE_WASAPI + #include "native/juce_win32_WASAPI.cpp" + #endif + + #if JUCE_DIRECTSOUND + #include "native/juce_win32_DirectSound.cpp" + #endif + + #include "native/juce_win32_Midi.cpp" + + #if JUCE_ASIO + #include "native/juce_win32_ASIO.cpp" + #endif + + #if JUCE_USE_CDREADER + #include "native/juce_win32_AudioCDReader.cpp" + #endif + + #if JUCE_USE_CDBURNER + #include "native/juce_win32_AudioCDBurner.cpp" + #endif + +//============================================================================== +#elif JUCE_LINUX + #if JUCE_ALSA + #include "native/juce_linux_ALSA.cpp" + #endif + + #include "native/juce_linux_Midi.cpp" + + #if JUCE_JACK + #include "native/juce_linux_JackAudio.cpp" + #endif + + #if JUCE_USE_CDREADER + #include "native/juce_linux_AudioCDReader.cpp" + #endif + +//============================================================================== +#elif JUCE_ANDROID + #include "../juce_core/native/juce_android_JNIHelpers.h" + #include "native/juce_android_Audio.cpp" + #include "native/juce_android_Midi.cpp" + + #if JUCE_USE_ANDROID_OPENSLES + #include "native/juce_android_OpenSL.cpp" + #endif + +#endif + +#if ! JUCE_SYSTEMAUDIOVOL_IMPLEMENTED + // None of these methods are available. (On Windows you might need to enable WASAPI for this) + float JUCE_CALLTYPE SystemAudioVolume::getGain() { jassertfalse; return 0.0f; } + bool JUCE_CALLTYPE SystemAudioVolume::setGain (float) { jassertfalse; return false; } + bool JUCE_CALLTYPE SystemAudioVolume::isMuted() { jassertfalse; return false; } + bool JUCE_CALLTYPE SystemAudioVolume::setMuted (bool) { jassertfalse; return false; } +#endif +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h new file mode 100644 index 0000000000..b8528d5bc3 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h @@ -0,0 +1,117 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIO_DEVICES_H_INCLUDED +#define JUCE_AUDIO_DEVICES_H_INCLUDED + +#include "../juce_events/juce_events.h" +#include "../juce_audio_basics/juce_audio_basics.h" +#include "../juce_audio_formats/juce_audio_formats.h" + +//============================================================================= +/** Config: JUCE_ASIO + Enables ASIO audio devices (MS Windows only). + Turning this on means that you'll need to have the Steinberg ASIO SDK installed + on your Windows build machine. + + See the comments in the ASIOAudioIODevice class's header file for more + info about this. +*/ +#ifndef JUCE_ASIO + #define JUCE_ASIO 0 +#endif + +/** Config: JUCE_WASAPI + Enables WASAPI audio devices (Windows Vista and above). +*/ +#ifndef JUCE_WASAPI + #define JUCE_WASAPI 1 +#endif + +/** Config: JUCE_DIRECTSOUND + Enables DirectSound audio (MS Windows only). +*/ +#ifndef JUCE_DIRECTSOUND + #define JUCE_DIRECTSOUND 1 +#endif + +/** Config: JUCE_ALSA + Enables ALSA audio devices (Linux only). +*/ +#ifndef JUCE_ALSA + #define JUCE_ALSA 1 +#endif + +/** Config: JUCE_JACK + Enables JACK audio devices (Linux only). +*/ +#ifndef JUCE_JACK + #define JUCE_JACK 0 +#endif + +/** Config: JUCE_USE_ANDROID_OPENSLES + Enables OpenSLES devices (Android only). +*/ +#ifndef JUCE_USE_ANDROID_OPENSLES + #if JUCE_ANDROID_API_VERSION > 8 + #define JUCE_USE_ANDROID_OPENSLES 1 + #else + #define JUCE_USE_ANDROID_OPENSLES 0 + #endif +#endif + +//============================================================================= +/** Config: JUCE_USE_CDREADER + Enables the AudioCDReader class (on supported platforms). +*/ +#ifndef JUCE_USE_CDREADER + #define JUCE_USE_CDREADER 0 +#endif + +/** Config: JUCE_USE_CDBURNER + Enables the AudioCDBurner class (on supported platforms). +*/ +#ifndef JUCE_USE_CDBURNER + #define JUCE_USE_CDBURNER 0 +#endif + +//============================================================================= +namespace juce +{ + +#include "audio_io/juce_AudioIODevice.h" +#include "audio_io/juce_AudioIODeviceType.h" +#include "audio_io/juce_SystemAudioVolume.h" +#include "midi_io/juce_MidiInput.h" +#include "midi_io/juce_MidiMessageCollector.h" +#include "midi_io/juce_MidiOutput.h" +#include "sources/juce_AudioSourcePlayer.h" +#include "sources/juce_AudioTransportSource.h" +#include "audio_cd/juce_AudioCDBurner.h" +#include "audio_cd/juce_AudioCDReader.h" +#include "audio_io/juce_AudioDeviceManager.h" + +} + +#endif // JUCE_AUDIO_DEVICES_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm new file mode 100644 index 0000000000..a135119ce2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm @@ -0,0 +1,25 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#include "juce_audio_devices.cpp" diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_module_info b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_module_info new file mode 100644 index 0000000000..6ef2131425 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/juce_module_info @@ -0,0 +1,28 @@ +{ + "id": "juce_audio_devices", + "name": "JUCE audio and midi I/O device classes", + "version": "3.0.8", + "description": "Classes to play and record from audio and midi i/o devices.", + "website": "http://www.juce.com/juce", + "license": "GPL/Commercial", + + "dependencies": [ { "id": "juce_audio_basics", "version": "matching" }, + { "id": "juce_audio_formats", "version": "matching" }, + { "id": "juce_events", "version": "matching" } ], + + "include": "juce_audio_devices.h", + + "compile": [ { "file": "juce_audio_devices.cpp", "target": "! xcode" }, + { "file": "juce_audio_devices.mm", "target": "xcode" } ], + + "browse": [ "audio_io/*", + "midi_io/*", + "sources/*", + "audio_cd/*", + "native/*" ], + + "OSXFrameworks": "CoreAudio CoreMIDI DiscRecording", + "iOSFrameworks": "AudioToolbox CoreMIDI", + "LinuxLibs": "asound", + "mingwLibs": "winmm" +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h new file mode 100644 index 0000000000..630802085b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h @@ -0,0 +1,182 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIINPUT_H_INCLUDED +#define JUCE_MIDIINPUT_H_INCLUDED + +class MidiInput; + + +//============================================================================== +/** + Receives incoming messages from a physical MIDI input device. + + This class is overridden to handle incoming midi messages. See the MidiInput + class for more details. + + @see MidiInput +*/ +class JUCE_API MidiInputCallback +{ +public: + /** Destructor. */ + virtual ~MidiInputCallback() {} + + + /** Receives an incoming message. + + A MidiInput object will call this method when a midi event arrives. It'll be + called on a high-priority system thread, so avoid doing anything time-consuming + in here, and avoid making any UI calls. You might find the MidiBuffer class helpful + for queueing incoming messages for use later. + + @param source the MidiInput object that generated the message + @param message the incoming message. The message's timestamp is set to a value + equivalent to (Time::getMillisecondCounter() / 1000.0) to specify the + time when the message arrived. + */ + virtual void handleIncomingMidiMessage (MidiInput* source, + const MidiMessage& message) = 0; + + /** Notification sent each time a packet of a multi-packet sysex message arrives. + + If a long sysex message is broken up into multiple packets, this callback is made + for each packet that arrives until the message is finished, at which point + the normal handleIncomingMidiMessage() callback will be made with the entire + message. + + The message passed in will contain the start of a sysex, but won't be finished + with the terminating 0xf7 byte. + */ + virtual void handlePartialSysexMessage (MidiInput* source, + const uint8* messageData, + int numBytesSoFar, + double timestamp) + { + // (this bit is just to avoid compiler warnings about unused variables) + (void) source; (void) messageData; (void) numBytesSoFar; (void) timestamp; + } +}; + +//============================================================================== +/** + Represents a midi input device. + + To create one of these, use the static getDevices() method to find out what inputs are + available, and then use the openDevice() method to try to open one. + + @see MidiOutput +*/ +class JUCE_API MidiInput +{ +public: + //============================================================================== + /** Returns a list of the available midi input devices. + + You can open one of the devices by passing its index into the + openDevice() method. + + @see getDefaultDeviceIndex, openDevice + */ + static StringArray getDevices(); + + /** Returns the index of the default midi input device to use. + + This refers to the index in the list returned by getDevices(). + */ + static int getDefaultDeviceIndex(); + + /** Tries to open one of the midi input devices. + + This will return a MidiInput object if it manages to open it. You can then + call start() and stop() on this device, and delete it when no longer needed. + + If the device can't be opened, this will return a null pointer. + + @param deviceIndex the index of a device from the list returned by getDevices() + @param callback the object that will receive the midi messages from this device. + + @see MidiInputCallback, getDevices + */ + static MidiInput* openDevice (int deviceIndex, + MidiInputCallback* callback); + + #if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN + /** This will try to create a new midi input device (Not available on Windows). + + This will attempt to create a new midi input device with the specified name, + for other apps to connect to. + + Returns nullptr if a device can't be created. + + @param deviceName the name to use for the new device + @param callback the object that will receive the midi messages from this device. + */ + static MidiInput* createNewDevice (const String& deviceName, + MidiInputCallback* callback); + #endif + + //============================================================================== + /** Destructor. */ + virtual ~MidiInput(); + + /** Returns the name of this device. */ + const String& getName() const noexcept { return name; } + + /** Allows you to set a custom name for the device, in case you don't like the name + it was given when created. + */ + void setName (const String& newName) noexcept { name = newName; } + + //============================================================================== + /** Starts the device running. + + After calling this, the device will start sending midi messages to the + MidiInputCallback object that was specified when the openDevice() method + was called. + + @see stop + */ + virtual void start(); + + /** Stops the device running. + + @see start + */ + virtual void stop(); + +protected: + //============================================================================== + String name; + void* internal; + + explicit MidiInput (const String& name); + +private: + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInput) +}; + + +#endif // JUCE_MIDIINPUT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp new file mode 100644 index 0000000000..28e81c0eb9 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp @@ -0,0 +1,153 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +MidiMessageCollector::MidiMessageCollector() + : lastCallbackTime (0), + sampleRate (44100.0001) +{ +} + +MidiMessageCollector::~MidiMessageCollector() +{ +} + +//============================================================================== +void MidiMessageCollector::reset (const double sampleRate_) +{ + jassert (sampleRate_ > 0); + + const ScopedLock sl (midiCallbackLock); + sampleRate = sampleRate_; + incomingMessages.clear(); + lastCallbackTime = Time::getMillisecondCounterHiRes(); +} + +void MidiMessageCollector::addMessageToQueue (const MidiMessage& message) +{ + // you need to call reset() to set the correct sample rate before using this object + jassert (sampleRate != 44100.0001); + + // the messages that come in here need to be time-stamped correctly - see MidiInput + // for details of what the number should be. + jassert (message.getTimeStamp() != 0); + + const ScopedLock sl (midiCallbackLock); + + const int sampleNumber + = (int) ((message.getTimeStamp() - 0.001 * lastCallbackTime) * sampleRate); + + incomingMessages.addEvent (message, sampleNumber); + + // if the messages don't get used for over a second, we'd better + // get rid of any old ones to avoid the queue getting too big + if (sampleNumber > sampleRate) + incomingMessages.clear (0, sampleNumber - (int) sampleRate); +} + +void MidiMessageCollector::removeNextBlockOfMessages (MidiBuffer& destBuffer, + const int numSamples) +{ + // you need to call reset() to set the correct sample rate before using this object + jassert (sampleRate != 44100.0001); + jassert (numSamples > 0); + + const double timeNow = Time::getMillisecondCounterHiRes(); + const double msElapsed = timeNow - lastCallbackTime; + + const ScopedLock sl (midiCallbackLock); + lastCallbackTime = timeNow; + + if (! incomingMessages.isEmpty()) + { + int numSourceSamples = jmax (1, roundToInt (msElapsed * 0.001 * sampleRate)); + + int startSample = 0; + int scale = 1 << 16; + + const uint8* midiData; + int numBytes, samplePosition; + + MidiBuffer::Iterator iter (incomingMessages); + + if (numSourceSamples > numSamples) + { + // if our list of events is longer than the buffer we're being + // asked for, scale them down to squeeze them all in.. + const int maxBlockLengthToUse = numSamples << 5; + + if (numSourceSamples > maxBlockLengthToUse) + { + startSample = numSourceSamples - maxBlockLengthToUse; + numSourceSamples = maxBlockLengthToUse; + iter.setNextSamplePosition (startSample); + } + + scale = (numSamples << 10) / numSourceSamples; + + while (iter.getNextEvent (midiData, numBytes, samplePosition)) + { + samplePosition = ((samplePosition - startSample) * scale) >> 10; + + destBuffer.addEvent (midiData, numBytes, + jlimit (0, numSamples - 1, samplePosition)); + } + } + else + { + // if our event list is shorter than the number we need, put them + // towards the end of the buffer + startSample = numSamples - numSourceSamples; + + while (iter.getNextEvent (midiData, numBytes, samplePosition)) + { + destBuffer.addEvent (midiData, numBytes, + jlimit (0, numSamples - 1, samplePosition + startSample)); + } + } + + incomingMessages.clear(); + } +} + +//============================================================================== +void MidiMessageCollector::handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) +{ + MidiMessage m (MidiMessage::noteOn (midiChannel, midiNoteNumber, velocity)); + m.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001); + + addMessageToQueue (m); +} + +void MidiMessageCollector::handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber) +{ + MidiMessage m (MidiMessage::noteOff (midiChannel, midiNoteNumber)); + m.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001); + + addMessageToQueue (m); +} + +void MidiMessageCollector::handleIncomingMidiMessage (MidiInput*, const MidiMessage& message) +{ + addMessageToQueue (message); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h new file mode 100644 index 0000000000..5b1673779e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h @@ -0,0 +1,104 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIMESSAGECOLLECTOR_H_INCLUDED +#define JUCE_MIDIMESSAGECOLLECTOR_H_INCLUDED + + +//============================================================================== +/** + Collects incoming realtime MIDI messages and turns them into blocks suitable for + processing by a block-based audio callback. + + The class can also be used as either a MidiKeyboardStateListener or a MidiInputCallback + so it can easily use a midi input or keyboard component as its source. + + @see MidiMessage, MidiInput +*/ +class JUCE_API MidiMessageCollector : public MidiKeyboardStateListener, + public MidiInputCallback +{ +public: + //============================================================================== + /** Creates a MidiMessageCollector. */ + MidiMessageCollector(); + + /** Destructor. */ + ~MidiMessageCollector(); + + //============================================================================== + /** Clears any messages from the queue. + + You need to call this method before starting to use the collector, so that + it knows the correct sample rate to use. + */ + void reset (double sampleRate); + + /** Takes an incoming real-time message and adds it to the queue. + + The message's timestamp is taken, and it will be ready for retrieval as part + of the block returned by the next call to removeNextBlockOfMessages(). + + This method is fully thread-safe when overlapping calls are made with + removeNextBlockOfMessages(). + */ + void addMessageToQueue (const MidiMessage& message); + + /** Removes all the pending messages from the queue as a buffer. + + This will also correct the messages' timestamps to make sure they're in + the range 0 to numSamples - 1. + + This call should be made regularly by something like an audio processing + callback, because the time that it happens is used in calculating the + midi event positions. + + This method is fully thread-safe when overlapping calls are made with + addMessageToQueue(). + + Precondition: numSamples must be greater than 0. + */ + void removeNextBlockOfMessages (MidiBuffer& destBuffer, int numSamples); + + + //============================================================================== + /** @internal */ + void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override; + /** @internal */ + void handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber) override; + /** @internal */ + void handleIncomingMidiMessage (MidiInput*, const MidiMessage&) override; + +private: + //============================================================================== + double lastCallbackTime; + CriticalSection midiCallbackLock; + MidiBuffer incomingMessages; + double sampleRate; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiMessageCollector) +}; + + +#endif // JUCE_MIDIMESSAGECOLLECTOR_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp new file mode 100644 index 0000000000..0af7d1b7c0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp @@ -0,0 +1,162 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +struct MidiOutput::PendingMessage +{ + PendingMessage (const void* const data, const int len, const double timeStamp) + : message (data, len, timeStamp) + {} + + MidiMessage message; + PendingMessage* next; +}; + +MidiOutput::MidiOutput() + : Thread ("midi out"), + internal (nullptr), + firstMessage (nullptr) +{ +} + +void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer, + const double millisecondCounterToStartAt, + double samplesPerSecondForBuffer) +{ + // You've got to call startBackgroundThread() for this to actually work.. + jassert (isThreadRunning()); + + // this needs to be a value in the future - RTFM for this method! + jassert (millisecondCounterToStartAt > 0); + + const double timeScaleFactor = 1000.0 / samplesPerSecondForBuffer; + + MidiBuffer::Iterator i (buffer); + + const uint8* data; + int len, time; + + while (i.getNextEvent (data, len, time)) + { + const double eventTime = millisecondCounterToStartAt + timeScaleFactor * time; + + PendingMessage* const m = new PendingMessage (data, len, eventTime); + + const ScopedLock sl (lock); + + if (firstMessage == nullptr || firstMessage->message.getTimeStamp() > eventTime) + { + m->next = firstMessage; + firstMessage = m; + } + else + { + PendingMessage* mm = firstMessage; + + while (mm->next != nullptr && mm->next->message.getTimeStamp() <= eventTime) + mm = mm->next; + + m->next = mm->next; + mm->next = m; + } + } + + notify(); +} + +void MidiOutput::clearAllPendingMessages() +{ + const ScopedLock sl (lock); + + while (firstMessage != nullptr) + { + PendingMessage* const m = firstMessage; + firstMessage = firstMessage->next; + delete m; + } +} + +void MidiOutput::startBackgroundThread() +{ + startThread (9); +} + +void MidiOutput::stopBackgroundThread() +{ + stopThread (5000); +} + +void MidiOutput::run() +{ + while (! threadShouldExit()) + { + uint32 now = Time::getMillisecondCounter(); + uint32 eventTime = 0; + uint32 timeToWait = 500; + + PendingMessage* message; + + { + const ScopedLock sl (lock); + message = firstMessage; + + if (message != nullptr) + { + eventTime = (uint32) roundToInt (message->message.getTimeStamp()); + + if (eventTime > now + 20) + { + timeToWait = eventTime - (now + 20); + message = nullptr; + } + else + { + firstMessage = message->next; + } + } + } + + if (message != nullptr) + { + const ScopedPointer messageDeleter (message); + + if (eventTime > now) + { + Time::waitForMillisecondCounter (eventTime); + + if (threadShouldExit()) + break; + } + + if (eventTime > now - 200) + sendMessageNow (message->message); + } + else + { + jassert (timeToWait < 1000 * 30); + wait ((int) timeToWait); + } + } + + clearAllPendingMessages(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h new file mode 100644 index 0000000000..c668f8ab22 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h @@ -0,0 +1,147 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIOUTPUT_H_INCLUDED +#define JUCE_MIDIOUTPUT_H_INCLUDED + + +//============================================================================== +/** + Controls a physical MIDI output device. + + To create one of these, use the static getDevices() method to get a list of the + available output devices, then use the openDevice() method to try to open one. + + @see MidiInput +*/ +class JUCE_API MidiOutput : private Thread +{ +public: + //============================================================================== + /** Returns a list of the available midi output devices. + + You can open one of the devices by passing its index into the + openDevice() method. + + @see getDefaultDeviceIndex, openDevice + */ + static StringArray getDevices(); + + /** Returns the index of the default midi output device to use. + + This refers to the index in the list returned by getDevices(). + */ + static int getDefaultDeviceIndex(); + + /** Tries to open one of the midi output devices. + + This will return a MidiOutput object if it manages to open it. You can then + send messages to this device, and delete it when no longer needed. + + If the device can't be opened, this will return a null pointer. + + @param deviceIndex the index of a device from the list returned by getDevices() + @see getDevices + */ + static MidiOutput* openDevice (int deviceIndex); + + + #if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN + /** This will try to create a new midi output device (Not available on Windows). + + This will attempt to create a new midi output device that other apps can connect + to and use as their midi input. + + Returns nullptr if a device can't be created. + + @param deviceName the name to use for the new device + */ + static MidiOutput* createNewDevice (const String& deviceName); + #endif + + //============================================================================== + /** Destructor. */ + virtual ~MidiOutput(); + + /** Makes this device output a midi message. + + @see MidiMessage + */ + virtual void sendMessageNow (const MidiMessage& message); + + //============================================================================== + /** This lets you supply a block of messages that will be sent out at some point + in the future. + + The MidiOutput class has an internal thread that can send out timestamped + messages - this appends a set of messages to its internal buffer, ready for + sending. + + This will only work if you've already started the thread with startBackgroundThread(). + + A time is supplied, at which the block of messages should be sent. This time uses + the same time base as Time::getMillisecondCounter(), and must be in the future. + + The samplesPerSecondForBuffer parameter indicates the number of samples per second + used by the MidiBuffer. Each event in a MidiBuffer has a sample position, and the + samplesPerSecondForBuffer value is needed to convert this sample position to a + real time. + */ + virtual void sendBlockOfMessages (const MidiBuffer& buffer, + double millisecondCounterToStartAt, + double samplesPerSecondForBuffer); + + /** Gets rid of any midi messages that had been added by sendBlockOfMessages(). + */ + virtual void clearAllPendingMessages(); + + /** Starts up a background thread so that the device can send blocks of data. + + Call this to get the device ready, before using sendBlockOfMessages(). + */ + virtual void startBackgroundThread(); + + /** Stops the background thread, and clears any pending midi events. + + @see startBackgroundThread + */ + virtual void stopBackgroundThread(); + + +protected: + //============================================================================== + void* internal; + CriticalSection lock; + struct PendingMessage; + PendingMessage* firstMessage; + + MidiOutput(); + void run() override; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutput) +}; + + +#endif // JUCE_MIDIOUTPUT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h new file mode 100644 index 0000000000..4dc70b9bb7 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h @@ -0,0 +1,187 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MIDIDATACONCATENATOR_H_INCLUDED +#define JUCE_MIDIDATACONCATENATOR_H_INCLUDED + +//============================================================================== +/** + Helper class that takes chunks of incoming midi bytes, packages them into + messages, and dispatches them to a midi callback. +*/ +class MidiDataConcatenator +{ +public: + //============================================================================== + MidiDataConcatenator (const int initialBufferSize) + : pendingData ((size_t) initialBufferSize), + pendingDataTime (0), pendingBytes (0), runningStatus (0) + { + } + + void reset() + { + pendingBytes = 0; + runningStatus = 0; + pendingDataTime = 0; + } + + template + void pushMidiData (const void* inputData, int numBytes, double time, + UserDataType* input, CallbackType& callback) + { + const uint8* d = static_cast (inputData); + + while (numBytes > 0) + { + if (pendingBytes > 0 || d[0] == 0xf0) + { + processSysex (d, numBytes, time, input, callback); + runningStatus = 0; + } + else + { + int len = 0; + uint8 data[3]; + + while (numBytes > 0) + { + // If there's a realtime message embedded in the middle of + // the normal message, handle it now.. + if (*d >= 0xf8 && *d <= 0xfe) + { + const MidiMessage m (*d++, time); + callback.handleIncomingMidiMessage (input, m); + --numBytes; + } + else + { + if (len == 0 && *d < 0x80 && runningStatus >= 0x80) + data[len++] = runningStatus; + + data[len++] = *d++; + --numBytes; + + if (len >= MidiMessage::getMessageLengthFromFirstByte (data[0])) + break; + } + } + + if (len > 0) + { + int used = 0; + const MidiMessage m (data, len, used, 0, time); + + if (used <= 0) + break; // malformed message.. + + jassert (used == len); + callback.handleIncomingMidiMessage (input, m); + runningStatus = data[0]; + } + } + } + } + +private: + template + void processSysex (const uint8*& d, int& numBytes, double time, + UserDataType* input, CallbackType& callback) + { + if (*d == 0xf0) + { + pendingBytes = 0; + pendingDataTime = time; + } + + pendingData.ensureSize ((size_t) (pendingBytes + numBytes), false); + uint8* totalMessage = static_cast (pendingData.getData()); + uint8* dest = totalMessage + pendingBytes; + + do + { + if (pendingBytes > 0 && *d >= 0x80) + { + if (*d == 0xf7) + { + *dest++ = *d++; + ++pendingBytes; + --numBytes; + break; + } + + if (*d >= 0xfa || *d == 0xf8) + { + callback.handleIncomingMidiMessage (input, MidiMessage (*d, time)); + ++d; + --numBytes; + } + else + { + pendingBytes = 0; + int used = 0; + const MidiMessage m (d, numBytes, used, 0, time); + + if (used > 0) + { + callback.handleIncomingMidiMessage (input, m); + numBytes -= used; + d += used; + } + + break; + } + } + else + { + *dest++ = *d++; + ++pendingBytes; + --numBytes; + } + } + while (numBytes > 0); + + if (pendingBytes > 0) + { + if (totalMessage [pendingBytes - 1] == 0xf7) + { + callback.handleIncomingMidiMessage (input, MidiMessage (totalMessage, pendingBytes, pendingDataTime)); + pendingBytes = 0; + } + else + { + callback.handlePartialSysexMessage (input, totalMessage, pendingBytes, pendingDataTime); + } + } + } + + MemoryBlock pendingData; + double pendingDataTime; + int pendingBytes; + uint8 runningStatus; + + JUCE_DECLARE_NON_COPYABLE (MidiDataConcatenator) +}; + +#endif // JUCE_MIDIDATACONCATENATOR_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp new file mode 100644 index 0000000000..80711da9e2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp @@ -0,0 +1,450 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +//============================================================================== +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ + STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ + STATICMETHOD (getNativeOutputSampleRate, "getNativeOutputSampleRate", "(I)I") \ + METHOD (constructor, "", "(IIIIII)V") \ + METHOD (getState, "getState", "()I") \ + METHOD (play, "play", "()V") \ + METHOD (stop, "stop", "()V") \ + METHOD (release, "release", "()V") \ + METHOD (flush, "flush", "()V") \ + METHOD (write, "write", "([SII)I") \ + +DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack"); +#undef JNI_CLASS_MEMBERS + +//============================================================================== +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ + STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ + METHOD (constructor, "", "(IIIII)V") \ + METHOD (getState, "getState", "()I") \ + METHOD (startRecording, "startRecording", "()V") \ + METHOD (stop, "stop", "()V") \ + METHOD (read, "read", "([SII)I") \ + METHOD (release, "release", "()V") \ + +DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord"); +#undef JNI_CLASS_MEMBERS + +//============================================================================== +enum +{ + CHANNEL_OUT_STEREO = 12, + CHANNEL_IN_STEREO = 12, + CHANNEL_IN_MONO = 16, + ENCODING_PCM_16BIT = 2, + STREAM_MUSIC = 3, + MODE_STREAM = 1, + STATE_UNINITIALIZED = 0 +}; + +const char* const javaAudioTypeName = "Android Audio"; + +//============================================================================== +class AndroidAudioIODevice : public AudioIODevice, + public Thread +{ +public: + //============================================================================== + AndroidAudioIODevice (const String& deviceName) + : AudioIODevice (deviceName, javaAudioTypeName), + Thread ("audio"), + minBufferSizeOut (0), minBufferSizeIn (0), callback (0), sampleRate (0), + numClientInputChannels (0), numDeviceInputChannels (0), numDeviceInputChannelsAvailable (2), + numClientOutputChannels (0), numDeviceOutputChannels (0), + actualBufferSize (0), isRunning (false), + inputChannelBuffer (1, 1), + outputChannelBuffer (1, 1) + { + JNIEnv* env = getEnv(); + sampleRate = env->CallStaticIntMethod (AudioTrack, AudioTrack.getNativeOutputSampleRate, MODE_STREAM); + + minBufferSizeOut = (int) env->CallStaticIntMethod (AudioTrack, AudioTrack.getMinBufferSize, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT); + minBufferSizeIn = (int) env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_STEREO, ENCODING_PCM_16BIT); + + if (minBufferSizeIn <= 0) + { + minBufferSizeIn = env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_MONO, ENCODING_PCM_16BIT); + + if (minBufferSizeIn > 0) + numDeviceInputChannelsAvailable = 1; + else + numDeviceInputChannelsAvailable = 0; + } + + DBG ("Audio device - min buffers: " << minBufferSizeOut << ", " << minBufferSizeIn << "; " + << sampleRate << " Hz; input chans: " << numDeviceInputChannelsAvailable); + } + + ~AndroidAudioIODevice() + { + close(); + } + + StringArray getOutputChannelNames() override + { + StringArray s; + s.add ("Left"); + s.add ("Right"); + return s; + } + + StringArray getInputChannelNames() override + { + StringArray s; + + if (numDeviceInputChannelsAvailable == 2) + { + s.add ("Left"); + s.add ("Right"); + } + else if (numDeviceInputChannelsAvailable == 1) + { + s.add ("Audio Input"); + } + + return s; + } + + Array getAvailableSampleRates() override + { + Array r; + r.add ((double) sampleRate); + return r; + } + + Array getAvailableBufferSizes() override + { + Array b; + int n = 16; + + for (int i = 0; i < 50; ++i) + { + b.add (n); + n += n < 64 ? 16 + : (n < 512 ? 32 + : (n < 1024 ? 64 + : (n < 2048 ? 128 : 256))); + } + + return b; + } + + int getDefaultBufferSize() override { return 2048; } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double requestedSampleRate, + int bufferSize) override + { + close(); + + if (sampleRate != (int) requestedSampleRate) + return "Sample rate not allowed"; + + lastError.clear(); + int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; + + numDeviceInputChannels = 0; + numDeviceOutputChannels = 0; + + activeOutputChans = outputChannels; + activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); + numClientOutputChannels = activeOutputChans.countNumberOfSetBits(); + + activeInputChans = inputChannels; + activeInputChans.setRange (2, activeInputChans.getHighestBit(), false); + numClientInputChannels = activeInputChans.countNumberOfSetBits(); + + actualBufferSize = preferredBufferSize; + inputChannelBuffer.setSize (2, actualBufferSize); + inputChannelBuffer.clear(); + outputChannelBuffer.setSize (2, actualBufferSize); + outputChannelBuffer.clear(); + + JNIEnv* env = getEnv(); + + if (numClientOutputChannels > 0) + { + numDeviceOutputChannels = 2; + outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor, + STREAM_MUSIC, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT, + (jint) (minBufferSizeOut * numDeviceOutputChannels * sizeof (int16)), MODE_STREAM)); + + if (env->CallIntMethod (outputDevice, AudioTrack.getState) != STATE_UNINITIALIZED) + isRunning = true; + else + outputDevice.clear(); // failed to open the device + } + + if (numClientInputChannels > 0 && numDeviceInputChannelsAvailable > 0) + { + numDeviceInputChannels = jmin (numClientInputChannels, numDeviceInputChannelsAvailable); + inputDevice = GlobalRef (env->NewObject (AudioRecord, AudioRecord.constructor, + 0 /* (default audio source) */, sampleRate, + numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO, + ENCODING_PCM_16BIT, + (jint) (minBufferSizeIn * numDeviceInputChannels * sizeof (int16)))); + + if (env->CallIntMethod (inputDevice, AudioRecord.getState) != STATE_UNINITIALIZED) + isRunning = true; + else + inputDevice.clear(); // failed to open the device + } + + if (isRunning) + { + if (outputDevice != nullptr) + env->CallVoidMethod (outputDevice, AudioTrack.play); + + if (inputDevice != nullptr) + env->CallVoidMethod (inputDevice, AudioRecord.startRecording); + + startThread (8); + } + else + { + closeDevices(); + } + + return lastError; + } + + void close() override + { + if (isRunning) + { + stopThread (2000); + isRunning = false; + closeDevices(); + } + } + + int getOutputLatencyInSamples() override { return (minBufferSizeOut * 3) / 4; } + int getInputLatencyInSamples() override { return (minBufferSizeIn * 3) / 4; } + bool isOpen() override { return isRunning; } + int getCurrentBufferSizeSamples() override { return actualBufferSize; } + int getCurrentBitDepth() override { return 16; } + double getCurrentSampleRate() override { return sampleRate; } + BigInteger getActiveOutputChannels() const override { return activeOutputChans; } + BigInteger getActiveInputChannels() const override { return activeInputChans; } + String getLastError() override { return lastError; } + bool isPlaying() override { return isRunning && callback != 0; } + + void start (AudioIODeviceCallback* newCallback) override + { + if (isRunning && callback != newCallback) + { + if (newCallback != nullptr) + newCallback->audioDeviceAboutToStart (this); + + const ScopedLock sl (callbackLock); + callback = newCallback; + } + } + + void stop() override + { + if (isRunning) + { + AudioIODeviceCallback* lastCallback; + + { + const ScopedLock sl (callbackLock); + lastCallback = callback; + callback = nullptr; + } + + if (lastCallback != nullptr) + lastCallback->audioDeviceStopped(); + } + } + + void run() override + { + JNIEnv* env = getEnv(); + jshortArray audioBuffer = env->NewShortArray (actualBufferSize * jmax (numDeviceOutputChannels, numDeviceInputChannels)); + + while (! threadShouldExit()) + { + if (inputDevice != nullptr) + { + jint numRead = env->CallIntMethod (inputDevice, AudioRecord.read, audioBuffer, 0, actualBufferSize * numDeviceInputChannels); + + if (numRead < actualBufferSize * numDeviceInputChannels) + { + DBG ("Audio read under-run! " << numRead); + } + + jshort* const src = env->GetShortArrayElements (audioBuffer, 0); + + for (int chan = 0; chan < inputChannelBuffer.getNumChannels(); ++chan) + { + AudioData::Pointer d (inputChannelBuffer.getWritePointer (chan)); + + if (chan < numDeviceInputChannels) + { + AudioData::Pointer s (src + chan, numDeviceInputChannels); + d.convertSamples (s, actualBufferSize); + } + else + { + d.clearSamples (actualBufferSize); + } + } + + env->ReleaseShortArrayElements (audioBuffer, src, 0); + } + + if (threadShouldExit()) + break; + + { + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + { + callback->audioDeviceIOCallback (inputChannelBuffer.getArrayOfReadPointers(), numClientInputChannels, + outputChannelBuffer.getArrayOfWritePointers(), numClientOutputChannels, + actualBufferSize); + } + else + { + outputChannelBuffer.clear(); + } + } + + if (outputDevice != nullptr) + { + if (threadShouldExit()) + break; + + jshort* const dest = env->GetShortArrayElements (audioBuffer, 0); + + for (int chan = 0; chan < numDeviceOutputChannels; ++chan) + { + AudioData::Pointer d (dest + chan, numDeviceOutputChannels); + + const float* const sourceChanData = outputChannelBuffer.getReadPointer (jmin (chan, outputChannelBuffer.getNumChannels() - 1)); + AudioData::Pointer s (sourceChanData); + d.convertSamples (s, actualBufferSize); + } + + env->ReleaseShortArrayElements (audioBuffer, dest, 0); + jint numWritten = env->CallIntMethod (outputDevice, AudioTrack.write, audioBuffer, 0, actualBufferSize * numDeviceOutputChannels); + + if (numWritten < actualBufferSize * numDeviceOutputChannels) + { + DBG ("Audio write underrun! " << numWritten); + } + } + } + } + + int minBufferSizeOut, minBufferSizeIn; + +private: + //================================================================================================== + CriticalSection callbackLock; + AudioIODeviceCallback* callback; + jint sampleRate; + int numClientInputChannels, numDeviceInputChannels, numDeviceInputChannelsAvailable; + int numClientOutputChannels, numDeviceOutputChannels; + int actualBufferSize; + bool isRunning; + String lastError; + BigInteger activeOutputChans, activeInputChans; + GlobalRef outputDevice, inputDevice; + AudioSampleBuffer inputChannelBuffer, outputChannelBuffer; + + void closeDevices() + { + if (outputDevice != nullptr) + { + outputDevice.callVoidMethod (AudioTrack.stop); + outputDevice.callVoidMethod (AudioTrack.release); + outputDevice.clear(); + } + + if (inputDevice != nullptr) + { + inputDevice.callVoidMethod (AudioRecord.stop); + inputDevice.callVoidMethod (AudioRecord.release); + inputDevice.clear(); + } + } + + JUCE_DECLARE_NON_COPYABLE (AndroidAudioIODevice) +}; + +//============================================================================== +class AndroidAudioIODeviceType : public AudioIODeviceType +{ +public: + AndroidAudioIODeviceType() : AudioIODeviceType (javaAudioTypeName) {} + + //============================================================================== + void scanForDevices() {} + StringArray getDeviceNames (bool wantInputNames) const { return StringArray (javaAudioTypeName); } + int getDefaultDeviceIndex (bool forInput) const { return 0; } + int getIndexOfDevice (AudioIODevice* device, bool asInput) const { return device != nullptr ? 0 : -1; } + bool hasSeparateInputsAndOutputs() const { return false; } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + ScopedPointer dev; + + if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) + { + dev = new AndroidAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName); + + if (dev->getCurrentSampleRate() <= 0 || dev->getDefaultBufferSize() <= 0) + dev = nullptr; + } + + return dev.release(); + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidAudioIODeviceType) +}; + + +//============================================================================== +extern bool isOpenSLAvailable(); + +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android() +{ + #if JUCE_USE_ANDROID_OPENSLES + if (isOpenSLAvailable()) + return nullptr; + #endif + + return new AndroidAudioIODeviceType(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp new file mode 100644 index 0000000000..88eeae6ed7 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +StringArray MidiOutput::getDevices() +{ + StringArray devices; + + return devices; +} + +int MidiOutput::getDefaultDeviceIndex() +{ + return 0; +} + +MidiOutput* MidiOutput::openDevice (int index) +{ + return nullptr; +} + +MidiOutput::~MidiOutput() +{ + stopBackgroundThread(); +} + +void MidiOutput::sendMessageNow (const MidiMessage&) +{ +} + +//============================================================================== +MidiInput::MidiInput (const String& name_) + : name (name_), + internal (0) +{ +} + +MidiInput::~MidiInput() +{ +} + +void MidiInput::start() +{ +} + +void MidiInput::stop() +{ +} + +int MidiInput::getDefaultDeviceIndex() +{ + return 0; +} + +StringArray MidiInput::getDevices() +{ + StringArray devs; + + return devs; +} + +MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) +{ + return nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp new file mode 100644 index 0000000000..53dc5df6be --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp @@ -0,0 +1,632 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +const char* const openSLTypeName = "Android OpenSL"; + +bool isOpenSLAvailable() +{ + DynamicLibrary library; + return library.open ("libOpenSLES.so"); +} + +//============================================================================== +class OpenSLAudioIODevice : public AudioIODevice, + public Thread +{ +public: + OpenSLAudioIODevice (const String& deviceName) + : AudioIODevice (deviceName, openSLTypeName), + Thread ("OpenSL"), + callback (nullptr), sampleRate (0), deviceOpen (false), + inputBuffer (2, 2), outputBuffer (2, 2) + { + // OpenSL has piss-poor support for determining latency, so the only way I can find to + // get a number for this is by asking the AudioTrack/AudioRecord classes.. + AndroidAudioIODevice javaDevice (String::empty); + + // this is a total guess about how to calculate the latency, but seems to vaguely agree + // with the devices I've tested.. YMMV + inputLatency = ((javaDevice.minBufferSizeIn * 2) / 3); + outputLatency = ((javaDevice.minBufferSizeOut * 2) / 3); + + const int longestLatency = jmax (inputLatency, outputLatency); + const int totalLatency = inputLatency + outputLatency; + inputLatency = ((longestLatency * inputLatency) / totalLatency) & ~15; + outputLatency = ((longestLatency * outputLatency) / totalLatency) & ~15; + } + + ~OpenSLAudioIODevice() + { + close(); + } + + bool openedOk() const { return engine.outputMixObject != nullptr; } + + StringArray getOutputChannelNames() override + { + StringArray s; + s.add ("Left"); + s.add ("Right"); + return s; + } + + StringArray getInputChannelNames() override + { + StringArray s; + s.add ("Audio Input"); + return s; + } + + Array getAvailableSampleRates() override + { + static const double rates[] = { 8000.0, 16000.0, 32000.0, 44100.0, 48000.0 }; + return Array (rates, numElementsInArray (rates)); + } + + Array getAvailableBufferSizes() override + { + static const int sizes[] = { 256, 512, 768, 1024, 1280, 1600 }; // must all be multiples of the block size + return Array (sizes, numElementsInArray (sizes)); + } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double requestedSampleRate, + int bufferSize) override + { + close(); + + lastError.clear(); + sampleRate = (int) requestedSampleRate; + + int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; + + activeOutputChans = outputChannels; + activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); + numOutputChannels = activeOutputChans.countNumberOfSetBits(); + + activeInputChans = inputChannels; + activeInputChans.setRange (1, activeInputChans.getHighestBit(), false); + numInputChannels = activeInputChans.countNumberOfSetBits(); + + actualBufferSize = preferredBufferSize; + + inputBuffer.setSize (jmax (1, numInputChannels), actualBufferSize); + outputBuffer.setSize (jmax (1, numOutputChannels), actualBufferSize); + outputBuffer.clear(); + + recorder = engine.createRecorder (numInputChannels, sampleRate); + player = engine.createPlayer (numOutputChannels, sampleRate); + + startThread (8); + + deviceOpen = true; + return lastError; + } + + void close() override + { + stop(); + stopThread (6000); + deviceOpen = false; + recorder = nullptr; + player = nullptr; + } + + int getDefaultBufferSize() override { return 1024; } + int getOutputLatencyInSamples() override { return outputLatency; } + int getInputLatencyInSamples() override { return inputLatency; } + bool isOpen() override { return deviceOpen; } + int getCurrentBufferSizeSamples() override { return actualBufferSize; } + int getCurrentBitDepth() override { return 16; } + double getCurrentSampleRate() override { return sampleRate; } + BigInteger getActiveOutputChannels() const override { return activeOutputChans; } + BigInteger getActiveInputChannels() const override { return activeInputChans; } + String getLastError() override { return lastError; } + bool isPlaying() override { return callback != nullptr; } + + void start (AudioIODeviceCallback* newCallback) override + { + stop(); + + if (deviceOpen && callback != newCallback) + { + if (newCallback != nullptr) + newCallback->audioDeviceAboutToStart (this); + + setCallback (newCallback); + } + } + + void stop() override + { + if (AudioIODeviceCallback* const oldCallback = setCallback (nullptr)) + oldCallback->audioDeviceStopped(); + } + + bool setAudioPreprocessingEnabled (bool enable) override + { + return recorder != nullptr && recorder->setAudioPreprocessingEnabled (enable); + } + +private: + //================================================================================================== + CriticalSection callbackLock; + AudioIODeviceCallback* callback; + int actualBufferSize, sampleRate; + int inputLatency, outputLatency; + bool deviceOpen; + String lastError; + BigInteger activeOutputChans, activeInputChans; + int numInputChannels, numOutputChannels; + AudioSampleBuffer inputBuffer, outputBuffer; + struct Player; + struct Recorder; + + AudioIODeviceCallback* setCallback (AudioIODeviceCallback* const newCallback) + { + const ScopedLock sl (callbackLock); + AudioIODeviceCallback* const oldCallback = callback; + callback = newCallback; + return oldCallback; + } + + void run() override + { + if (recorder != nullptr) recorder->start(); + if (player != nullptr) player->start(); + + while (! threadShouldExit()) + { + if (player != nullptr) player->writeBuffer (outputBuffer, *this); + if (recorder != nullptr) recorder->readNextBlock (inputBuffer, *this); + + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + { + callback->audioDeviceIOCallback (numInputChannels > 0 ? inputBuffer.getArrayOfReadPointers() : nullptr, numInputChannels, + numOutputChannels > 0 ? outputBuffer.getArrayOfWritePointers() : nullptr, numOutputChannels, + actualBufferSize); + } + else + { + outputBuffer.clear(); + } + } + } + + //================================================================================================== + struct Engine + { + Engine() + : engineObject (nullptr), engineInterface (nullptr), outputMixObject (nullptr) + { + if (library.open ("libOpenSLES.so")) + { + typedef SLresult (*CreateEngineFunc) (SLObjectItf*, SLuint32, const SLEngineOption*, SLuint32, const SLInterfaceID*, const SLboolean*); + + if (CreateEngineFunc createEngine = (CreateEngineFunc) library.getFunction ("slCreateEngine")) + { + check (createEngine (&engineObject, 0, nullptr, 0, nullptr, nullptr)); + + SLInterfaceID* SL_IID_ENGINE = (SLInterfaceID*) library.getFunction ("SL_IID_ENGINE"); + SL_IID_ANDROIDSIMPLEBUFFERQUEUE = (SLInterfaceID*) library.getFunction ("SL_IID_ANDROIDSIMPLEBUFFERQUEUE"); + SL_IID_PLAY = (SLInterfaceID*) library.getFunction ("SL_IID_PLAY"); + SL_IID_RECORD = (SLInterfaceID*) library.getFunction ("SL_IID_RECORD"); + SL_IID_ANDROIDCONFIGURATION = (SLInterfaceID*) library.getFunction ("SL_IID_ANDROIDCONFIGURATION"); + + check ((*engineObject)->Realize (engineObject, SL_BOOLEAN_FALSE)); + check ((*engineObject)->GetInterface (engineObject, *SL_IID_ENGINE, &engineInterface)); + + check ((*engineInterface)->CreateOutputMix (engineInterface, &outputMixObject, 0, nullptr, nullptr)); + check ((*outputMixObject)->Realize (outputMixObject, SL_BOOLEAN_FALSE)); + } + } + } + + ~Engine() + { + if (outputMixObject != nullptr) (*outputMixObject)->Destroy (outputMixObject); + if (engineObject != nullptr) (*engineObject)->Destroy (engineObject); + } + + Player* createPlayer (const int numChannels, const int sampleRate) + { + if (numChannels <= 0) + return nullptr; + + ScopedPointer player (new Player (numChannels, sampleRate, *this)); + return player->openedOk() ? player.release() : nullptr; + } + + Recorder* createRecorder (const int numChannels, const int sampleRate) + { + if (numChannels <= 0) + return nullptr; + + ScopedPointer recorder (new Recorder (numChannels, sampleRate, *this)); + return recorder->openedOk() ? recorder.release() : nullptr; + } + + SLObjectItf engineObject; + SLEngineItf engineInterface; + SLObjectItf outputMixObject; + + SLInterfaceID* SL_IID_ANDROIDSIMPLEBUFFERQUEUE; + SLInterfaceID* SL_IID_PLAY; + SLInterfaceID* SL_IID_RECORD; + SLInterfaceID* SL_IID_ANDROIDCONFIGURATION; + + private: + DynamicLibrary library; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Engine) + }; + + //================================================================================================== + struct BufferList + { + BufferList (const int numChannels_) + : numChannels (numChannels_), bufferSpace (numChannels_ * numSamples * numBuffers), nextBlock (0) + { + } + + int16* waitForFreeBuffer (Thread& threadToCheck) + { + while (numBlocksOut.get() == numBuffers) + { + dataArrived.wait (1); + + if (threadToCheck.threadShouldExit()) + return nullptr; + } + + return getNextBuffer(); + } + + int16* getNextBuffer() + { + if (++nextBlock == numBuffers) + nextBlock = 0; + + return bufferSpace + nextBlock * numChannels * numSamples; + } + + void bufferReturned() { --numBlocksOut; dataArrived.signal(); } + void bufferSent() { ++numBlocksOut; dataArrived.signal(); } + + int getBufferSizeBytes() const { return numChannels * numSamples * sizeof (int16); } + + const int numChannels; + enum { numSamples = 256, numBuffers = 16 }; + + private: + HeapBlock bufferSpace; + int nextBlock; + Atomic numBlocksOut; + WaitableEvent dataArrived; + }; + + //================================================================================================== + struct Player + { + Player (int numChannels, int sampleRate, Engine& engine) + : playerObject (nullptr), playerPlay (nullptr), playerBufferQueue (nullptr), + bufferList (numChannels) + { + jassert (numChannels == 2); + + SLDataFormat_PCM pcmFormat = + { + SL_DATAFORMAT_PCM, + (SLuint32) numChannels, + (SLuint32) (sampleRate * 1000), // (sample rate units are millihertz) + SL_PCMSAMPLEFORMAT_FIXED_16, + SL_PCMSAMPLEFORMAT_FIXED_16, + SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, + SL_BYTEORDER_LITTLEENDIAN + }; + + SLDataLocator_AndroidSimpleBufferQueue bufferQueue = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, bufferList.numBuffers }; + SLDataSource audioSrc = { &bufferQueue, &pcmFormat }; + + SLDataLocator_OutputMix outputMix = { SL_DATALOCATOR_OUTPUTMIX, engine.outputMixObject }; + SLDataSink audioSink = { &outputMix, nullptr }; + + // (SL_IID_BUFFERQUEUE is not guaranteed to remain future-proof, so use SL_IID_ANDROIDSIMPLEBUFFERQUEUE) + const SLInterfaceID interfaceIDs[] = { *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; + const SLboolean flags[] = { SL_BOOLEAN_TRUE }; + + check ((*engine.engineInterface)->CreateAudioPlayer (engine.engineInterface, &playerObject, &audioSrc, &audioSink, + 1, interfaceIDs, flags)); + + check ((*playerObject)->Realize (playerObject, SL_BOOLEAN_FALSE)); + check ((*playerObject)->GetInterface (playerObject, *engine.SL_IID_PLAY, &playerPlay)); + check ((*playerObject)->GetInterface (playerObject, *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &playerBufferQueue)); + check ((*playerBufferQueue)->RegisterCallback (playerBufferQueue, staticCallback, this)); + } + + ~Player() + { + if (playerPlay != nullptr) + check ((*playerPlay)->SetPlayState (playerPlay, SL_PLAYSTATE_STOPPED)); + + if (playerBufferQueue != nullptr) + check ((*playerBufferQueue)->Clear (playerBufferQueue)); + + if (playerObject != nullptr) + (*playerObject)->Destroy (playerObject); + } + + bool openedOk() const noexcept { return playerBufferQueue != nullptr; } + + void start() + { + jassert (openedOk()); + check ((*playerPlay)->SetPlayState (playerPlay, SL_PLAYSTATE_PLAYING)); + } + + void writeBuffer (const AudioSampleBuffer& buffer, Thread& thread) + { + jassert (buffer.getNumChannels() == bufferList.numChannels); + jassert (buffer.getNumSamples() < bufferList.numSamples * bufferList.numBuffers); + + int offset = 0; + int numSamples = buffer.getNumSamples(); + + while (numSamples > 0) + { + int16* const destBuffer = bufferList.waitForFreeBuffer (thread); + + if (destBuffer == nullptr) + break; + + for (int i = 0; i < bufferList.numChannels; ++i) + { + typedef AudioData::Pointer DstSampleType; + typedef AudioData::Pointer SrcSampleType; + + DstSampleType dstData (destBuffer + i, bufferList.numChannels); + SrcSampleType srcData (buffer.getReadPointer (i, offset)); + dstData.convertSamples (srcData, bufferList.numSamples); + } + + check ((*playerBufferQueue)->Enqueue (playerBufferQueue, destBuffer, bufferList.getBufferSizeBytes())); + bufferList.bufferSent(); + + numSamples -= bufferList.numSamples; + offset += bufferList.numSamples; + } + } + + private: + SLObjectItf playerObject; + SLPlayItf playerPlay; + SLAndroidSimpleBufferQueueItf playerBufferQueue; + + BufferList bufferList; + + static void staticCallback (SLAndroidSimpleBufferQueueItf queue, void* context) + { + jassert (queue == static_cast (context)->playerBufferQueue); (void) queue; + static_cast (context)->bufferList.bufferReturned(); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Player) + }; + + //================================================================================================== + struct Recorder + { + Recorder (int numChannels, int sampleRate, Engine& engine) + : recorderObject (nullptr), recorderRecord (nullptr), + recorderBufferQueue (nullptr), configObject (nullptr), + bufferList (numChannels) + { + jassert (numChannels == 1); // STEREO doesn't always work!! + + SLDataFormat_PCM pcmFormat = + { + SL_DATAFORMAT_PCM, + (SLuint32) numChannels, + (SLuint32) (sampleRate * 1000), // (sample rate units are millihertz) + SL_PCMSAMPLEFORMAT_FIXED_16, + SL_PCMSAMPLEFORMAT_FIXED_16, + (numChannels == 1) ? SL_SPEAKER_FRONT_CENTER : (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT), + SL_BYTEORDER_LITTLEENDIAN + }; + + SLDataLocator_IODevice ioDevice = { SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, nullptr }; + SLDataSource audioSrc = { &ioDevice, nullptr }; + + SLDataLocator_AndroidSimpleBufferQueue bufferQueue = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, bufferList.numBuffers }; + SLDataSink audioSink = { &bufferQueue, &pcmFormat }; + + const SLInterfaceID interfaceIDs[] = { *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; + const SLboolean flags[] = { SL_BOOLEAN_TRUE }; + + if (check ((*engine.engineInterface)->CreateAudioRecorder (engine.engineInterface, &recorderObject, &audioSrc, + &audioSink, 1, interfaceIDs, flags))) + { + if (check ((*recorderObject)->Realize (recorderObject, SL_BOOLEAN_FALSE))) + { + check ((*recorderObject)->GetInterface (recorderObject, *engine.SL_IID_RECORD, &recorderRecord)); + check ((*recorderObject)->GetInterface (recorderObject, *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &recorderBufferQueue)); + check ((*recorderObject)->GetInterface (recorderObject, *engine.SL_IID_ANDROIDCONFIGURATION, &configObject)); + check ((*recorderBufferQueue)->RegisterCallback (recorderBufferQueue, staticCallback, this)); + check ((*recorderRecord)->SetRecordState (recorderRecord, SL_RECORDSTATE_STOPPED)); + + for (int i = bufferList.numBuffers; --i >= 0;) + { + int16* const buffer = bufferList.getNextBuffer(); + jassert (buffer != nullptr); + enqueueBuffer (buffer); + } + } + } + } + + ~Recorder() + { + if (recorderRecord != nullptr) + check ((*recorderRecord)->SetRecordState (recorderRecord, SL_RECORDSTATE_STOPPED)); + + if (recorderBufferQueue != nullptr) + check ((*recorderBufferQueue)->Clear (recorderBufferQueue)); + + if (recorderObject != nullptr) + (*recorderObject)->Destroy (recorderObject); + } + + bool openedOk() const noexcept { return recorderBufferQueue != nullptr; } + + void start() + { + jassert (openedOk()); + check ((*recorderRecord)->SetRecordState (recorderRecord, SL_RECORDSTATE_RECORDING)); + } + + void readNextBlock (AudioSampleBuffer& buffer, Thread& thread) + { + jassert (buffer.getNumChannels() == bufferList.numChannels); + jassert (buffer.getNumSamples() < bufferList.numSamples * bufferList.numBuffers); + jassert ((buffer.getNumSamples() % bufferList.numSamples) == 0); + + int offset = 0; + int numSamples = buffer.getNumSamples(); + + while (numSamples > 0) + { + int16* const srcBuffer = bufferList.waitForFreeBuffer (thread); + + if (srcBuffer == nullptr) + break; + + for (int i = 0; i < bufferList.numChannels; ++i) + { + typedef AudioData::Pointer DstSampleType; + typedef AudioData::Pointer SrcSampleType; + + DstSampleType dstData (buffer.getWritePointer (i, offset)); + SrcSampleType srcData (srcBuffer + i, bufferList.numChannels); + dstData.convertSamples (srcData, bufferList.numSamples); + } + + enqueueBuffer (srcBuffer); + + numSamples -= bufferList.numSamples; + offset += bufferList.numSamples; + } + } + + bool setAudioPreprocessingEnabled (bool enable) + { + SLuint32 mode = enable ? SL_ANDROID_RECORDING_PRESET_GENERIC + : SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION; + + return configObject != nullptr + && check ((*configObject)->SetConfiguration (configObject, SL_ANDROID_KEY_RECORDING_PRESET, &mode, sizeof (mode))); + } + + private: + SLObjectItf recorderObject; + SLRecordItf recorderRecord; + SLAndroidSimpleBufferQueueItf recorderBufferQueue; + SLAndroidConfigurationItf configObject; + + BufferList bufferList; + + void enqueueBuffer (int16* buffer) + { + check ((*recorderBufferQueue)->Enqueue (recorderBufferQueue, buffer, bufferList.getBufferSizeBytes())); + bufferList.bufferSent(); + } + + static void staticCallback (SLAndroidSimpleBufferQueueItf queue, void* context) + { + jassert (queue == static_cast (context)->recorderBufferQueue); (void) queue; + static_cast (context)->bufferList.bufferReturned(); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Recorder) + }; + + + //============================================================================== + Engine engine; + + ScopedPointer player; + ScopedPointer recorder; + + //============================================================================== + static bool check (const SLresult result) + { + jassert (result == SL_RESULT_SUCCESS); + return result == SL_RESULT_SUCCESS; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenSLAudioIODevice) +}; + + +//============================================================================== +class OpenSLAudioDeviceType : public AudioIODeviceType +{ +public: + OpenSLAudioDeviceType() : AudioIODeviceType (openSLTypeName) {} + + //============================================================================== + void scanForDevices() {} + StringArray getDeviceNames (bool wantInputNames) const { return StringArray (openSLTypeName); } + int getDefaultDeviceIndex (bool forInput) const { return 0; } + int getIndexOfDevice (AudioIODevice* device, bool asInput) const { return device != nullptr ? 0 : -1; } + bool hasSeparateInputsAndOutputs() const { return false; } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + ScopedPointer dev; + + if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) + { + dev = new OpenSLAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName); + if (! dev->openedOk()) + dev = nullptr; + } + + return dev.release(); + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenSLAudioDeviceType) +}; + + +//============================================================================== +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES() +{ + return isOpenSLAvailable() ? new OpenSLAudioDeviceType() : nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp new file mode 100644 index 0000000000..70490aa54e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -0,0 +1,576 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +class iOSAudioIODevice : public AudioIODevice +{ +public: + iOSAudioIODevice (const String& deviceName) + : AudioIODevice (deviceName, "Audio"), + actualBufferSize (0), + isRunning (false), + audioUnit (0), + callback (nullptr), + floatData (1, 2) + { + getSessionHolder().activeDevices.add (this); + + numInputChannels = 2; + numOutputChannels = 2; + preferredBufferSize = 0; + + updateDeviceInfo(); + } + + ~iOSAudioIODevice() + { + getSessionHolder().activeDevices.removeFirstMatchingValue (this); + close(); + } + + StringArray getOutputChannelNames() override + { + StringArray s; + s.add ("Left"); + s.add ("Right"); + return s; + } + + StringArray getInputChannelNames() override + { + StringArray s; + if (audioInputIsAvailable) + { + s.add ("Left"); + s.add ("Right"); + } + return s; + } + + Array getAvailableSampleRates() override + { + // can't find a good way to actually ask the device for which of these it supports.. + static const double rates[] = { 8000.0, 16000.0, 22050.0, 32000.0, 44100.0, 48000.0 }; + return Array (rates, numElementsInArray (rates)); + } + + Array getAvailableBufferSizes() override + { + Array r; + + for (int i = 6; i < 12; ++i) + r.add (1 << i); + + return r; + } + + int getDefaultBufferSize() override { return 1024; } + + String open (const BigInteger& inputChannelsWanted, + const BigInteger& outputChannelsWanted, + double targetSampleRate, int bufferSize) override + { + close(); + + lastError.clear(); + preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; + + // xxx set up channel mapping + + activeOutputChans = outputChannelsWanted; + activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); + numOutputChannels = activeOutputChans.countNumberOfSetBits(); + monoOutputChannelNumber = activeOutputChans.findNextSetBit (0); + + activeInputChans = inputChannelsWanted; + activeInputChans.setRange (2, activeInputChans.getHighestBit(), false); + numInputChannels = activeInputChans.countNumberOfSetBits(); + monoInputChannelNumber = activeInputChans.findNextSetBit (0); + + AudioSessionSetActive (true); + + if (numInputChannels > 0 && audioInputIsAvailable) + { + setSessionUInt32Property (kAudioSessionProperty_AudioCategory, kAudioSessionCategory_PlayAndRecord); + setSessionUInt32Property (kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, 1); + } + else + { + setSessionUInt32Property (kAudioSessionProperty_AudioCategory, kAudioSessionCategory_MediaPlayback); + } + + AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, routingChangedStatic, this); + + fixAudioRouteIfSetToReceiver(); + + setSessionFloat64Property (kAudioSessionProperty_PreferredHardwareSampleRate, targetSampleRate); + updateDeviceInfo(); + + setSessionFloat32Property (kAudioSessionProperty_PreferredHardwareIOBufferDuration, preferredBufferSize / sampleRate); + updateCurrentBufferSize(); + + prepareFloatBuffers (actualBufferSize); + + isRunning = true; + routingChanged (nullptr); // creates and starts the AU + + lastError = audioUnit != 0 ? "" : "Couldn't open the device"; + return lastError; + } + + void close() override + { + if (isRunning) + { + isRunning = false; + + setSessionUInt32Property (kAudioSessionProperty_AudioCategory, kAudioSessionCategory_MediaPlayback); + + AudioSessionRemovePropertyListenerWithUserData (kAudioSessionProperty_AudioRouteChange, routingChangedStatic, this); + AudioSessionSetActive (false); + + if (audioUnit != 0) + { + AudioComponentInstanceDispose (audioUnit); + audioUnit = 0; + } + } + } + + bool isOpen() override { return isRunning; } + + int getCurrentBufferSizeSamples() override { return actualBufferSize; } + double getCurrentSampleRate() override { return sampleRate; } + int getCurrentBitDepth() override { return 16; } + + BigInteger getActiveOutputChannels() const override { return activeOutputChans; } + BigInteger getActiveInputChannels() const override { return activeInputChans; } + + int getOutputLatencyInSamples() override { return getLatency (kAudioSessionProperty_CurrentHardwareOutputLatency); } + int getInputLatencyInSamples() override { return getLatency (kAudioSessionProperty_CurrentHardwareInputLatency); } + + int getLatency (AudioSessionPropertyID propID) + { + Float32 latency = 0; + getSessionProperty (propID, latency); + return roundToInt (latency * getCurrentSampleRate()); + } + + void start (AudioIODeviceCallback* newCallback) override + { + if (isRunning && callback != newCallback) + { + if (newCallback != nullptr) + newCallback->audioDeviceAboutToStart (this); + + const ScopedLock sl (callbackLock); + callback = newCallback; + } + } + + void stop() override + { + if (isRunning) + { + AudioIODeviceCallback* lastCallback; + + { + const ScopedLock sl (callbackLock); + lastCallback = callback; + callback = nullptr; + } + + if (lastCallback != nullptr) + lastCallback->audioDeviceStopped(); + } + } + + bool isPlaying() override { return isRunning && callback != nullptr; } + String getLastError() override { return lastError; } + + bool setAudioPreprocessingEnabled (bool enable) override + { + return setSessionUInt32Property (kAudioSessionProperty_Mode, enable ? kAudioSessionMode_Default + : kAudioSessionMode_Measurement); + } + +private: + //================================================================================================== + CriticalSection callbackLock; + Float64 sampleRate; + int numInputChannels, numOutputChannels; + int preferredBufferSize, actualBufferSize; + bool isRunning; + String lastError; + + AudioStreamBasicDescription format; + AudioUnit audioUnit; + UInt32 audioInputIsAvailable; + AudioIODeviceCallback* callback; + BigInteger activeOutputChans, activeInputChans; + + AudioSampleBuffer floatData; + float* inputChannels[3]; + float* outputChannels[3]; + bool monoInputChannelNumber, monoOutputChannelNumber; + + void prepareFloatBuffers (int bufferSize) + { + if (numInputChannels + numOutputChannels > 0) + { + floatData.setSize (numInputChannels + numOutputChannels, bufferSize); + zeromem (inputChannels, sizeof (inputChannels)); + zeromem (outputChannels, sizeof (outputChannels)); + + for (int i = 0; i < numInputChannels; ++i) + inputChannels[i] = floatData.getWritePointer (i); + + for (int i = 0; i < numOutputChannels; ++i) + outputChannels[i] = floatData.getWritePointer (i + numInputChannels); + } + } + + //================================================================================================== + OSStatus process (AudioUnitRenderActionFlags* flags, const AudioTimeStamp* time, + const UInt32 numFrames, AudioBufferList* data) + { + OSStatus err = noErr; + + if (audioInputIsAvailable && numInputChannels > 0) + err = AudioUnitRender (audioUnit, flags, time, 1, numFrames, data); + + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + { + if ((int) numFrames > floatData.getNumSamples()) + prepareFloatBuffers ((int) numFrames); + + if (audioInputIsAvailable && numInputChannels > 0) + { + short* shortData = (short*) data->mBuffers[0].mData; + + if (numInputChannels >= 2) + { + for (UInt32 i = 0; i < numFrames; ++i) + { + inputChannels[0][i] = *shortData++ * (1.0f / 32768.0f); + inputChannels[1][i] = *shortData++ * (1.0f / 32768.0f); + } + } + else + { + if (monoInputChannelNumber > 0) + ++shortData; + + for (UInt32 i = 0; i < numFrames; ++i) + { + inputChannels[0][i] = *shortData++ * (1.0f / 32768.0f); + ++shortData; + } + } + } + else + { + for (int i = numInputChannels; --i >= 0;) + zeromem (inputChannels[i], sizeof (float) * numFrames); + } + + callback->audioDeviceIOCallback ((const float**) inputChannels, numInputChannels, + outputChannels, numOutputChannels, (int) numFrames); + + short* shortData = (short*) data->mBuffers[0].mData; + int n = 0; + + if (numOutputChannels >= 2) + { + for (UInt32 i = 0; i < numFrames; ++i) + { + shortData [n++] = (short) (outputChannels[0][i] * 32767.0f); + shortData [n++] = (short) (outputChannels[1][i] * 32767.0f); + } + } + else if (numOutputChannels == 1) + { + for (UInt32 i = 0; i < numFrames; ++i) + { + const short s = (short) (outputChannels[monoOutputChannelNumber][i] * 32767.0f); + shortData [n++] = s; + shortData [n++] = s; + } + } + else + { + zeromem (data->mBuffers[0].mData, 2 * sizeof (short) * numFrames); + } + } + else + { + zeromem (data->mBuffers[0].mData, 2 * sizeof (short) * numFrames); + } + + return err; + } + + void updateDeviceInfo() + { + getSessionProperty (kAudioSessionProperty_CurrentHardwareSampleRate, sampleRate); + getSessionProperty (kAudioSessionProperty_AudioInputAvailable, audioInputIsAvailable); + } + + void updateCurrentBufferSize() + { + Float32 bufferDuration = sampleRate > 0 ? (Float32) (preferredBufferSize / sampleRate) : 0.0f; + getSessionProperty (kAudioSessionProperty_CurrentHardwareIOBufferDuration, bufferDuration); + actualBufferSize = (int) (sampleRate * bufferDuration + 0.5); + } + + void routingChanged (const void* propertyValue) + { + if (! isRunning) + return; + + if (propertyValue != nullptr) + { + CFDictionaryRef routeChangeDictionary = (CFDictionaryRef) propertyValue; + CFNumberRef routeChangeReasonRef = (CFNumberRef) CFDictionaryGetValue (routeChangeDictionary, + CFSTR (kAudioSession_AudioRouteChangeKey_Reason)); + + SInt32 routeChangeReason; + CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); + + if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) + { + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + callback->audioDeviceError ("Old device unavailable"); + } + } + + updateDeviceInfo(); + createAudioUnit(); + + AudioSessionSetActive (true); + + if (audioUnit != 0) + { + UInt32 formatSize = sizeof (format); + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, &formatSize); + + updateCurrentBufferSize(); + AudioOutputUnitStart (audioUnit); + } + } + + //================================================================================================== + struct AudioSessionHolder + { + AudioSessionHolder() + { + AudioSessionInitialize (0, 0, interruptionListenerCallback, this); + } + + static void interruptionListenerCallback (void* client, UInt32 interruptionType) + { + const Array & activeDevices = static_cast (client)->activeDevices; + + for (int i = activeDevices.size(); --i >= 0;) + activeDevices.getUnchecked(i)->interruptionListener (interruptionType); + } + + Array activeDevices; + }; + + static AudioSessionHolder& getSessionHolder() + { + static AudioSessionHolder audioSessionHolder; + return audioSessionHolder; + } + + void interruptionListener (const UInt32 interruptionType) + { + if (interruptionType == kAudioSessionBeginInterruption) + { + isRunning = false; + AudioOutputUnitStop (audioUnit); + AudioSessionSetActive (false); + + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + callback->audioDeviceError ("iOS audio session interruption"); + } + + if (interruptionType == kAudioSessionEndInterruption) + { + isRunning = true; + AudioSessionSetActive (true); + AudioOutputUnitStart (audioUnit); + + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + callback->audioDeviceError ("iOS audio session resumed"); + } + } + + //================================================================================================== + static OSStatus processStatic (void* client, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* time, + UInt32 /*busNumber*/, UInt32 numFrames, AudioBufferList* data) + { + return static_cast (client)->process (flags, time, numFrames, data); + } + + static void routingChangedStatic (void* client, AudioSessionPropertyID, UInt32 /*inDataSize*/, const void* propertyValue) + { + static_cast (client)->routingChanged (propertyValue); + } + + //================================================================================================== + void resetFormat (const int numChannels) noexcept + { + zerostruct (format); + format.mFormatID = kAudioFormatLinearPCM; + format.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; + format.mBitsPerChannel = 8 * sizeof (short); + format.mChannelsPerFrame = (UInt32) numChannels; + format.mFramesPerPacket = 1; + format.mBytesPerFrame = format.mBytesPerPacket = (UInt32) numChannels * sizeof (short); + } + + bool createAudioUnit() + { + if (audioUnit != 0) + { + AudioComponentInstanceDispose (audioUnit); + audioUnit = 0; + } + + resetFormat (2); + + AudioComponentDescription desc; + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_RemoteIO; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + AudioComponent comp = AudioComponentFindNext (0, &desc); + AudioComponentInstanceNew (comp, &audioUnit); + + if (audioUnit == 0) + return false; + + if (numInputChannels > 0) + { + const UInt32 one = 1; + AudioUnitSetProperty (audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &one, sizeof (one)); + } + + { + AudioChannelLayout layout; + layout.mChannelBitmap = 0; + layout.mNumberChannelDescriptions = 0; + layout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, kAudioUnitScope_Input, 0, &layout, sizeof (layout)); + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, kAudioUnitScope_Output, 0, &layout, sizeof (layout)); + } + + { + AURenderCallbackStruct inputProc; + inputProc.inputProc = processStatic; + inputProc.inputProcRefCon = this; + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &inputProc, sizeof (inputProc)); + } + + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &format, sizeof (format)); + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, sizeof (format)); + + AudioUnitInitialize (audioUnit); + return true; + } + + // If the routing is set to go through the receiver (i.e. the speaker, but quiet), this re-routes it + // to make it loud. Needed because by default when using an input + output, the output is kept quiet. + static void fixAudioRouteIfSetToReceiver() + { + CFStringRef audioRoute = 0; + if (getSessionProperty (kAudioSessionProperty_AudioRoute, audioRoute) == noErr) + { + NSString* route = (NSString*) audioRoute; + + //DBG ("audio route: " + nsStringToJuce (route)); + + if ([route hasPrefix: @"Receiver"]) + setSessionUInt32Property (kAudioSessionProperty_OverrideAudioRoute, kAudioSessionOverrideAudioRoute_Speaker); + + CFRelease (audioRoute); + } + } + + template + static OSStatus getSessionProperty (AudioSessionPropertyID propID, Type& result) noexcept + { + UInt32 valueSize = sizeof (result); + return AudioSessionGetProperty (propID, &valueSize, &result); + } + + static bool setSessionUInt32Property (AudioSessionPropertyID propID, UInt32 v) noexcept { return AudioSessionSetProperty (propID, sizeof (v), &v) == kAudioSessionNoError; } + static bool setSessionFloat32Property (AudioSessionPropertyID propID, Float32 v) noexcept { return AudioSessionSetProperty (propID, sizeof (v), &v) == kAudioSessionNoError; } + static bool setSessionFloat64Property (AudioSessionPropertyID propID, Float64 v) noexcept { return AudioSessionSetProperty (propID, sizeof (v), &v) == kAudioSessionNoError; } + + JUCE_DECLARE_NON_COPYABLE (iOSAudioIODevice) +}; + + +//============================================================================== +class iOSAudioIODeviceType : public AudioIODeviceType +{ +public: + iOSAudioIODeviceType() : AudioIODeviceType ("iOS Audio") {} + + void scanForDevices() {} + StringArray getDeviceNames (bool /*wantInputNames*/) const { return StringArray ("iOS Audio"); } + int getDefaultDeviceIndex (bool /*forInput*/) const { return 0; } + int getIndexOfDevice (AudioIODevice* d, bool /*asInput*/) const { return d != nullptr ? 0 : -1; } + bool hasSeparateInputsAndOutputs() const { return false; } + + AudioIODevice* createDevice (const String& outputDeviceName, const String& inputDeviceName) + { + if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) + return new iOSAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName); + + return nullptr; + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (iOSAudioIODeviceType) +}; + +//============================================================================== +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() +{ + return new iOSAudioIODeviceType(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp new file mode 100644 index 0000000000..091ffbab54 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp @@ -0,0 +1,1243 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace +{ + +#ifndef JUCE_ALSA_LOGGING + #define JUCE_ALSA_LOGGING 0 +#endif + +#if JUCE_ALSA_LOGGING + #define JUCE_ALSA_LOG(dbgtext) { juce::String tempDbgBuf ("ALSA: "); tempDbgBuf << dbgtext; Logger::writeToLog (tempDbgBuf); DBG (tempDbgBuf) } + #define JUCE_CHECKED_RESULT(x) (logErrorMessage (x, __LINE__)) + + static int logErrorMessage (int err, int lineNum) + { + if (err < 0) + JUCE_ALSA_LOG ("Error: line " << lineNum << ": code " << err << " (" << snd_strerror (err) << ")"); + + return err; + } +#else + #define JUCE_ALSA_LOG(x) {} + #define JUCE_CHECKED_RESULT(x) (x) +#endif + +#define JUCE_ALSA_FAILED(x) failed (x) + +static void getDeviceSampleRates (snd_pcm_t* handle, Array& rates) +{ + const int ratesToTry[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; + + snd_pcm_hw_params_t* hwParams; + snd_pcm_hw_params_alloca (&hwParams); + + for (int i = 0; ratesToTry[i] != 0; ++i) + { + if (snd_pcm_hw_params_any (handle, hwParams) >= 0 + && snd_pcm_hw_params_test_rate (handle, hwParams, ratesToTry[i], 0) == 0) + { + rates.addIfNotAlreadyThere ((double) ratesToTry[i]); + } + } +} + +static void getDeviceNumChannels (snd_pcm_t* handle, unsigned int* minChans, unsigned int* maxChans) +{ + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca (¶ms); + + if (snd_pcm_hw_params_any (handle, params) >= 0) + { + snd_pcm_hw_params_get_channels_min (params, minChans); + snd_pcm_hw_params_get_channels_max (params, maxChans); + + JUCE_ALSA_LOG ("getDeviceNumChannels: " << (int) *minChans << " " << (int) *maxChans); + + // some virtual devices (dmix for example) report 10000 channels , we have to clamp these values + *maxChans = jmin (*maxChans, 32u); + *minChans = jmin (*minChans, *maxChans); + } + else + { + JUCE_ALSA_LOG ("getDeviceNumChannels failed"); + } +} + +static void getDeviceProperties (const String& deviceID, + unsigned int& minChansOut, + unsigned int& maxChansOut, + unsigned int& minChansIn, + unsigned int& maxChansIn, + Array& rates, + bool testOutput, + bool testInput) +{ + minChansOut = maxChansOut = minChansIn = maxChansIn = 0; + + if (deviceID.isEmpty()) + return; + + JUCE_ALSA_LOG ("getDeviceProperties(" << deviceID.toUTF8().getAddress() << ")"); + + snd_pcm_info_t* info; + snd_pcm_info_alloca (&info); + + if (testOutput) + { + snd_pcm_t* pcmHandle; + + if (JUCE_CHECKED_RESULT (snd_pcm_open (&pcmHandle, deviceID.toUTF8().getAddress(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) >= 0) + { + getDeviceNumChannels (pcmHandle, &minChansOut, &maxChansOut); + getDeviceSampleRates (pcmHandle, rates); + + snd_pcm_close (pcmHandle); + } + } + + if (testInput) + { + snd_pcm_t* pcmHandle; + + if (JUCE_CHECKED_RESULT (snd_pcm_open (&pcmHandle, deviceID.toUTF8(), SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK) >= 0)) + { + getDeviceNumChannels (pcmHandle, &minChansIn, &maxChansIn); + + if (rates.size() == 0) + getDeviceSampleRates (pcmHandle, rates); + + snd_pcm_close (pcmHandle); + } + } +} + +static void ensureMinimumNumBitsSet (BigInteger& chans, int minNumChans) +{ + int i = 0; + + while (chans.countNumberOfSetBits() < minNumChans) + chans.setBit (i++); +} + +static void silentErrorHandler (const char*, int, const char*, int, const char*,...) {} + +//============================================================================== +class ALSADevice +{ +public: + ALSADevice (const String& devID, bool forInput) + : handle (0), + bitDepth (16), + numChannelsRunning (0), + latency (0), + deviceID (devID), + isInput (forInput), + isInterleaved (true) + { + JUCE_ALSA_LOG ("snd_pcm_open (" << deviceID.toUTF8().getAddress() << ", forInput=" << forInput << ")"); + + int err = snd_pcm_open (&handle, deviceID.toUTF8(), + forInput ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, + SND_PCM_ASYNC); + if (err < 0) + { + if (-err == EBUSY) + error << "The device \"" << deviceID << "\" is busy (another application is using it)."; + else if (-err == ENOENT) + error << "The device \"" << deviceID << "\" is not available."; + else + error << "Could not open " << (forInput ? "input" : "output") << " device \"" << deviceID + << "\": " << snd_strerror(err) << " (" << err << ")"; + + JUCE_ALSA_LOG ("snd_pcm_open failed; " << error); + } + } + + ~ALSADevice() + { + closeNow(); + } + + void closeNow() + { + if (handle != 0) + { + snd_pcm_close (handle); + handle = 0; + } + } + + bool setParameters (unsigned int sampleRate, int numChannels, int bufferSize) + { + if (handle == 0) + return false; + + JUCE_ALSA_LOG ("ALSADevice::setParameters(" << deviceID << ", " + << (int) sampleRate << ", " << numChannels << ", " << bufferSize << ")"); + + snd_pcm_hw_params_t* hwParams; + snd_pcm_hw_params_alloca (&hwParams); + + if (snd_pcm_hw_params_any (handle, hwParams) < 0) + { + // this is the error message that aplay returns when an error happens here, + // it is a bit more explicit that "Invalid parameter" + error = "Broken configuration for this PCM: no configurations available"; + return false; + } + + if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_INTERLEAVED) >= 0) // works better for plughw.. + isInterleaved = true; + else if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_NONINTERLEAVED) >= 0) + isInterleaved = false; + else + { + jassertfalse; + return false; + } + + enum { isFloatBit = 1 << 16, isLittleEndianBit = 1 << 17, onlyUseLower24Bits = 1 << 18 }; + + const int formatsToTry[] = { SND_PCM_FORMAT_FLOAT_LE, 32 | isFloatBit | isLittleEndianBit, + SND_PCM_FORMAT_FLOAT_BE, 32 | isFloatBit, + SND_PCM_FORMAT_S32_LE, 32 | isLittleEndianBit, + SND_PCM_FORMAT_S32_BE, 32, + SND_PCM_FORMAT_S24_3LE, 24 | isLittleEndianBit, + SND_PCM_FORMAT_S24_3BE, 24, + SND_PCM_FORMAT_S24_LE, 32 | isLittleEndianBit | onlyUseLower24Bits, + SND_PCM_FORMAT_S16_LE, 16 | isLittleEndianBit, + SND_PCM_FORMAT_S16_BE, 16 }; + bitDepth = 0; + + for (int i = 0; i < numElementsInArray (formatsToTry); i += 2) + { + if (snd_pcm_hw_params_set_format (handle, hwParams, (_snd_pcm_format) formatsToTry [i]) >= 0) + { + const int type = formatsToTry [i + 1]; + bitDepth = type & 255; + + converter = createConverter (isInput, bitDepth, + (type & isFloatBit) != 0, + (type & isLittleEndianBit) != 0, + (type & onlyUseLower24Bits) != 0, + numChannels); + break; + } + } + + if (bitDepth == 0) + { + error = "device doesn't support a compatible PCM format"; + JUCE_ALSA_LOG ("Error: " + error); + return false; + } + + int dir = 0; + unsigned int periods = 4; + snd_pcm_uframes_t samplesPerPeriod = bufferSize; + + if (JUCE_ALSA_FAILED (snd_pcm_hw_params_set_rate_near (handle, hwParams, &sampleRate, 0)) + || JUCE_ALSA_FAILED (snd_pcm_hw_params_set_channels (handle, hwParams, numChannels)) + || JUCE_ALSA_FAILED (snd_pcm_hw_params_set_periods_near (handle, hwParams, &periods, &dir)) + || JUCE_ALSA_FAILED (snd_pcm_hw_params_set_period_size_near (handle, hwParams, &samplesPerPeriod, &dir)) + || JUCE_ALSA_FAILED (snd_pcm_hw_params (handle, hwParams))) + { + return false; + } + + snd_pcm_uframes_t frames = 0; + + if (JUCE_ALSA_FAILED (snd_pcm_hw_params_get_period_size (hwParams, &frames, &dir)) + || JUCE_ALSA_FAILED (snd_pcm_hw_params_get_periods (hwParams, &periods, &dir))) + latency = 0; + else + latency = frames * (periods - 1); // (this is the method JACK uses to guess the latency..) + + JUCE_ALSA_LOG ("frames: " << (int) frames << ", periods: " << (int) periods + << ", samplesPerPeriod: " << (int) samplesPerPeriod); + + snd_pcm_sw_params_t* swParams; + snd_pcm_sw_params_alloca (&swParams); + snd_pcm_uframes_t boundary; + + if (JUCE_ALSA_FAILED (snd_pcm_sw_params_current (handle, swParams)) + || JUCE_ALSA_FAILED (snd_pcm_sw_params_get_boundary (swParams, &boundary)) + || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_silence_threshold (handle, swParams, 0)) + || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_silence_size (handle, swParams, boundary)) + || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_start_threshold (handle, swParams, samplesPerPeriod)) + || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_stop_threshold (handle, swParams, boundary)) + || JUCE_ALSA_FAILED (snd_pcm_sw_params (handle, swParams))) + { + return false; + } + + #if JUCE_ALSA_LOGGING + // enable this to dump the config of the devices that get opened + snd_output_t* out; + snd_output_stdio_attach (&out, stderr, 0); + snd_pcm_hw_params_dump (hwParams, out); + snd_pcm_sw_params_dump (swParams, out); + #endif + + numChannelsRunning = numChannels; + + return true; + } + + //============================================================================== + bool writeToOutputDevice (AudioSampleBuffer& outputChannelBuffer, const int numSamples) + { + jassert (numChannelsRunning <= outputChannelBuffer.getNumChannels()); + float* const* const data = outputChannelBuffer.getArrayOfWritePointers(); + snd_pcm_sframes_t numDone = 0; + + if (isInterleaved) + { + scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); + + for (int i = 0; i < numChannelsRunning; ++i) + converter->convertSamples (scratch.getData(), i, data[i], 0, numSamples); + + numDone = snd_pcm_writei (handle, scratch.getData(), numSamples); + } + else + { + for (int i = 0; i < numChannelsRunning; ++i) + converter->convertSamples (data[i], data[i], numSamples); + + numDone = snd_pcm_writen (handle, (void**) data, numSamples); + } + + if (numDone < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, numDone, 1 /* silent */))) + return false; + + if (numDone < numSamples) + JUCE_ALSA_LOG ("Did not write all samples: numDone: " << numDone << ", numSamples: " << numSamples); + + return true; + } + + bool readFromInputDevice (AudioSampleBuffer& inputChannelBuffer, const int numSamples) + { + jassert (numChannelsRunning <= inputChannelBuffer.getNumChannels()); + float* const* const data = inputChannelBuffer.getArrayOfWritePointers(); + + if (isInterleaved) + { + scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); + scratch.fillWith (0); // (not clearing this data causes warnings in valgrind) + + snd_pcm_sframes_t num = snd_pcm_readi (handle, scratch.getData(), numSamples); + + if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, num, 1 /* silent */))) + return false; + + if (num < numSamples) + JUCE_ALSA_LOG ("Did not read all samples: num: " << num << ", numSamples: " << numSamples); + + for (int i = 0; i < numChannelsRunning; ++i) + converter->convertSamples (data[i], 0, scratch.getData(), i, numSamples); + } + else + { + snd_pcm_sframes_t num = snd_pcm_readn (handle, (void**) data, numSamples); + + if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, num, 1 /* silent */))) + return false; + + if (num < numSamples) + JUCE_ALSA_LOG ("Did not read all samples: num: " << num << ", numSamples: " << numSamples); + + for (int i = 0; i < numChannelsRunning; ++i) + converter->convertSamples (data[i], data[i], numSamples); + } + + return true; + } + + //============================================================================== + snd_pcm_t* handle; + String error; + int bitDepth, numChannelsRunning, latency; + +private: + //============================================================================== + String deviceID; + const bool isInput; + bool isInterleaved; + MemoryBlock scratch; + ScopedPointer converter; + + //============================================================================== + template + struct ConverterHelper + { + static AudioData::Converter* createConverter (const bool forInput, const bool isLittleEndian, const int numInterleavedChannels) + { + if (forInput) + { + typedef AudioData::Pointer DestType; + + if (isLittleEndian) + return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); + + return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); + } + + typedef AudioData::Pointer SourceType; + + if (isLittleEndian) + return new AudioData::ConverterInstance > (1, numInterleavedChannels); + + return new AudioData::ConverterInstance > (1, numInterleavedChannels); + } + }; + + static AudioData::Converter* createConverter (bool forInput, int bitDepth, + bool isFloat, bool isLittleEndian, bool useOnlyLower24Bits, + int numInterleavedChannels) + { + JUCE_ALSA_LOG ("format: bitDepth=" << bitDepth << ", isFloat=" << isFloat + << ", isLittleEndian=" << isLittleEndian << ", numChannels=" << numInterleavedChannels); + + if (isFloat) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + if (bitDepth == 16) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + if (bitDepth == 24) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + + jassert (bitDepth == 32); + + if (useOnlyLower24Bits) + return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + + return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + } + + //============================================================================== + bool failed (const int errorNum) + { + if (errorNum >= 0) + return false; + + error = snd_strerror (errorNum); + JUCE_ALSA_LOG ("ALSA error: " << error); + return true; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSADevice) +}; + +//============================================================================== +class ALSAThread : public Thread +{ +public: + ALSAThread (const String& inputDeviceID, const String& outputDeviceID) + : Thread ("Juce ALSA"), + sampleRate (0), + bufferSize (0), + outputLatency (0), + inputLatency (0), + callback (0), + inputId (inputDeviceID), + outputId (outputDeviceID), + numCallbacks (0), + audioIoInProgress (false), + inputChannelBuffer (1, 1), + outputChannelBuffer (1, 1) + { + initialiseRatesAndChannels(); + } + + ~ALSAThread() + { + close(); + } + + void open (BigInteger inputChannels, + BigInteger outputChannels, + const double newSampleRate, + const int newBufferSize) + { + close(); + + error.clear(); + sampleRate = newSampleRate; + bufferSize = newBufferSize; + + inputChannelBuffer.setSize (jmax ((int) minChansIn, inputChannels.getHighestBit()) + 1, bufferSize); + inputChannelBuffer.clear(); + inputChannelDataForCallback.clear(); + currentInputChans.clear(); + + if (inputChannels.getHighestBit() >= 0) + { + for (int i = 0; i <= jmax (inputChannels.getHighestBit(), (int) minChansIn); ++i) + { + if (inputChannels[i]) + { + inputChannelDataForCallback.add (inputChannelBuffer.getReadPointer (i)); + currentInputChans.setBit (i); + } + } + } + + ensureMinimumNumBitsSet (outputChannels, minChansOut); + + outputChannelBuffer.setSize (jmax ((int) minChansOut, outputChannels.getHighestBit()) + 1, bufferSize); + outputChannelBuffer.clear(); + outputChannelDataForCallback.clear(); + currentOutputChans.clear(); + + if (outputChannels.getHighestBit() >= 0) + { + for (int i = 0; i <= jmax (outputChannels.getHighestBit(), (int) minChansOut); ++i) + { + if (outputChannels[i]) + { + outputChannelDataForCallback.add (outputChannelBuffer.getWritePointer (i)); + currentOutputChans.setBit (i); + } + } + } + + if (outputChannelDataForCallback.size() > 0 && outputId.isNotEmpty()) + { + outputDevice = new ALSADevice (outputId, false); + + if (outputDevice->error.isNotEmpty()) + { + error = outputDevice->error; + outputDevice = nullptr; + return; + } + + if (! outputDevice->setParameters ((unsigned int) sampleRate, + jlimit ((int) minChansOut, (int) maxChansOut, + currentOutputChans.getHighestBit() + 1), + bufferSize)) + { + error = outputDevice->error; + outputDevice = nullptr; + return; + } + + outputLatency = outputDevice->latency; + } + + if (inputChannelDataForCallback.size() > 0 && inputId.isNotEmpty()) + { + inputDevice = new ALSADevice (inputId, true); + + if (inputDevice->error.isNotEmpty()) + { + error = inputDevice->error; + inputDevice = nullptr; + return; + } + + ensureMinimumNumBitsSet (currentInputChans, minChansIn); + + if (! inputDevice->setParameters ((unsigned int) sampleRate, + jlimit ((int) minChansIn, (int) maxChansIn, currentInputChans.getHighestBit() + 1), + bufferSize)) + { + error = inputDevice->error; + inputDevice = nullptr; + return; + } + + inputLatency = inputDevice->latency; + } + + if (outputDevice == nullptr && inputDevice == nullptr) + { + error = "no channels"; + return; + } + + if (outputDevice != nullptr && inputDevice != nullptr) + snd_pcm_link (outputDevice->handle, inputDevice->handle); + + if (inputDevice != nullptr && JUCE_ALSA_FAILED (snd_pcm_prepare (inputDevice->handle))) + return; + + if (outputDevice != nullptr && JUCE_ALSA_FAILED (snd_pcm_prepare (outputDevice->handle))) + return; + + startThread (9); + + int count = 1000; + + while (numCallbacks == 0) + { + sleep (5); + + if (--count < 0 || ! isThreadRunning()) + { + error = "device didn't start"; + break; + } + } + } + + void close() + { + if (isThreadRunning()) + { + // problem: when pulseaudio is suspended (with pasuspend) , the ALSAThread::run is just stuck in + // snd_pcm_writei -- no error, no nothing it just stays stuck. So the only way I found to exit "nicely" + // (that is without the "killing thread by force" of stopThread) , is to just call snd_pcm_close from + // here which will cause the thread to resume, and exit + signalThreadShouldExit(); + + const int callbacksToStop = numCallbacks; + + if ((! waitForThreadToExit (400)) && audioIoInProgress && numCallbacks == callbacksToStop) + { + JUCE_ALSA_LOG ("Thread is stuck in i/o.. Is pulseaudio suspended?"); + + if (outputDevice != nullptr) outputDevice->closeNow(); + if (inputDevice != nullptr) inputDevice->closeNow(); + } + } + + stopThread (6000); + + inputDevice = nullptr; + outputDevice = nullptr; + + inputChannelBuffer.setSize (1, 1); + outputChannelBuffer.setSize (1, 1); + + numCallbacks = 0; + } + + void setCallback (AudioIODeviceCallback* const newCallback) noexcept + { + const ScopedLock sl (callbackLock); + callback = newCallback; + } + + void run() override + { + while (! threadShouldExit()) + { + if (inputDevice != nullptr && inputDevice->handle) + { + audioIoInProgress = true; + + if (! inputDevice->readFromInputDevice (inputChannelBuffer, bufferSize)) + { + JUCE_ALSA_LOG ("Read failure"); + break; + } + + audioIoInProgress = false; + } + + if (threadShouldExit()) + break; + + { + const ScopedLock sl (callbackLock); + ++numCallbacks; + + if (callback != nullptr) + { + callback->audioDeviceIOCallback (inputChannelDataForCallback.getRawDataPointer(), + inputChannelDataForCallback.size(), + outputChannelDataForCallback.getRawDataPointer(), + outputChannelDataForCallback.size(), + bufferSize); + } + else + { + for (int i = 0; i < outputChannelDataForCallback.size(); ++i) + zeromem (outputChannelDataForCallback[i], sizeof (float) * bufferSize); + } + } + + if (outputDevice != nullptr && outputDevice->handle) + { + JUCE_ALSA_FAILED (snd_pcm_wait (outputDevice->handle, 2000)); + + if (threadShouldExit()) + break; + + snd_pcm_sframes_t avail = snd_pcm_avail_update (outputDevice->handle); + + if (avail < 0) + JUCE_ALSA_FAILED (snd_pcm_recover (outputDevice->handle, avail, 0)); + + audioIoInProgress = true; + + if (! outputDevice->writeToOutputDevice (outputChannelBuffer, bufferSize)) + { + JUCE_ALSA_LOG ("write failure"); + break; + } + + audioIoInProgress = false; + } + } + audioIoInProgress = false; + } + + int getBitDepth() const noexcept + { + if (outputDevice != nullptr) + return outputDevice->bitDepth; + + if (inputDevice != nullptr) + return inputDevice->bitDepth; + + return 16; + } + + //============================================================================== + String error; + double sampleRate; + int bufferSize, outputLatency, inputLatency; + BigInteger currentInputChans, currentOutputChans; + + Array sampleRates; + StringArray channelNamesOut, channelNamesIn; + AudioIODeviceCallback* callback; + +private: + //============================================================================== + const String inputId, outputId; + ScopedPointer outputDevice, inputDevice; + int numCallbacks; + bool audioIoInProgress; + + CriticalSection callbackLock; + + AudioSampleBuffer inputChannelBuffer, outputChannelBuffer; + Array inputChannelDataForCallback; + Array outputChannelDataForCallback; + + unsigned int minChansOut, maxChansOut; + unsigned int minChansIn, maxChansIn; + + bool failed (const int errorNum) + { + if (errorNum >= 0) + return false; + + error = snd_strerror (errorNum); + JUCE_ALSA_LOG ("ALSA error: " << error); + return true; + } + + void initialiseRatesAndChannels() + { + sampleRates.clear(); + channelNamesOut.clear(); + channelNamesIn.clear(); + minChansOut = 0; + maxChansOut = 0; + minChansIn = 0; + maxChansIn = 0; + unsigned int dummy = 0; + + getDeviceProperties (inputId, dummy, dummy, minChansIn, maxChansIn, sampleRates, false, true); + getDeviceProperties (outputId, minChansOut, maxChansOut, dummy, dummy, sampleRates, true, false); + + for (unsigned int i = 0; i < maxChansOut; ++i) + channelNamesOut.add ("channel " + String ((int) i + 1)); + + for (unsigned int i = 0; i < maxChansIn; ++i) + channelNamesIn.add ("channel " + String ((int) i + 1)); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSAThread) +}; + + +//============================================================================== +class ALSAAudioIODevice : public AudioIODevice +{ +public: + ALSAAudioIODevice (const String& deviceName, + const String& typeName, + const String& inputDeviceID, + const String& outputDeviceID) + : AudioIODevice (deviceName, typeName), + inputId (inputDeviceID), + outputId (outputDeviceID), + isOpen_ (false), + isStarted (false), + internal (inputDeviceID, outputDeviceID) + { + } + + ~ALSAAudioIODevice() + { + close(); + } + + StringArray getOutputChannelNames() override { return internal.channelNamesOut; } + StringArray getInputChannelNames() override { return internal.channelNamesIn; } + + Array getAvailableSampleRates() override { return internal.sampleRates; } + + Array getAvailableBufferSizes() override + { + Array r; + int n = 16; + + for (int i = 0; i < 50; ++i) + { + r.add (n); + n += n < 64 ? 16 + : (n < 512 ? 32 + : (n < 1024 ? 64 + : (n < 2048 ? 128 : 256))); + } + + return r; + } + + int getDefaultBufferSize() override { return 512; } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate, + int bufferSizeSamples) override + { + close(); + + if (bufferSizeSamples <= 0) + bufferSizeSamples = getDefaultBufferSize(); + + if (sampleRate <= 0) + { + for (int i = 0; i < internal.sampleRates.size(); ++i) + { + double rate = internal.sampleRates[i]; + + if (rate >= 44100) + { + sampleRate = rate; + break; + } + } + } + + internal.open (inputChannels, outputChannels, + sampleRate, bufferSizeSamples); + + isOpen_ = internal.error.isEmpty(); + return internal.error; + } + + void close() override + { + stop(); + internal.close(); + isOpen_ = false; + } + + bool isOpen() override { return isOpen_; } + bool isPlaying() override { return isStarted && internal.error.isEmpty(); } + String getLastError() override { return internal.error; } + + int getCurrentBufferSizeSamples() override { return internal.bufferSize; } + double getCurrentSampleRate() override { return internal.sampleRate; } + int getCurrentBitDepth() override { return internal.getBitDepth(); } + + BigInteger getActiveOutputChannels() const override { return internal.currentOutputChans; } + BigInteger getActiveInputChannels() const override { return internal.currentInputChans; } + + int getOutputLatencyInSamples() override { return internal.outputLatency; } + int getInputLatencyInSamples() override { return internal.inputLatency; } + + void start (AudioIODeviceCallback* callback) override + { + if (! isOpen_) + callback = nullptr; + + if (callback != nullptr) + callback->audioDeviceAboutToStart (this); + + internal.setCallback (callback); + + isStarted = (callback != nullptr); + } + + void stop() override + { + AudioIODeviceCallback* const oldCallback = internal.callback; + + start (nullptr); + + if (oldCallback != nullptr) + oldCallback->audioDeviceStopped(); + } + + String inputId, outputId; + +private: + bool isOpen_, isStarted; + ALSAThread internal; +}; + + +//============================================================================== +class ALSAAudioIODeviceType : public AudioIODeviceType +{ +public: + ALSAAudioIODeviceType (bool onlySoundcards, const String &typeName) + : AudioIODeviceType (typeName), + hasScanned (false), + listOnlySoundcards (onlySoundcards) + { + #if ! JUCE_ALSA_LOGGING + snd_lib_error_set_handler (&silentErrorHandler); + #endif + } + + ~ALSAAudioIODeviceType() + { + #if ! JUCE_ALSA_LOGGING + snd_lib_error_set_handler (nullptr); + #endif + + snd_config_update_free_global(); // prevent valgrind from screaming about alsa leaks + } + + //============================================================================== + void scanForDevices() + { + if (hasScanned) + return; + + hasScanned = true; + inputNames.clear(); + inputIds.clear(); + outputNames.clear(); + outputIds.clear(); + + JUCE_ALSA_LOG ("scanForDevices()"); + + if (listOnlySoundcards) + enumerateAlsaSoundcards(); + else + enumerateAlsaPCMDevices(); + + inputNames.appendNumbersToDuplicates (false, true); + outputNames.appendNumbersToDuplicates (false, true); + } + + StringArray getDeviceNames (bool wantInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return wantInputNames ? inputNames : outputNames; + } + + int getDefaultDeviceIndex (bool forInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int idx = (forInput ? inputIds : outputIds).indexOf ("default"); + return idx >= 0 ? idx : 0; + } + + bool hasSeparateInputsAndOutputs() const { return true; } + + int getIndexOfDevice (AudioIODevice* device, bool asInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + if (ALSAAudioIODevice* d = dynamic_cast (device)) + return asInput ? inputIds.indexOf (d->inputId) + : outputIds.indexOf (d->outputId); + + return -1; + } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int inputIndex = inputNames.indexOf (inputDeviceName); + const int outputIndex = outputNames.indexOf (outputDeviceName); + + String deviceName (outputIndex >= 0 ? outputDeviceName + : inputDeviceName); + + if (inputIndex >= 0 || outputIndex >= 0) + return new ALSAAudioIODevice (deviceName, getTypeName(), + inputIds [inputIndex], + outputIds [outputIndex]); + + return nullptr; + } + +private: + //============================================================================== + StringArray inputNames, outputNames, inputIds, outputIds; + bool hasScanned, listOnlySoundcards; + + bool testDevice (const String &id, const String &outputName, const String &inputName) + { + unsigned int minChansOut = 0, maxChansOut = 0; + unsigned int minChansIn = 0, maxChansIn = 0; + Array rates; + + bool isInput = inputName.isNotEmpty(), isOutput = outputName.isNotEmpty(); + getDeviceProperties (id, minChansOut, maxChansOut, minChansIn, maxChansIn, rates, isOutput, isInput); + + isInput = maxChansIn > 0; + isOutput = maxChansOut > 0; + + if ((isInput || isOutput) && rates.size() > 0) + { + JUCE_ALSA_LOG ("testDevice: '" << id.toUTF8().getAddress() << "' -> isInput: " + << isInput << ", isOutput: " << isOutput); + + if (isInput) + { + inputNames.add (inputName); + inputIds.add (id); + } + + if (isOutput) + { + outputNames.add (outputName); + outputIds.add (id); + } + + return isInput || isOutput; + } + + return false; + } + + void enumerateAlsaSoundcards() + { + snd_ctl_t* handle = nullptr; + snd_ctl_card_info_t* info = nullptr; + snd_ctl_card_info_alloca (&info); + + int cardNum = -1; + + while (outputIds.size() + inputIds.size() <= 64) + { + snd_card_next (&cardNum); + + if (cardNum < 0) + break; + + if (JUCE_CHECKED_RESULT (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toUTF8(), SND_CTL_NONBLOCK)) >= 0) + { + if (JUCE_CHECKED_RESULT (snd_ctl_card_info (handle, info)) >= 0) + { + String cardId (snd_ctl_card_info_get_id (info)); + + if (cardId.removeCharacters ("0123456789").isEmpty()) + cardId = String (cardNum); + + String cardName = snd_ctl_card_info_get_name (info); + + if (cardName.isEmpty()) + cardName = cardId; + + int device = -1; + + snd_pcm_info_t* pcmInfo; + snd_pcm_info_alloca (&pcmInfo); + + for (;;) + { + if (snd_ctl_pcm_next_device (handle, &device) < 0 || device < 0) + break; + + snd_pcm_info_set_device (pcmInfo, device); + + for (int subDevice = 0, nbSubDevice = 1; subDevice < nbSubDevice; ++subDevice) + { + snd_pcm_info_set_subdevice (pcmInfo, subDevice); + snd_pcm_info_set_stream (pcmInfo, SND_PCM_STREAM_CAPTURE); + const bool isInput = (snd_ctl_pcm_info (handle, pcmInfo) >= 0); + + snd_pcm_info_set_stream (pcmInfo, SND_PCM_STREAM_PLAYBACK); + const bool isOutput = (snd_ctl_pcm_info (handle, pcmInfo) >= 0); + + if (! (isInput || isOutput)) + continue; + + if (nbSubDevice == 1) + nbSubDevice = snd_pcm_info_get_subdevices_count (pcmInfo); + + String id, name; + + if (nbSubDevice == 1) + { + id << "hw:" << cardId << "," << device; + name << cardName << ", " << snd_pcm_info_get_name (pcmInfo); + } + else + { + id << "hw:" << cardId << "," << device << "," << subDevice; + name << cardName << ", " << snd_pcm_info_get_name (pcmInfo) + << " {" << snd_pcm_info_get_subdevice_name (pcmInfo) << "}"; + } + + JUCE_ALSA_LOG ("Soundcard ID: " << id << ", name: '" << name + << ", isInput:" << isInput << ", isOutput:" << isOutput << "\n"); + + if (isInput) + { + inputNames.add (name); + inputIds.add (id); + } + + if (isOutput) + { + outputNames.add (name); + outputIds.add (id); + } + } + } + } + + JUCE_CHECKED_RESULT (snd_ctl_close (handle)); + } + } + } + + /* Enumerates all ALSA output devices (as output by the command aplay -L) + Does not try to open the devices (with "testDevice" for example), + so that it also finds devices that are busy and not yet available. + */ + void enumerateAlsaPCMDevices() + { + void** hints = nullptr; + + if (JUCE_CHECKED_RESULT (snd_device_name_hint (-1, "pcm", &hints)) == 0) + { + for (char** h = (char**) hints; *h; ++h) + { + const String id (hintToString (*h, "NAME")); + const String description (hintToString (*h, "DESC")); + const String ioid (hintToString (*h, "IOID")); + + JUCE_ALSA_LOG ("ID: " << id << "; desc: " << description << "; ioid: " << ioid); + + String ss = id.fromFirstOccurrenceOf ("=", false, false) + .upToFirstOccurrenceOf (",", false, false); + + if (id.isEmpty() + || id.startsWith ("default:") || id.startsWith ("sysdefault:") + || id.startsWith ("plughw:") || id == "null") + continue; + + String name (description.replace ("\n", "; ")); + + if (name.isEmpty()) + name = id; + + bool isOutput = (ioid != "Input"); + bool isInput = (ioid != "Output"); + + // alsa is stupid here, it advertises dmix and dsnoop as input/output devices, but + // opening dmix as input, or dsnoop as output will trigger errors.. + isInput = isInput && ! id.startsWith ("dmix"); + isOutput = isOutput && ! id.startsWith ("dsnoop"); + + if (isInput) + { + inputNames.add (name); + inputIds.add (id); + } + + if (isOutput) + { + outputNames.add (name); + outputIds.add (id); + } + } + + snd_device_name_free_hint (hints); + } + + // sometimes the "default" device is not listed, but it is nice to see it explicitely in the list + if (! outputIds.contains ("default")) + testDevice ("default", "Default ALSA Output", "Default ALSA Input"); + + // same for the pulseaudio plugin + if (! outputIds.contains ("pulse")) + testDevice ("pulse", "Pulseaudio output", "Pulseaudio input"); + + // make sure the default device is listed first, and followed by the pulse device (if present) + int idx = outputIds.indexOf ("pulse"); + outputIds.move (idx, 0); + outputNames.move (idx, 0); + + idx = inputIds.indexOf ("pulse"); + inputIds.move (idx, 0); + inputNames.move (idx, 0); + + idx = outputIds.indexOf ("default"); + outputIds.move (idx, 0); + outputNames.move (idx, 0); + + idx = inputIds.indexOf ("default"); + inputIds.move (idx, 0); + inputNames.move (idx, 0); + } + + static String hintToString (const void* hints, const char* type) + { + char* const hint = snd_device_name_get_hint (hints, type); + const String s (String::fromUTF8 (hint)); + ::free (hint); + return s; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSAAudioIODeviceType) +}; + +} + +//============================================================================== +AudioIODeviceType* createAudioIODeviceType_ALSA_Soundcards() +{ + return new ALSAAudioIODeviceType (true, "ALSA HW"); +} + +AudioIODeviceType* createAudioIODeviceType_ALSA_PCMDevices() +{ + return new ALSAAudioIODeviceType (false, "ALSA"); +} + +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA() +{ + return createAudioIODeviceType_ALSA_PCMDevices(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp new file mode 100644 index 0000000000..a645333010 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp @@ -0,0 +1,77 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioCDReader::AudioCDReader() + : AudioFormatReader (0, "CD Audio") +{ +} + +StringArray AudioCDReader::getAvailableCDNames() +{ + StringArray names; + return names; +} + +AudioCDReader* AudioCDReader::createReaderForCD (const int index) +{ + return nullptr; +} + +AudioCDReader::~AudioCDReader() +{ +} + +void AudioCDReader::refreshTrackLengths() +{ +} + +bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + return false; +} + +bool AudioCDReader::isCDStillPresent() const +{ + return false; +} + +bool AudioCDReader::isTrackAudio (int trackNum) const +{ + return false; +} + +void AudioCDReader::enableIndexScanning (bool b) +{ +} + +int AudioCDReader::getLastIndex() const +{ + return 0; +} + +Array AudioCDReader::findIndexesInTrack (const int trackNumber) +{ + return Array(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp new file mode 100644 index 0000000000..38ad64df93 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp @@ -0,0 +1,604 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +//============================================================================== +static void* juce_libjackHandle = nullptr; + +static void* juce_loadJackFunction (const char* const name) +{ + if (juce_libjackHandle == nullptr) + return nullptr; + + return dlsym (juce_libjackHandle, name); +} + +#define JUCE_DECL_JACK_FUNCTION(return_type, fn_name, argument_types, arguments) \ + return_type fn_name argument_types \ + { \ + typedef return_type (*fn_type) argument_types; \ + static fn_type fn = (fn_type) juce_loadJackFunction (#fn_name); \ + return (fn != nullptr) ? ((*fn) arguments) : (return_type) 0; \ + } + +#define JUCE_DECL_VOID_JACK_FUNCTION(fn_name, argument_types, arguments) \ + void fn_name argument_types \ + { \ + typedef void (*fn_type) argument_types; \ + static fn_type fn = (fn_type) juce_loadJackFunction (#fn_name); \ + if (fn != nullptr) (*fn) arguments; \ + } + +//============================================================================== +JUCE_DECL_JACK_FUNCTION (jack_client_t*, jack_client_open, (const char* client_name, jack_options_t options, jack_status_t* status, ...), (client_name, options, status)); +JUCE_DECL_JACK_FUNCTION (int, jack_client_close, (jack_client_t *client), (client)); +JUCE_DECL_JACK_FUNCTION (int, jack_activate, (jack_client_t* client), (client)); +JUCE_DECL_JACK_FUNCTION (int, jack_deactivate, (jack_client_t* client), (client)); +JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_get_buffer_size, (jack_client_t* client), (client)); +JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_get_sample_rate, (jack_client_t* client), (client)); +JUCE_DECL_VOID_JACK_FUNCTION (jack_on_shutdown, (jack_client_t* client, void (*function)(void* arg), void* arg), (client, function, arg)); +JUCE_DECL_JACK_FUNCTION (void* , jack_port_get_buffer, (jack_port_t* port, jack_nframes_t nframes), (port, nframes)); +JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_port_get_total_latency, (jack_client_t* client, jack_port_t* port), (client, port)); +JUCE_DECL_JACK_FUNCTION (jack_port_t* , jack_port_register, (jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size), (client, port_name, port_type, flags, buffer_size)); +JUCE_DECL_VOID_JACK_FUNCTION (jack_set_error_function, (void (*func)(const char*)), (func)); +JUCE_DECL_JACK_FUNCTION (int, jack_set_process_callback, (jack_client_t* client, JackProcessCallback process_callback, void* arg), (client, process_callback, arg)); +JUCE_DECL_JACK_FUNCTION (const char**, jack_get_ports, (jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags), (client, port_name_pattern, type_name_pattern, flags)); +JUCE_DECL_JACK_FUNCTION (int, jack_connect, (jack_client_t* client, const char* source_port, const char* destination_port), (client, source_port, destination_port)); +JUCE_DECL_JACK_FUNCTION (const char*, jack_port_name, (const jack_port_t* port), (port)); +JUCE_DECL_JACK_FUNCTION (void*, jack_set_port_connect_callback, (jack_client_t* client, JackPortConnectCallback connect_callback, void* arg), (client, connect_callback, arg)); +JUCE_DECL_JACK_FUNCTION (jack_port_t* , jack_port_by_id, (jack_client_t* client, jack_port_id_t port_id), (client, port_id)); +JUCE_DECL_JACK_FUNCTION (int, jack_port_connected, (const jack_port_t* port), (port)); +JUCE_DECL_JACK_FUNCTION (int, jack_port_connected_to, (const jack_port_t* port, const char* port_name), (port, port_name)); + +#if JUCE_DEBUG + #define JACK_LOGGING_ENABLED 1 +#endif + +#if JACK_LOGGING_ENABLED +namespace +{ + void jack_Log (const String& s) + { + std::cerr << s << std::endl; + } + + const char* getJackErrorMessage (const jack_status_t status) + { + if (status & JackServerFailed + || status & JackServerError) return "Unable to connect to JACK server"; + if (status & JackVersionError) return "Client's protocol version does not match"; + if (status & JackInvalidOption) return "The operation contained an invalid or unsupported option"; + if (status & JackNameNotUnique) return "The desired client name was not unique"; + if (status & JackNoSuchClient) return "Requested client does not exist"; + if (status & JackInitFailure) return "Unable to initialize client"; + return nullptr; + } +} + #define JUCE_JACK_LOG_STATUS(x) { if (const char* m = getJackErrorMessage (x)) jack_Log (m); } + #define JUCE_JACK_LOG(x) jack_Log(x) +#else + #define JUCE_JACK_LOG_STATUS(x) {} + #define JUCE_JACK_LOG(x) {} +#endif + + +//============================================================================== +#ifndef JUCE_JACK_CLIENT_NAME + #define JUCE_JACK_CLIENT_NAME "JUCEJack" +#endif + +struct JackPortIterator +{ + JackPortIterator (jack_client_t* const client, const bool forInput) + : ports (nullptr), index (-1) + { + if (client != nullptr) + ports = juce::jack_get_ports (client, nullptr, nullptr, + forInput ? JackPortIsOutput : JackPortIsInput); + // (NB: This looks like it's the wrong way round, but it is correct!) + } + + ~JackPortIterator() + { + ::free (ports); + } + + bool next() + { + if (ports == nullptr || ports [index + 1] == nullptr) + return false; + + name = CharPointer_UTF8 (ports[++index]); + clientName = name.upToFirstOccurrenceOf (":", false, false); + return true; + } + + const char** ports; + int index; + String name; + String clientName; +}; + +class JackAudioIODeviceType; +static Array activeDeviceTypes; + +//============================================================================== +class JackAudioIODevice : public AudioIODevice +{ +public: + JackAudioIODevice (const String& deviceName, + const String& inId, + const String& outId) + : AudioIODevice (deviceName, "JACK"), + inputId (inId), + outputId (outId), + deviceIsOpen (false), + callback (nullptr), + totalNumberOfInputChannels (0), + totalNumberOfOutputChannels (0) + { + jassert (deviceName.isNotEmpty()); + + jack_status_t status; + client = juce::jack_client_open (JUCE_JACK_CLIENT_NAME, JackNoStartServer, &status); + + if (client == nullptr) + { + JUCE_JACK_LOG_STATUS (status); + } + else + { + juce::jack_set_error_function (errorCallback); + + // open input ports + const StringArray inputChannels (getInputChannelNames()); + for (int i = 0; i < inputChannels.size(); ++i) + { + String inputName; + inputName << "in_" << ++totalNumberOfInputChannels; + + inputPorts.add (juce::jack_port_register (client, inputName.toUTF8(), + JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)); + } + + // open output ports + const StringArray outputChannels (getOutputChannelNames()); + for (int i = 0; i < outputChannels.size (); ++i) + { + String outputName; + outputName << "out_" << ++totalNumberOfOutputChannels; + + outputPorts.add (juce::jack_port_register (client, outputName.toUTF8(), + JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)); + } + + inChans.calloc (totalNumberOfInputChannels + 2); + outChans.calloc (totalNumberOfOutputChannels + 2); + } + } + + ~JackAudioIODevice() + { + close(); + if (client != nullptr) + { + juce::jack_client_close (client); + client = nullptr; + } + } + + StringArray getChannelNames (bool forInput) const + { + StringArray names; + + for (JackPortIterator i (client, forInput); i.next();) + if (i.clientName == getName()) + names.add (i.name.fromFirstOccurrenceOf (":", false, false)); + + return names; + } + + StringArray getOutputChannelNames() override { return getChannelNames (false); } + StringArray getInputChannelNames() override { return getChannelNames (true); } + + Array getAvailableSampleRates() override + { + Array rates; + + if (client != nullptr) + rates.add (juce::jack_get_sample_rate (client)); + + return rates; + } + + Array getAvailableBufferSizes() override + { + Array sizes; + + if (client != nullptr) + sizes.add (juce::jack_get_buffer_size (client)); + + return sizes; + } + + int getDefaultBufferSize() override { return getCurrentBufferSizeSamples(); } + int getCurrentBufferSizeSamples() override { return client != nullptr ? juce::jack_get_buffer_size (client) : 0; } + double getCurrentSampleRate() override { return client != nullptr ? juce::jack_get_sample_rate (client) : 0; } + + + String open (const BigInteger& inputChannels, const BigInteger& outputChannels, + double /* sampleRate */, int /* bufferSizeSamples */) override + { + if (client == nullptr) + { + lastError = "No JACK client running"; + return lastError; + } + + lastError.clear(); + close(); + + juce::jack_set_process_callback (client, processCallback, this); + juce::jack_set_port_connect_callback (client, portConnectCallback, this); + juce::jack_on_shutdown (client, shutdownCallback, this); + juce::jack_activate (client); + deviceIsOpen = true; + + if (! inputChannels.isZero()) + { + for (JackPortIterator i (client, true); i.next();) + { + if (inputChannels [i.index] && i.clientName == getName()) + { + int error = juce::jack_connect (client, i.ports[i.index], juce::jack_port_name ((jack_port_t*) inputPorts[i.index])); + if (error != 0) + JUCE_JACK_LOG ("Cannot connect input port " + String (i.index) + " (" + i.name + "), error " + String (error)); + } + } + } + + if (! outputChannels.isZero()) + { + for (JackPortIterator i (client, false); i.next();) + { + if (outputChannels [i.index] && i.clientName == getName()) + { + int error = juce::jack_connect (client, juce::jack_port_name ((jack_port_t*) outputPorts[i.index]), i.ports[i.index]); + if (error != 0) + JUCE_JACK_LOG ("Cannot connect output port " + String (i.index) + " (" + i.name + "), error " + String (error)); + } + } + } + + return lastError; + } + + void close() override + { + stop(); + + if (client != nullptr) + { + juce::jack_deactivate (client); + juce::jack_set_process_callback (client, processCallback, nullptr); + juce::jack_set_port_connect_callback (client, portConnectCallback, nullptr); + juce::jack_on_shutdown (client, shutdownCallback, nullptr); + } + + deviceIsOpen = false; + } + + void start (AudioIODeviceCallback* newCallback) override + { + if (deviceIsOpen && newCallback != callback) + { + if (newCallback != nullptr) + newCallback->audioDeviceAboutToStart (this); + + AudioIODeviceCallback* const oldCallback = callback; + + { + const ScopedLock sl (callbackLock); + callback = newCallback; + } + + if (oldCallback != nullptr) + oldCallback->audioDeviceStopped(); + } + } + + void stop() override + { + start (nullptr); + } + + bool isOpen() override { return deviceIsOpen; } + bool isPlaying() override { return callback != nullptr; } + int getCurrentBitDepth() override { return 32; } + String getLastError() override { return lastError; } + + BigInteger getActiveOutputChannels() const override { return activeOutputChannels; } + BigInteger getActiveInputChannels() const override { return activeInputChannels; } + + int getOutputLatencyInSamples() override + { + int latency = 0; + + for (int i = 0; i < outputPorts.size(); i++) + latency = jmax (latency, (int) juce::jack_port_get_total_latency (client, (jack_port_t*) outputPorts [i])); + + return latency; + } + + int getInputLatencyInSamples() override + { + int latency = 0; + + for (int i = 0; i < inputPorts.size(); i++) + latency = jmax (latency, (int) juce::jack_port_get_total_latency (client, (jack_port_t*) inputPorts [i])); + + return latency; + } + + String inputId, outputId; + +private: + void process (const int numSamples) + { + int numActiveInChans = 0, numActiveOutChans = 0; + + for (int i = 0; i < totalNumberOfInputChannels; ++i) + { + if (activeInputChannels[i]) + if (jack_default_audio_sample_t* in + = (jack_default_audio_sample_t*) juce::jack_port_get_buffer ((jack_port_t*) inputPorts.getUnchecked(i), numSamples)) + inChans [numActiveInChans++] = (float*) in; + } + + for (int i = 0; i < totalNumberOfOutputChannels; ++i) + { + if (activeOutputChannels[i]) + if (jack_default_audio_sample_t* out + = (jack_default_audio_sample_t*) juce::jack_port_get_buffer ((jack_port_t*) outputPorts.getUnchecked(i), numSamples)) + outChans [numActiveOutChans++] = (float*) out; + } + + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + { + if ((numActiveInChans + numActiveOutChans) > 0) + callback->audioDeviceIOCallback (const_cast (inChans.getData()), numActiveInChans, + outChans, numActiveOutChans, numSamples); + } + else + { + for (int i = 0; i < numActiveOutChans; ++i) + zeromem (outChans[i], sizeof (float) * numSamples); + } + } + + static int processCallback (jack_nframes_t nframes, void* callbackArgument) + { + if (callbackArgument != nullptr) + ((JackAudioIODevice*) callbackArgument)->process (nframes); + + return 0; + } + + void updateActivePorts() + { + BigInteger newOutputChannels, newInputChannels; + + for (int i = 0; i < outputPorts.size(); ++i) + if (juce::jack_port_connected ((jack_port_t*) outputPorts.getUnchecked(i))) + newOutputChannels.setBit (i); + + for (int i = 0; i < inputPorts.size(); ++i) + if (juce::jack_port_connected ((jack_port_t*) inputPorts.getUnchecked(i))) + newInputChannels.setBit (i); + + if (newOutputChannels != activeOutputChannels + || newInputChannels != activeInputChannels) + { + AudioIODeviceCallback* const oldCallback = callback; + + stop(); + + activeOutputChannels = newOutputChannels; + activeInputChannels = newInputChannels; + + if (oldCallback != nullptr) + start (oldCallback); + + sendDeviceChangedCallback(); + } + } + + static void portConnectCallback (jack_port_id_t, jack_port_id_t, int, void* arg) + { + if (JackAudioIODevice* device = static_cast (arg)) + device->updateActivePorts(); + } + + static void threadInitCallback (void* /* callbackArgument */) + { + JUCE_JACK_LOG ("JackAudioIODevice::initialise"); + } + + static void shutdownCallback (void* callbackArgument) + { + JUCE_JACK_LOG ("JackAudioIODevice::shutdown"); + + if (JackAudioIODevice* device = (JackAudioIODevice*) callbackArgument) + { + device->client = nullptr; + device->close(); + } + } + + static void errorCallback (const char* msg) + { + JUCE_JACK_LOG ("JackAudioIODevice::errorCallback " + String (msg)); + } + + static void sendDeviceChangedCallback(); + + bool deviceIsOpen; + jack_client_t* client; + String lastError; + AudioIODeviceCallback* callback; + CriticalSection callbackLock; + + HeapBlock inChans, outChans; + int totalNumberOfInputChannels; + int totalNumberOfOutputChannels; + Array inputPorts, outputPorts; + BigInteger activeInputChannels, activeOutputChannels; +}; + + +//============================================================================== +class JackAudioIODeviceType : public AudioIODeviceType +{ +public: + JackAudioIODeviceType() + : AudioIODeviceType ("JACK"), + hasScanned (false) + { + activeDeviceTypes.add (this); + } + + ~JackAudioIODeviceType() + { + activeDeviceTypes.removeFirstMatchingValue (this); + } + + void scanForDevices() + { + hasScanned = true; + inputNames.clear(); + inputIds.clear(); + outputNames.clear(); + outputIds.clear(); + + if (juce_libjackHandle == nullptr) juce_libjackHandle = dlopen ("libjack.so.0", RTLD_LAZY); + if (juce_libjackHandle == nullptr) juce_libjackHandle = dlopen ("libjack.so", RTLD_LAZY); + if (juce_libjackHandle == nullptr) return; + + jack_status_t status; + + // open a dummy client + if (jack_client_t* const client = juce::jack_client_open ("JuceJackDummy", JackNoStartServer, &status)) + { + // scan for output devices + for (JackPortIterator i (client, false); i.next();) + { + if (i.clientName != (JUCE_JACK_CLIENT_NAME) && ! inputNames.contains (i.clientName)) + { + inputNames.add (i.clientName); + inputIds.add (i.ports [i.index]); + } + } + + // scan for input devices + for (JackPortIterator i (client, true); i.next();) + { + if (i.clientName != (JUCE_JACK_CLIENT_NAME) && ! outputNames.contains (i.clientName)) + { + outputNames.add (i.clientName); + outputIds.add (i.ports [i.index]); + } + } + + juce::jack_client_close (client); + } + else + { + JUCE_JACK_LOG_STATUS (status); + } + } + + StringArray getDeviceNames (bool wantInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + return wantInputNames ? inputNames : outputNames; + } + + int getDefaultDeviceIndex (bool /* forInput */) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + return 0; + } + + bool hasSeparateInputsAndOutputs() const { return true; } + + int getIndexOfDevice (AudioIODevice* device, bool asInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + if (JackAudioIODevice* d = dynamic_cast (device)) + return asInput ? inputIds.indexOf (d->inputId) + : outputIds.indexOf (d->outputId); + + return -1; + } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int inputIndex = inputNames.indexOf (inputDeviceName); + const int outputIndex = outputNames.indexOf (outputDeviceName); + + if (inputIndex >= 0 || outputIndex >= 0) + return new JackAudioIODevice (outputIndex >= 0 ? outputDeviceName + : inputDeviceName, + inputIds [inputIndex], + outputIds [outputIndex]); + + return nullptr; + } + + void portConnectionChange() { callDeviceChangeListeners(); } + +private: + StringArray inputNames, outputNames, inputIds, outputIds; + bool hasScanned; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JackAudioIODeviceType) +}; + +void JackAudioIODevice::sendDeviceChangedCallback() +{ + for (int i = activeDeviceTypes.size(); --i >= 0;) + if (JackAudioIODeviceType* d = activeDeviceTypes[i]) + d->portConnectionChange(); +} + +//============================================================================== +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK() +{ + return new JackAudioIODeviceType(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp new file mode 100644 index 0000000000..a6799f3d58 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp @@ -0,0 +1,612 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_ALSA + +// You can define these strings in your app if you want to override the default names: +#ifndef JUCE_ALSA_MIDI_INPUT_NAME + #define JUCE_ALSA_MIDI_INPUT_NAME "Juce Midi Input" +#endif + +#ifndef JUCE_ALSA_MIDI_OUTPUT_NAME + #define JUCE_ALSA_MIDI_OUTPUT_NAME "Juce Midi Output" +#endif + +//============================================================================== +namespace +{ + +class AlsaPortAndCallback; + +//============================================================================== +class AlsaClient : public ReferenceCountedObject +{ +public: + typedef ReferenceCountedObjectPtr Ptr; + + AlsaClient (bool forInput) + : input (forInput), handle (nullptr) + { + snd_seq_open (&handle, "default", forInput ? SND_SEQ_OPEN_INPUT + : SND_SEQ_OPEN_OUTPUT, 0); + } + + ~AlsaClient() + { + if (handle != nullptr) + { + snd_seq_close (handle); + handle = nullptr; + } + + jassert (activeCallbacks.size() == 0); + + if (inputThread) + { + inputThread->stopThread (3000); + inputThread = nullptr; + } + } + + bool isInput() const noexcept { return input; } + + void setName (const String& name) + { + snd_seq_set_client_name (handle, name.toUTF8()); + } + + void registerCallback (AlsaPortAndCallback* cb) + { + if (cb != nullptr) + { + { + const ScopedLock sl (callbackLock); + activeCallbacks.add (cb); + + if (inputThread == nullptr) + inputThread = new MidiInputThread (*this); + } + + inputThread->startThread(); + } + } + + void unregisterCallback (AlsaPortAndCallback* cb) + { + const ScopedLock sl (callbackLock); + + jassert (activeCallbacks.contains (cb)); + activeCallbacks.removeAllInstancesOf (cb); + + if (activeCallbacks.size() == 0 && inputThread->isThreadRunning()) + inputThread->signalThreadShouldExit(); + } + + void handleIncomingMidiMessage (const MidiMessage& message, int port); + + snd_seq_t* get() const noexcept { return handle; } + +private: + bool input; + snd_seq_t* handle; + + Array activeCallbacks; + CriticalSection callbackLock; + + //============================================================================== + class MidiInputThread : public Thread + { + public: + MidiInputThread (AlsaClient& c) + : Thread ("Juce MIDI Input"), client (c) + { + jassert (client.input && client.get() != nullptr); + } + + void run() override + { + const int maxEventSize = 16 * 1024; + snd_midi_event_t* midiParser; + snd_seq_t* seqHandle = client.get(); + + if (snd_midi_event_new (maxEventSize, &midiParser) >= 0) + { + const int numPfds = snd_seq_poll_descriptors_count (seqHandle, POLLIN); + HeapBlock pfd (numPfds); + snd_seq_poll_descriptors (seqHandle, pfd, numPfds, POLLIN); + + HeapBlock buffer (maxEventSize); + + while (! threadShouldExit()) + { + if (poll (pfd, numPfds, 100) > 0) // there was a "500" here which is a bit long when we exit the program and have to wait for a timeout on this poll call + { + if (threadShouldExit()) + break; + + snd_seq_nonblock (seqHandle, 1); + + do + { + snd_seq_event_t* inputEvent = nullptr; + + if (snd_seq_event_input (seqHandle, &inputEvent) >= 0) + { + // xxx what about SYSEXes that are too big for the buffer? + const int numBytes = snd_midi_event_decode (midiParser, buffer, + maxEventSize, inputEvent); + + snd_midi_event_reset_decode (midiParser); + + if (numBytes > 0) + { + const MidiMessage message ((const uint8*) buffer, numBytes, + Time::getMillisecondCounter() * 0.001); + + client.handleIncomingMidiMessage (message, inputEvent->dest.port); + } + + snd_seq_free_event (inputEvent); + } + } + while (snd_seq_event_input_pending (seqHandle, 0) > 0); + } + } + + snd_midi_event_free (midiParser); + } + }; + + private: + AlsaClient& client; + }; + + ScopedPointer inputThread; +}; + + +static AlsaClient::Ptr globalAlsaSequencerIn() +{ + static AlsaClient::Ptr global (new AlsaClient (true)); + return global; +} + +static AlsaClient::Ptr globalAlsaSequencerOut() +{ + static AlsaClient::Ptr global (new AlsaClient (false)); + return global; +} + +static AlsaClient::Ptr globalAlsaSequencer (bool input) +{ + return input ? globalAlsaSequencerIn() + : globalAlsaSequencerOut(); +} + +//============================================================================== +// represents an input or output port of the supplied AlsaClient +class AlsaPort +{ +public: + AlsaPort() noexcept : portId (-1) {} + AlsaPort (const AlsaClient::Ptr& c, int port) noexcept : client (c), portId (port) {} + + void createPort (const AlsaClient::Ptr& c, const String& name, bool forInput) + { + client = c; + + if (snd_seq_t* handle = client->get()) + portId = snd_seq_create_simple_port (handle, name.toUTF8(), + forInput ? (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE) + : (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ), + SND_SEQ_PORT_TYPE_MIDI_GENERIC); + } + + void deletePort() + { + if (isValid()) + { + snd_seq_delete_simple_port (client->get(), portId); + portId = -1; + } + } + + void connectWith (int sourceClient, int sourcePort) + { + if (client->isInput()) + snd_seq_connect_from (client->get(), portId, sourceClient, sourcePort); + else + snd_seq_connect_to (client->get(), portId, sourceClient, sourcePort); + } + + bool isValid() const noexcept + { + return client != nullptr && client->get() != nullptr && portId >= 0; + } + + AlsaClient::Ptr client; + int portId; +}; + +//============================================================================== +class AlsaPortAndCallback +{ +public: + AlsaPortAndCallback (AlsaPort p, MidiInput* in, MidiInputCallback* cb) + : port (p), midiInput (in), callback (cb), callbackEnabled (false) + { + } + + ~AlsaPortAndCallback() + { + enableCallback (false); + port.deletePort(); + } + + void enableCallback (bool enable) + { + if (callbackEnabled != enable) + { + callbackEnabled = enable; + + if (enable) + port.client->registerCallback (this); + else + port.client->unregisterCallback (this); + } + } + + void handleIncomingMidiMessage (const MidiMessage& message) const + { + callback->handleIncomingMidiMessage (midiInput, message); + } + +private: + AlsaPort port; + MidiInput* midiInput; + MidiInputCallback* callback; + bool callbackEnabled; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AlsaPortAndCallback) +}; + +void AlsaClient::handleIncomingMidiMessage (const MidiMessage& message, int port) +{ + const ScopedLock sl (callbackLock); + + if (AlsaPortAndCallback* const cb = activeCallbacks[port]) + cb->handleIncomingMidiMessage (message); +} + +//============================================================================== +static AlsaPort iterateMidiClient (const AlsaClient::Ptr& seq, + snd_seq_client_info_t* clientInfo, + const bool forInput, + StringArray& deviceNamesFound, + const int deviceIndexToOpen) +{ + AlsaPort port; + + snd_seq_t* seqHandle = seq->get(); + snd_seq_port_info_t* portInfo = nullptr; + + if (snd_seq_port_info_malloc (&portInfo) == 0) + { + int numPorts = snd_seq_client_info_get_num_ports (clientInfo); + const int client = snd_seq_client_info_get_client (clientInfo); + + snd_seq_port_info_set_client (portInfo, client); + snd_seq_port_info_set_port (portInfo, -1); + + while (--numPorts >= 0) + { + if (snd_seq_query_next_port (seqHandle, portInfo) == 0 + && (snd_seq_port_info_get_capability (portInfo) & (forInput ? SND_SEQ_PORT_CAP_READ + : SND_SEQ_PORT_CAP_WRITE)) != 0) + { + deviceNamesFound.add (snd_seq_client_info_get_name (clientInfo)); + + if (deviceNamesFound.size() == deviceIndexToOpen + 1) + { + const int sourcePort = snd_seq_port_info_get_port (portInfo); + const int sourceClient = snd_seq_client_info_get_client (clientInfo); + + if (sourcePort != -1) + { + const String name (forInput ? JUCE_ALSA_MIDI_INPUT_NAME + : JUCE_ALSA_MIDI_OUTPUT_NAME); + seq->setName (name); + port.createPort (seq, name, forInput); + port.connectWith (sourceClient, sourcePort); + } + } + } + } + + snd_seq_port_info_free (portInfo); + } + + return port; +} + +static AlsaPort iterateMidiDevices (const bool forInput, + StringArray& deviceNamesFound, + const int deviceIndexToOpen) +{ + AlsaPort port; + const AlsaClient::Ptr client (globalAlsaSequencer (forInput)); + + if (snd_seq_t* const seqHandle = client->get()) + { + snd_seq_system_info_t* systemInfo = nullptr; + snd_seq_client_info_t* clientInfo = nullptr; + + if (snd_seq_system_info_malloc (&systemInfo) == 0) + { + if (snd_seq_system_info (seqHandle, systemInfo) == 0 + && snd_seq_client_info_malloc (&clientInfo) == 0) + { + int numClients = snd_seq_system_info_get_cur_clients (systemInfo); + + while (--numClients >= 0 && ! port.isValid()) + if (snd_seq_query_next_client (seqHandle, clientInfo) == 0) + port = iterateMidiClient (client, clientInfo, forInput, + deviceNamesFound, deviceIndexToOpen); + + snd_seq_client_info_free (clientInfo); + } + + snd_seq_system_info_free (systemInfo); + } + + } + + deviceNamesFound.appendNumbersToDuplicates (true, true); + + return port; +} + +AlsaPort createMidiDevice (const bool forInput, const String& deviceNameToOpen) +{ + AlsaPort port; + AlsaClient::Ptr client (new AlsaClient (forInput)); + + if (client->get()) + { + client->setName (deviceNameToOpen + (forInput ? " Input" : " Output")); + port.createPort (client, forInput ? "in" : "out", forInput); + } + + return port; +} + +//============================================================================== +class MidiOutputDevice +{ +public: + MidiOutputDevice (MidiOutput* const output, const AlsaPort& p) + : midiOutput (output), port (p), + maxEventSize (16 * 1024) + { + jassert (port.isValid() && midiOutput != nullptr); + snd_midi_event_new (maxEventSize, &midiParser); + } + + ~MidiOutputDevice() + { + snd_midi_event_free (midiParser); + port.deletePort(); + } + + void sendMessageNow (const MidiMessage& message) + { + if (message.getRawDataSize() > maxEventSize) + { + maxEventSize = message.getRawDataSize(); + snd_midi_event_free (midiParser); + snd_midi_event_new (maxEventSize, &midiParser); + } + + snd_seq_event_t event; + snd_seq_ev_clear (&event); + + long numBytes = (long) message.getRawDataSize(); + const uint8* data = message.getRawData(); + + snd_seq_t* seqHandle = port.client->get(); + + while (numBytes > 0) + { + const long numSent = snd_midi_event_encode (midiParser, data, numBytes, &event); + if (numSent <= 0) + break; + + numBytes -= numSent; + data += numSent; + + snd_seq_ev_set_source (&event, 0); + snd_seq_ev_set_subs (&event); + snd_seq_ev_set_direct (&event); + + snd_seq_event_output (seqHandle, &event); + } + + snd_seq_drain_output (seqHandle); + snd_midi_event_reset_encode (midiParser); + } + +private: + MidiOutput* const midiOutput; + AlsaPort port; + snd_midi_event_t* midiParser; + int maxEventSize; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutputDevice); +}; + +} // namespace + +StringArray MidiOutput::getDevices() +{ + StringArray devices; + iterateMidiDevices (false, devices, -1); + return devices; +} + +int MidiOutput::getDefaultDeviceIndex() +{ + return 0; +} + +MidiOutput* MidiOutput::openDevice (int deviceIndex) +{ + MidiOutput* newDevice = nullptr; + + StringArray devices; + AlsaPort port (iterateMidiDevices (false, devices, deviceIndex)); + + if (port.isValid()) + { + newDevice = new MidiOutput(); + newDevice->internal = new MidiOutputDevice (newDevice, port); + } + + return newDevice; +} + +MidiOutput* MidiOutput::createNewDevice (const String& deviceName) +{ + MidiOutput* newDevice = nullptr; + + AlsaPort port (createMidiDevice (false, deviceName)); + + if (port.isValid()) + { + newDevice = new MidiOutput(); + newDevice->internal = new MidiOutputDevice (newDevice, port); + } + + return newDevice; +} + +MidiOutput::~MidiOutput() +{ + stopBackgroundThread(); + + delete static_cast (internal); +} + +void MidiOutput::sendMessageNow (const MidiMessage& message) +{ + static_cast (internal)->sendMessageNow (message); +} + +//============================================================================== +MidiInput::MidiInput (const String& nm) + : name (nm), internal (nullptr) +{ +} + +MidiInput::~MidiInput() +{ + stop(); + delete static_cast (internal); +} + +void MidiInput::start() +{ + static_cast (internal)->enableCallback (true); +} + +void MidiInput::stop() +{ + static_cast (internal)->enableCallback (false); +} + +int MidiInput::getDefaultDeviceIndex() +{ + return 0; +} + +StringArray MidiInput::getDevices() +{ + StringArray devices; + iterateMidiDevices (true, devices, -1); + return devices; +} + +MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback) +{ + MidiInput* newDevice = nullptr; + + StringArray devices; + AlsaPort port (iterateMidiDevices (true, devices, deviceIndex)); + + if (port.isValid()) + { + newDevice = new MidiInput (devices [deviceIndex]); + newDevice->internal = new AlsaPortAndCallback (port, newDevice, callback); + } + + return newDevice; +} + +MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback) +{ + MidiInput* newDevice = nullptr; + + AlsaPort port (createMidiDevice (true, deviceName)); + + if (port.isValid()) + { + newDevice = new MidiInput (deviceName); + newDevice->internal = new AlsaPortAndCallback (port, newDevice, callback); + } + + return newDevice; +} + + +//============================================================================== +#else + +// (These are just stub functions if ALSA is unavailable...) + +StringArray MidiOutput::getDevices() { return StringArray(); } +int MidiOutput::getDefaultDeviceIndex() { return 0; } +MidiOutput* MidiOutput::openDevice (int) { return nullptr; } +MidiOutput* MidiOutput::createNewDevice (const String&) { return nullptr; } +MidiOutput::~MidiOutput() {} +void MidiOutput::sendMessageNow (const MidiMessage&) {} + +MidiInput::MidiInput (const String& nm) : name (nm), internal (nullptr) {} +MidiInput::~MidiInput() {} +void MidiInput::start() {} +void MidiInput::stop() {} +int MidiInput::getDefaultDeviceIndex() { return 0; } +StringArray MidiInput::getDevices() { return StringArray(); } +MidiInput* MidiInput::openDevice (int, MidiInputCallback*) { return nullptr; } +MidiInput* MidiInput::createNewDevice (const String&, MidiInputCallback*) { return nullptr; } + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm new file mode 100644 index 0000000000..8dd7bfad16 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm @@ -0,0 +1,455 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +const int kilobytesPerSecond1x = 176; + +struct AudioTrackProducerClass : public ObjCClass +{ + AudioTrackProducerClass() : ObjCClass ("JUCEAudioTrackProducer_") + { + addIvar ("source"); + + addMethod (@selector (initWithAudioSourceHolder:), initWithAudioSourceHolder, "@@:^v"); + addMethod (@selector (cleanupTrackAfterBurn:), cleanupTrackAfterBurn, "v@:@"); + addMethod (@selector (cleanupTrackAfterVerification:), cleanupTrackAfterVerification, "c@:@"); + addMethod (@selector (estimateLengthOfTrack:), estimateLengthOfTrack, "Q@:@"); + addMethod (@selector (prepareTrack:forBurn:toMedia:), prepareTrack, "c@:@@@"); + addMethod (@selector (prepareTrackForVerification:), prepareTrackForVerification, "c@:@"); + addMethod (@selector (produceDataForTrack:intoBuffer:length:atAddress:blockSize:ioFlags:), + produceDataForTrack, "I@:@^cIQI^I"); + addMethod (@selector (producePreGapForTrack:intoBuffer:length:atAddress:blockSize:ioFlags:), + produceDataForTrack, "I@:@^cIQI^I"); + addMethod (@selector (verifyDataForTrack:intoBuffer:length:atAddress:blockSize:ioFlags:), + produceDataForTrack, "I@:@^cIQI^I"); + + registerClass(); + } + + struct AudioSourceHolder + { + AudioSourceHolder (AudioSource* s, int numFrames) + : source (s), readPosition (0), lengthInFrames (numFrames) + { + } + + ~AudioSourceHolder() + { + if (source != nullptr) + source->releaseResources(); + } + + ScopedPointer source; + int readPosition, lengthInFrames; + }; + +private: + static id initWithAudioSourceHolder (id self, SEL, AudioSourceHolder* source) + { + self = sendSuperclassMessage (self, @selector (init)); + object_setInstanceVariable (self, "source", source); + return self; + } + + static AudioSourceHolder* getSource (id self) + { + return getIvar (self, "source"); + } + + static void dealloc (id self, SEL) + { + delete getSource (self); + sendSuperclassMessage (self, @selector (dealloc)); + } + + static void cleanupTrackAfterBurn (id self, SEL, DRTrack*) {} + static BOOL cleanupTrackAfterVerification (id self, SEL, DRTrack*) { return true; } + + static uint64_t estimateLengthOfTrack (id self, SEL, DRTrack*) + { + return getSource (self)->lengthInFrames; + } + + static BOOL prepareTrack (id self, SEL, DRTrack*, DRBurn*, NSDictionary*) + { + if (AudioSourceHolder* const source = getSource (self)) + { + source->source->prepareToPlay (44100 / 75, 44100); + source->readPosition = 0; + } + + return true; + } + + static BOOL prepareTrackForVerification (id self, SEL, DRTrack*) + { + if (AudioSourceHolder* const source = getSource (self)) + source->source->prepareToPlay (44100 / 75, 44100); + + return true; + } + + static uint32_t produceDataForTrack (id self, SEL, DRTrack*, char* buffer, + uint32_t bufferLength, uint64_t /*address*/, + uint32_t /*blockSize*/, uint32_t* /*flags*/) + { + if (AudioSourceHolder* const source = getSource (self)) + { + const int numSamples = jmin ((int) bufferLength / 4, + (source->lengthInFrames * (44100 / 75)) - source->readPosition); + + if (numSamples > 0) + { + AudioSampleBuffer tempBuffer (2, numSamples); + AudioSourceChannelInfo info (tempBuffer); + + source->source->getNextAudioBlock (info); + + typedef AudioData::Pointer CDSampleFormat; + typedef AudioData::Pointer SourceSampleFormat; + + CDSampleFormat left (buffer, 2); + left.convertSamples (SourceSampleFormat (tempBuffer.getReadPointer (0)), numSamples); + CDSampleFormat right (buffer + 2, 2); + right.convertSamples (SourceSampleFormat (tempBuffer.getReadPointer (1)), numSamples); + + source->readPosition += numSamples; + } + + return numSamples * 4; + } + + return 0; + } + + static uint32_t producePreGapForTrack (id self, SEL, DRTrack*, char* buffer, + uint32_t bufferLength, uint64_t /*address*/, + uint32_t /*blockSize*/, uint32_t* /*flags*/) + { + zeromem (buffer, bufferLength); + return bufferLength; + } + + static BOOL verifyDataForTrack (id self, SEL, DRTrack*, const char*, + uint32_t /*bufferLength*/, uint64_t /*address*/, + uint32_t /*blockSize*/, uint32_t* /*flags*/) + { + return true; + } +}; + +struct OpenDiskDevice +{ + OpenDiskDevice (DRDevice* d) + : device (d), + tracks ([[NSMutableArray alloc] init]), + underrunProtection (true) + { + } + + ~OpenDiskDevice() + { + [tracks release]; + } + + void addSourceTrack (AudioSource* source, int numSamples) + { + if (source != nullptr) + { + const int numFrames = (numSamples + 587) / 588; + + static AudioTrackProducerClass cls; + + NSObject* producer = [cls.createInstance() performSelector: @selector (initWithAudioSourceHolder:) + withObject: (id) new AudioTrackProducerClass::AudioSourceHolder (source, numFrames)]; + DRTrack* track = [[DRTrack alloc] initWithProducer: producer]; + + { + NSMutableDictionary* p = [[track properties] mutableCopy]; + [p setObject: [DRMSF msfWithFrames: numFrames] forKey: DRTrackLengthKey]; + [p setObject: [NSNumber numberWithUnsignedShort: 2352] forKey: DRBlockSizeKey]; + [p setObject: [NSNumber numberWithInt: 0] forKey: DRDataFormKey]; + [p setObject: [NSNumber numberWithInt: 0] forKey: DRBlockTypeKey]; + [p setObject: [NSNumber numberWithInt: 0] forKey: DRTrackModeKey]; + [p setObject: [NSNumber numberWithInt: 0] forKey: DRSessionFormatKey]; + [track setProperties: p]; + [p release]; + } + + [tracks addObject: track]; + + [track release]; + [producer release]; + } + } + + String burn (AudioCDBurner::BurnProgressListener* listener, + bool shouldEject, bool peformFakeBurnForTesting, int burnSpeed) + { + DRBurn* burn = [DRBurn burnForDevice: device]; + + if (! [device acquireExclusiveAccess]) + return "Couldn't open or write to the CD device"; + + [device acquireMediaReservation]; + + NSMutableDictionary* d = [[burn properties] mutableCopy]; + [d autorelease]; + [d setObject: [NSNumber numberWithBool: peformFakeBurnForTesting] forKey: DRBurnTestingKey]; + [d setObject: [NSNumber numberWithBool: false] forKey: DRBurnVerifyDiscKey]; + [d setObject: (shouldEject ? DRBurnCompletionActionEject : DRBurnCompletionActionMount) forKey: DRBurnCompletionActionKey]; + + if (burnSpeed > 0) + [d setObject: [NSNumber numberWithFloat: burnSpeed * kilobytesPerSecond1x] forKey: DRBurnRequestedSpeedKey]; + + if (! underrunProtection) + [d setObject: [NSNumber numberWithBool: false] forKey: DRBurnUnderrunProtectionKey]; + + [burn setProperties: d]; + + [burn writeLayout: tracks]; + + for (;;) + { + Thread::sleep (300); + float progress = [[[burn status] objectForKey: DRStatusPercentCompleteKey] floatValue]; + + if (listener != nullptr && listener->audioCDBurnProgress (progress)) + { + [burn abort]; + return "User cancelled the write operation"; + } + + if ([[[burn status] objectForKey: DRStatusStateKey] isEqualTo: DRStatusStateFailed]) + return "Write operation failed"; + + if ([[[burn status] objectForKey: DRStatusStateKey] isEqualTo: DRStatusStateDone]) + break; + + NSString* err = (NSString*) [[[burn status] objectForKey: DRErrorStatusKey] + objectForKey: DRErrorStatusErrorStringKey]; + if ([err length] > 0) + return nsStringToJuce (err); + } + + [device releaseMediaReservation]; + [device releaseExclusiveAccess]; + return String::empty; + } + + DRDevice* device; + NSMutableArray* tracks; + bool underrunProtection; +}; + +//============================================================================== +class AudioCDBurner::Pimpl : public Timer +{ +public: + Pimpl (AudioCDBurner& b, int deviceIndex) : owner (b) + { + if (DRDevice* dev = [[DRDevice devices] objectAtIndex: deviceIndex]) + { + device = new OpenDiskDevice (dev); + lastState = getDiskState(); + startTimer (1000); + } + } + + ~Pimpl() + { + stopTimer(); + } + + void timerCallback() override + { + const DiskState state = getDiskState(); + + if (state != lastState) + { + lastState = state; + owner.sendChangeMessage(); + } + } + + DiskState getDiskState() const + { + if ([device->device isValid]) + { + NSDictionary* status = [device->device status]; + NSString* state = [status objectForKey: DRDeviceMediaStateKey]; + + if ([state isEqualTo: DRDeviceMediaStateNone]) + { + if ([[status objectForKey: DRDeviceIsTrayOpenKey] boolValue]) + return trayOpen; + + return noDisc; + } + + if ([state isEqualTo: DRDeviceMediaStateMediaPresent]) + { + if ([[[status objectForKey: DRDeviceMediaInfoKey] objectForKey: DRDeviceMediaBlocksFreeKey] intValue] > 0) + return writableDiskPresent; + + return readOnlyDiskPresent; + } + } + + return unknown; + } + + bool openTray() { return [device->device isValid] && [device->device ejectMedia]; } + + Array getAvailableWriteSpeeds() const + { + Array results; + + if ([device->device isValid]) + for (id kbPerSec in [[[device->device status] objectForKey: DRDeviceMediaInfoKey] objectForKey: DRDeviceBurnSpeedsKey]) + results.add ([kbPerSec intValue] / kilobytesPerSecond1x); + + return results; + } + + bool setBufferUnderrunProtection (const bool shouldBeEnabled) + { + if ([device->device isValid]) + { + device->underrunProtection = shouldBeEnabled; + return shouldBeEnabled && [[[device->device status] objectForKey: DRDeviceCanUnderrunProtectCDKey] boolValue]; + } + + return false; + } + + int getNumAvailableAudioBlocks() const + { + return [[[[device->device status] objectForKey: DRDeviceMediaInfoKey] + objectForKey: DRDeviceMediaBlocksFreeKey] intValue]; + } + + ScopedPointer device; + +private: + DiskState lastState; + AudioCDBurner& owner; +}; + +//============================================================================== +AudioCDBurner::AudioCDBurner (const int deviceIndex) +{ + pimpl = new Pimpl (*this, deviceIndex); +} + +AudioCDBurner::~AudioCDBurner() +{ +} + +AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) +{ + ScopedPointer b (new AudioCDBurner (deviceIndex)); + + if (b->pimpl->device == nil) + b = nullptr; + + return b.release(); +} + +StringArray AudioCDBurner::findAvailableDevices() +{ + StringArray s; + + for (NSDictionary* dic in [DRDevice devices]) + if (NSString* name = [dic valueForKey: DRDeviceProductNameKey]) + s.add (nsStringToJuce (name)); + + return s; +} + +AudioCDBurner::DiskState AudioCDBurner::getDiskState() const +{ + return pimpl->getDiskState(); +} + +bool AudioCDBurner::isDiskPresent() const +{ + return getDiskState() == writableDiskPresent; +} + +bool AudioCDBurner::openTray() +{ + return pimpl->openTray(); +} + +AudioCDBurner::DiskState AudioCDBurner::waitUntilStateChange (int timeOutMilliseconds) +{ + const int64 timeout = Time::currentTimeMillis() + timeOutMilliseconds; + DiskState oldState = getDiskState(); + DiskState newState = oldState; + + while (newState == oldState && Time::currentTimeMillis() < timeout) + { + newState = getDiskState(); + Thread::sleep (100); + } + + return newState; +} + +Array AudioCDBurner::getAvailableWriteSpeeds() const +{ + return pimpl->getAvailableWriteSpeeds(); +} + +bool AudioCDBurner::setBufferUnderrunProtection (const bool shouldBeEnabled) +{ + return pimpl->setBufferUnderrunProtection (shouldBeEnabled); +} + +int AudioCDBurner::getNumAvailableAudioBlocks() const +{ + return pimpl->getNumAvailableAudioBlocks(); +} + +bool AudioCDBurner::addAudioTrack (AudioSource* source, int numSamps) +{ + if ([pimpl->device->device isValid]) + { + pimpl->device->addSourceTrack (source, numSamps); + return true; + } + + return false; +} + +String AudioCDBurner::burn (AudioCDBurner::BurnProgressListener* listener, + bool ejectDiscAfterwards, + bool performFakeBurnForTesting, + int writeSpeed) +{ + if ([pimpl->device->device isValid]) + return pimpl->device->burn (listener, ejectDiscAfterwards, performFakeBurnForTesting, writeSpeed); + + return "Couldn't open or write to the CD device"; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm new file mode 100644 index 0000000000..447c98b88e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm @@ -0,0 +1,261 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace CDReaderHelpers +{ + inline const XmlElement* getElementForKey (const XmlElement& xml, const String& key) + { + forEachXmlChildElementWithTagName (xml, child, "key") + if (child->getAllSubText().trim() == key) + return child->getNextElement(); + + return nullptr; + } + + static int getIntValueForKey (const XmlElement& xml, const String& key, int defaultValue = -1) + { + const XmlElement* const block = getElementForKey (xml, key); + return block != nullptr ? block->getAllSubText().trim().getIntValue() : defaultValue; + } + + // Get the track offsets for a CD given an XmlElement representing its TOC.Plist. + // Returns NULL on success, otherwise a const char* representing an error. + static const char* getTrackOffsets (XmlDocument& xmlDocument, Array& offsets) + { + const ScopedPointer xml (xmlDocument.getDocumentElement()); + if (xml == nullptr) + return "Couldn't parse XML in file"; + + const XmlElement* const dict = xml->getChildByName ("dict"); + if (dict == nullptr) + return "Couldn't get top level dictionary"; + + const XmlElement* const sessions = getElementForKey (*dict, "Sessions"); + if (sessions == nullptr) + return "Couldn't find sessions key"; + + const XmlElement* const session = sessions->getFirstChildElement(); + if (session == nullptr) + return "Couldn't find first session"; + + const int leadOut = getIntValueForKey (*session, "Leadout Block"); + if (leadOut < 0) + return "Couldn't find Leadout Block"; + + const XmlElement* const trackArray = getElementForKey (*session, "Track Array"); + if (trackArray == nullptr) + return "Couldn't find Track Array"; + + forEachXmlChildElement (*trackArray, track) + { + const int trackValue = getIntValueForKey (*track, "Start Block"); + if (trackValue < 0) + return "Couldn't find Start Block in the track"; + + offsets.add (trackValue * AudioCDReader::samplesPerFrame - 88200); + } + + offsets.add (leadOut * AudioCDReader::samplesPerFrame - 88200); + return nullptr; + } + + static void findDevices (Array& cds) + { + File volumes ("/Volumes"); + volumes.findChildFiles (cds, File::findDirectories, false); + + for (int i = cds.size(); --i >= 0;) + if (! cds.getReference(i).getChildFile (".TOC.plist").exists()) + cds.remove (i); + } + + struct TrackSorter + { + static int getCDTrackNumber (const File& file) + { + return file.getFileName().initialSectionContainingOnly ("0123456789").getIntValue(); + } + + static int compareElements (const File& first, const File& second) + { + const int firstTrack = getCDTrackNumber (first); + const int secondTrack = getCDTrackNumber (second); + + jassert (firstTrack > 0 && secondTrack > 0); + + return firstTrack - secondTrack; + } + }; +} + +//============================================================================== +StringArray AudioCDReader::getAvailableCDNames() +{ + Array cds; + CDReaderHelpers::findDevices (cds); + + StringArray names; + + for (int i = 0; i < cds.size(); ++i) + names.add (cds.getReference(i).getFileName()); + + return names; +} + +AudioCDReader* AudioCDReader::createReaderForCD (const int index) +{ + Array cds; + CDReaderHelpers::findDevices (cds); + + if (cds[index].exists()) + return new AudioCDReader (cds[index]); + + return nullptr; +} + +AudioCDReader::AudioCDReader (const File& volume) + : AudioFormatReader (0, "CD Audio"), + volumeDir (volume), + currentReaderTrack (-1), + reader (0) +{ + sampleRate = 44100.0; + bitsPerSample = 16; + numChannels = 2; + usesFloatingPointData = false; + + refreshTrackLengths(); +} + +AudioCDReader::~AudioCDReader() +{ +} + +void AudioCDReader::refreshTrackLengths() +{ + tracks.clear(); + trackStartSamples.clear(); + lengthInSamples = 0; + + volumeDir.findChildFiles (tracks, File::findFiles | File::ignoreHiddenFiles, false, "*.aiff"); + + CDReaderHelpers::TrackSorter sorter; + tracks.sort (sorter); + + const File toc (volumeDir.getChildFile (".TOC.plist")); + + if (toc.exists()) + { + XmlDocument doc (toc); + const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples); + (void) error; // could be logged.. + + lengthInSamples = trackStartSamples.getLast() - trackStartSamples.getFirst(); + } +} + +bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + while (numSamples > 0) + { + int track = -1; + + for (int i = 0; i < trackStartSamples.size() - 1; ++i) + { + if (startSampleInFile < trackStartSamples.getUnchecked (i + 1)) + { + track = i; + break; + } + } + + if (track < 0) + return false; + + if (track != currentReaderTrack) + { + reader = nullptr; + + if (FileInputStream* const in = tracks [track].createInputStream()) + { + BufferedInputStream* const bin = new BufferedInputStream (in, 65536, true); + + AiffAudioFormat format; + reader = format.createReaderFor (bin, true); + + if (reader == nullptr) + currentReaderTrack = -1; + else + currentReaderTrack = track; + } + } + + if (reader == nullptr) + return false; + + const int startPos = (int) (startSampleInFile - trackStartSamples.getUnchecked (track)); + const int numAvailable = (int) jmin ((int64) numSamples, reader->lengthInSamples - startPos); + + reader->readSamples (destSamples, numDestChannels, startOffsetInDestBuffer, startPos, numAvailable); + + numSamples -= numAvailable; + startSampleInFile += numAvailable; + } + + return true; +} + +bool AudioCDReader::isCDStillPresent() const +{ + return volumeDir.exists(); +} + +void AudioCDReader::ejectDisk() +{ + JUCE_AUTORELEASEPOOL + { + [[NSWorkspace sharedWorkspace] unmountAndEjectDeviceAtPath: juceStringToNS (volumeDir.getFullPathName())]; + } +} + +bool AudioCDReader::isTrackAudio (int trackNum) const +{ + return tracks [trackNum].hasFileExtension (".aiff"); +} + +void AudioCDReader::enableIndexScanning (bool) +{ + // any way to do this on a Mac?? +} + +int AudioCDReader::getLastIndex() const +{ + return 0; +} + +Array AudioCDReader::findIndexesInTrack (const int /*trackNumber*/) +{ + return Array(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp new file mode 100644 index 0000000000..d7044eb138 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -0,0 +1,1945 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_COREAUDIO_LOGGING_ENABLED + #define JUCE_COREAUDIOLOG(a) { String camsg ("CoreAudio: "); camsg << a; Logger::writeToLog (camsg); } +#else + #define JUCE_COREAUDIOLOG(a) +#endif + +//============================================================================== +struct SystemVol +{ + SystemVol (AudioObjectPropertySelector selector) + : outputDeviceID (kAudioObjectUnknown) + { + addr.mScope = kAudioObjectPropertyScopeGlobal; + addr.mElement = kAudioObjectPropertyElementMaster; + addr.mSelector = kAudioHardwarePropertyDefaultOutputDevice; + + if (AudioHardwareServiceHasProperty (kAudioObjectSystemObject, &addr)) + { + UInt32 deviceIDSize = sizeof (outputDeviceID); + OSStatus status = AudioHardwareServiceGetPropertyData (kAudioObjectSystemObject, &addr, 0, + nullptr, &deviceIDSize, &outputDeviceID); + + if (status == noErr) + { + addr.mElement = kAudioObjectPropertyElementMaster; + addr.mSelector = selector; + addr.mScope = kAudioDevicePropertyScopeOutput; + + if (! AudioHardwareServiceHasProperty (outputDeviceID, &addr)) + outputDeviceID = kAudioObjectUnknown; + } + } + } + + float getGain() + { + Float32 gain = 0; + + if (outputDeviceID != kAudioObjectUnknown) + { + UInt32 size = sizeof (gain); + AudioHardwareServiceGetPropertyData (outputDeviceID, &addr, + 0, nullptr, &size, &gain); + } + + return (float) gain; + } + + bool setGain (float gain) + { + if (outputDeviceID != kAudioObjectUnknown && canSetVolume()) + { + Float32 newVolume = gain; + UInt32 size = sizeof (newVolume); + + return AudioHardwareServiceSetPropertyData (outputDeviceID, &addr, 0, nullptr, + size, &newVolume) == noErr; + } + + return false; + } + + bool isMuted() + { + UInt32 muted = 0; + + if (outputDeviceID != kAudioObjectUnknown) + { + UInt32 size = sizeof (muted); + AudioHardwareServiceGetPropertyData (outputDeviceID, &addr, + 0, nullptr, &size, &muted); + } + + return muted != 0; + } + + bool setMuted (bool mute) + { + if (outputDeviceID != kAudioObjectUnknown && canSetVolume()) + { + UInt32 newMute = mute ? 1 : 0; + UInt32 size = sizeof (newMute); + + return AudioHardwareServiceSetPropertyData (outputDeviceID, &addr, 0, nullptr, + size, &newMute) == noErr; + } + + return false; + } + +private: + AudioDeviceID outputDeviceID; + AudioObjectPropertyAddress addr; + + bool canSetVolume() + { + Boolean isSettable = NO; + return AudioHardwareServiceIsPropertySettable (outputDeviceID, &addr, &isSettable) == noErr + && isSettable; + } +}; + +#define JUCE_SYSTEMAUDIOVOL_IMPLEMENTED 1 +float JUCE_CALLTYPE SystemAudioVolume::getGain() { return SystemVol (kAudioHardwareServiceDeviceProperty_VirtualMasterVolume).getGain(); } +bool JUCE_CALLTYPE SystemAudioVolume::setGain (float gain) { return SystemVol (kAudioHardwareServiceDeviceProperty_VirtualMasterVolume).setGain (gain); } +bool JUCE_CALLTYPE SystemAudioVolume::isMuted() { return SystemVol (kAudioDevicePropertyMute).isMuted(); } +bool JUCE_CALLTYPE SystemAudioVolume::setMuted (bool mute) { return SystemVol (kAudioDevicePropertyMute).setMuted (mute); } + +//============================================================================== +struct CoreAudioClasses +{ + +class CoreAudioIODevice; + +//============================================================================== +class CoreAudioInternal : private Timer +{ +public: + CoreAudioInternal (CoreAudioIODevice& d, AudioDeviceID id) + : owner (d), + inputLatency (0), + outputLatency (0), + bitDepth (32), + callback (nullptr), + #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + audioProcID (0), + #endif + deviceID (id), + started (false), + sampleRate (0), + bufferSize (512), + numInputChans (0), + numOutputChans (0), + callbacksAllowed (true) + { + jassert (deviceID != 0); + + updateDetailsFromDevice(); + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioObjectPropertySelectorWildcard; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementWildcard; + + AudioObjectAddPropertyListener (deviceID, &pa, deviceListenerProc, this); + } + + ~CoreAudioInternal() + { + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioObjectPropertySelectorWildcard; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementWildcard; + + AudioObjectRemovePropertyListener (deviceID, &pa, deviceListenerProc, this); + + stop (false); + } + + void allocateTempBuffers() + { + const int tempBufSize = bufferSize + 4; + audioBuffer.calloc ((size_t) ((numInputChans + numOutputChans) * tempBufSize)); + + tempInputBuffers.calloc ((size_t) numInputChans + 2); + tempOutputBuffers.calloc ((size_t) numOutputChans + 2); + + int count = 0; + for (int i = 0; i < numInputChans; ++i) tempInputBuffers[i] = audioBuffer + count++ * tempBufSize; + for (int i = 0; i < numOutputChans; ++i) tempOutputBuffers[i] = audioBuffer + count++ * tempBufSize; + } + + struct CallbackDetailsForChannel + { + int streamNum; + int dataOffsetSamples; + int dataStrideSamples; + }; + + // returns the number of actual available channels + StringArray getChannelInfo (const bool input, Array& newChannelInfo) const + { + StringArray newNames; + int chanNum = 0; + UInt32 size; + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyStreamConfiguration; + pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + pa.mElement = kAudioObjectPropertyElementMaster; + + if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size))) + { + HeapBlock bufList; + bufList.calloc (size, 1); + + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, bufList))) + { + const int numStreams = (int) bufList->mNumberBuffers; + + for (int i = 0; i < numStreams; ++i) + { + const AudioBuffer& b = bufList->mBuffers[i]; + + for (unsigned int j = 0; j < b.mNumberChannels; ++j) + { + String name; + NSString* nameNSString = nil; + size = sizeof (nameNSString); + + pa.mSelector = kAudioObjectPropertyElementName; + pa.mElement = (AudioObjectPropertyElement) chanNum + 1; + + if (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &nameNSString) == noErr) + { + name = nsStringToJuce (nameNSString); + [nameNSString release]; + } + + if ((input ? activeInputChans : activeOutputChans) [chanNum]) + { + CallbackDetailsForChannel info = { i, (int) j, (int) b.mNumberChannels }; + newChannelInfo.add (info); + } + + if (name.isEmpty()) + name << (input ? "Input " : "Output ") << (chanNum + 1); + + newNames.add (name); + ++chanNum; + } + } + } + } + + return newNames; + } + + Array getSampleRatesFromDevice() const + { + Array newSampleRates; + + AudioObjectPropertyAddress pa; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + pa.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; + UInt32 size = 0; + + if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size))) + { + HeapBlock ranges; + ranges.calloc (size, 1); + + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges))) + { + static const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 }; + + for (int i = 0; i < numElementsInArray (possibleRates); ++i) + { + for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) + { + if (possibleRates[i] >= ranges[j].mMinimum - 2 && possibleRates[i] <= ranges[j].mMaximum + 2) + { + newSampleRates.add (possibleRates[i]); + break; + } + } + } + } + } + + if (newSampleRates.size() == 0 && sampleRate > 0) + newSampleRates.add (sampleRate); + + return newSampleRates; + } + + Array getBufferSizesFromDevice() const + { + Array newBufferSizes; + + AudioObjectPropertyAddress pa; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + pa.mSelector = kAudioDevicePropertyBufferFrameSizeRange; + UInt32 size = 0; + + if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size))) + { + HeapBlock ranges; + ranges.calloc (size, 1); + + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges))) + { + newBufferSizes.add ((int) (ranges[0].mMinimum + 15) & ~15); + + for (int i = 32; i < 2048; i += 32) + { + for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) + { + if (i >= ranges[j].mMinimum && i <= ranges[j].mMaximum) + { + newBufferSizes.addIfNotAlreadyThere (i); + break; + } + } + } + + if (bufferSize > 0) + newBufferSizes.addIfNotAlreadyThere (bufferSize); + } + } + + if (newBufferSizes.size() == 0 && bufferSize > 0) + newBufferSizes.add (bufferSize); + + return newBufferSizes; + } + + int getLatencyFromDevice (AudioObjectPropertyScope scope) const + { + UInt32 lat = 0; + UInt32 size = sizeof (lat); + AudioObjectPropertyAddress pa; + pa.mElement = kAudioObjectPropertyElementMaster; + pa.mSelector = kAudioDevicePropertyLatency; + pa.mScope = scope; + AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &lat); + return (int) lat; + } + + int getBitDepthFromDevice (AudioObjectPropertyScope scope) const + { + AudioObjectPropertyAddress pa; + pa.mElement = kAudioObjectPropertyElementMaster; + pa.mSelector = kAudioStreamPropertyPhysicalFormat; + pa.mScope = scope; + + AudioStreamBasicDescription asbd; + UInt32 size = sizeof (asbd); + + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &asbd))) + return (int) asbd.mBitsPerChannel; + + return 0; + } + + void updateDetailsFromDevice() + { + stopTimer(); + + if (deviceID == 0) + return; + + // this collects all the new details from the device without any locking, then + // locks + swaps them afterwards. + AudioObjectPropertyAddress pa; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + + UInt32 isAlive; + UInt32 size = sizeof (isAlive); + pa.mSelector = kAudioDevicePropertyDeviceIsAlive; + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &isAlive)) && isAlive == 0) + return; + + Float64 sr; + size = sizeof (sr); + pa.mSelector = kAudioDevicePropertyNominalSampleRate; + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &sr))) + sampleRate = sr; + + UInt32 framesPerBuf = (UInt32) bufferSize; + size = sizeof (framesPerBuf); + pa.mSelector = kAudioDevicePropertyBufferFrameSize; + AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &framesPerBuf); + + Array newBufferSizes (getBufferSizesFromDevice()); + Array newSampleRates (getSampleRatesFromDevice()); + + inputLatency = getLatencyFromDevice (kAudioDevicePropertyScopeInput); + outputLatency = getLatencyFromDevice (kAudioDevicePropertyScopeOutput); + + Array newInChans, newOutChans; + StringArray newInNames (getChannelInfo (true, newInChans)); + StringArray newOutNames (getChannelInfo (false, newOutChans)); + + const int inputBitDepth = getBitDepthFromDevice (kAudioDevicePropertyScopeInput); + const int outputBitDepth = getBitDepthFromDevice (kAudioDevicePropertyScopeOutput); + + bitDepth = jmax (inputBitDepth, outputBitDepth); + if (bitDepth <= 0) + bitDepth = 32; + + // after getting the new values, lock + apply them + const ScopedLock sl (callbackLock); + + bufferSize = (int) framesPerBuf; + allocateTempBuffers(); + + sampleRates.swapWith (newSampleRates); + bufferSizes.swapWith (newBufferSizes); + + inChanNames.swapWith (newInNames); + outChanNames.swapWith (newOutNames); + + inputChannelInfo.swapWith (newInChans); + outputChannelInfo.swapWith (newOutChans); + } + + //============================================================================== + StringArray getSources (bool input) + { + StringArray s; + HeapBlock types; + const int num = getAllDataSourcesForDevice (deviceID, types); + + for (int i = 0; i < num; ++i) + { + AudioValueTranslation avt; + char buffer[256]; + + avt.mInputData = &(types[i]); + avt.mInputDataSize = sizeof (UInt32); + avt.mOutputData = buffer; + avt.mOutputDataSize = 256; + + UInt32 transSize = sizeof (avt); + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyDataSourceNameForID; + pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + pa.mElement = kAudioObjectPropertyElementMaster; + + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &transSize, &avt))) + s.add (buffer); + } + + return s; + } + + int getCurrentSourceIndex (bool input) const + { + OSType currentSourceID = 0; + UInt32 size = sizeof (currentSourceID); + int result = -1; + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyDataSource; + pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + pa.mElement = kAudioObjectPropertyElementMaster; + + if (deviceID != 0) + { + if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ¤tSourceID))) + { + HeapBlock types; + const int num = getAllDataSourcesForDevice (deviceID, types); + + for (int i = 0; i < num; ++i) + { + if (types[num] == currentSourceID) + { + result = i; + break; + } + } + } + } + + return result; + } + + void setCurrentSourceIndex (int index, bool input) + { + if (deviceID != 0) + { + HeapBlock types; + const int num = getAllDataSourcesForDevice (deviceID, types); + + if (isPositiveAndBelow (index, num)) + { + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyDataSource; + pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + pa.mElement = kAudioObjectPropertyElementMaster; + + OSType typeId = types[index]; + + OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (typeId), &typeId)); + } + } + } + + //============================================================================== + String reopen (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double newSampleRate, int bufferSizeSamples) + { + String error; + callbacksAllowed = false; + stopTimer(); + + stop (false); + + activeInputChans = inputChannels; + activeInputChans.setRange (inChanNames.size(), + activeInputChans.getHighestBit() + 1 - inChanNames.size(), + false); + + activeOutputChans = outputChannels; + activeOutputChans.setRange (outChanNames.size(), + activeOutputChans.getHighestBit() + 1 - outChanNames.size(), + false); + + numInputChans = activeInputChans.countNumberOfSetBits(); + numOutputChans = activeOutputChans.countNumberOfSetBits(); + + // set sample rate + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyNominalSampleRate; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + Float64 sr = newSampleRate; + + if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (sr), &sr))) + { + error = "Couldn't change sample rate"; + } + else + { + // change buffer size + UInt32 framesPerBuf = (UInt32) bufferSizeSamples; + pa.mSelector = kAudioDevicePropertyBufferFrameSize; + + if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (framesPerBuf), &framesPerBuf))) + { + error = "Couldn't change buffer size"; + } + else + { + // Annoyingly, after changing the rate and buffer size, some devices fail to + // correctly report their new settings until some random time in the future, so + // after calling updateDetailsFromDevice, we need to manually bodge these values + // to make sure we're using the correct numbers.. + updateDetailsFromDevice(); + sampleRate = newSampleRate; + bufferSize = bufferSizeSamples; + + if (sampleRates.size() == 0) + error = "Device has no available sample-rates"; + else if (bufferSizes.size() == 0) + error = "Device has no available buffer-sizes"; + } + } + + callbacksAllowed = true; + return error; + } + + bool start() + { + if (! started) + { + callback = nullptr; + + if (deviceID != 0) + { + #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + if (OK (AudioDeviceAddIOProc (deviceID, audioIOProc, this))) + #else + if (OK (AudioDeviceCreateIOProcID (deviceID, audioIOProc, this, &audioProcID))) + #endif + { + if (OK (AudioDeviceStart (deviceID, audioIOProc))) + { + started = true; + } + else + { + #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + OK (AudioDeviceRemoveIOProc (deviceID, audioIOProc)); + #else + OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID)); + audioProcID = 0; + #endif + } + } + } + } + + return started; + } + + void setCallback (AudioIODeviceCallback* cb) + { + const ScopedLock sl (callbackLock); + callback = cb; + } + + void stop (bool leaveInterruptRunning) + { + { + const ScopedLock sl (callbackLock); + callback = nullptr; + } + + if (started + && (deviceID != 0) + && ! leaveInterruptRunning) + { + OK (AudioDeviceStop (deviceID, audioIOProc)); + + #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + OK (AudioDeviceRemoveIOProc (deviceID, audioIOProc)); + #else + OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID)); + audioProcID = 0; + #endif + + started = false; + + { const ScopedLock sl (callbackLock); } + + // wait until it's definately stopped calling back.. + for (int i = 40; --i >= 0;) + { + Thread::sleep (50); + + UInt32 running = 0; + UInt32 size = sizeof (running); + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyDeviceIsRunning; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + + OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &running)); + + if (running == 0) + break; + } + + const ScopedLock sl (callbackLock); + } + } + + double getSampleRate() const { return sampleRate; } + int getBufferSize() const { return bufferSize; } + + void audioCallback (const AudioBufferList* inInputData, + AudioBufferList* outOutputData) + { + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + { + for (int i = numInputChans; --i >= 0;) + { + const CallbackDetailsForChannel& info = inputChannelInfo.getReference(i); + float* dest = tempInputBuffers [i]; + const float* src = ((const float*) inInputData->mBuffers[info.streamNum].mData) + + info.dataOffsetSamples; + const int stride = info.dataStrideSamples; + + if (stride != 0) // if this is zero, info is invalid + { + for (int j = bufferSize; --j >= 0;) + { + *dest++ = *src; + src += stride; + } + } + } + + callback->audioDeviceIOCallback (const_cast (tempInputBuffers.getData()), + numInputChans, + tempOutputBuffers, + numOutputChans, + bufferSize); + + for (int i = numOutputChans; --i >= 0;) + { + const CallbackDetailsForChannel& info = outputChannelInfo.getReference(i); + const float* src = tempOutputBuffers [i]; + float* dest = ((float*) outOutputData->mBuffers[info.streamNum].mData) + + info.dataOffsetSamples; + const int stride = info.dataStrideSamples; + + if (stride != 0) // if this is zero, info is invalid + { + for (int j = bufferSize; --j >= 0;) + { + *dest = *src++; + dest += stride; + } + } + } + } + else + { + for (UInt32 i = 0; i < outOutputData->mNumberBuffers; ++i) + zeromem (outOutputData->mBuffers[i].mData, + outOutputData->mBuffers[i].mDataByteSize); + } + } + + // called by callbacks + void deviceDetailsChanged() + { + if (callbacksAllowed) + startTimer (100); + } + + void timerCallback() override + { + JUCE_COREAUDIOLOG ("Device changed"); + + stopTimer(); + const double oldSampleRate = sampleRate; + const int oldBufferSize = bufferSize; + updateDetailsFromDevice(); + + if (oldBufferSize != bufferSize || oldSampleRate != sampleRate) + owner.restart(); + } + + //============================================================================== + CoreAudioIODevice& owner; + int inputLatency, outputLatency; + int bitDepth; + BigInteger activeInputChans, activeOutputChans; + StringArray inChanNames, outChanNames; + Array sampleRates; + Array bufferSizes; + AudioIODeviceCallback* callback; + #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + AudioDeviceIOProcID audioProcID; + #endif + +private: + CriticalSection callbackLock; + AudioDeviceID deviceID; + bool started; + double sampleRate; + int bufferSize; + HeapBlock audioBuffer; + int numInputChans, numOutputChans; + bool callbacksAllowed; + + Array inputChannelInfo, outputChannelInfo; + HeapBlock tempInputBuffers, tempOutputBuffers; + + //============================================================================== + static OSStatus audioIOProc (AudioDeviceID /*inDevice*/, + const AudioTimeStamp* /*inNow*/, + const AudioBufferList* inInputData, + const AudioTimeStamp* /*inInputTime*/, + AudioBufferList* outOutputData, + const AudioTimeStamp* /*inOutputTime*/, + void* device) + { + static_cast (device)->audioCallback (inInputData, outOutputData); + return noErr; + } + + static OSStatus deviceListenerProc (AudioDeviceID /*inDevice*/, UInt32 /*inLine*/, const AudioObjectPropertyAddress* pa, void* inClientData) + { + CoreAudioInternal* const intern = static_cast (inClientData); + + switch (pa->mSelector) + { + case kAudioDevicePropertyBufferSize: + case kAudioDevicePropertyBufferFrameSize: + case kAudioDevicePropertyNominalSampleRate: + case kAudioDevicePropertyStreamFormat: + case kAudioDevicePropertyDeviceIsAlive: + case kAudioStreamPropertyPhysicalFormat: + intern->deviceDetailsChanged(); + break; + + case kAudioDevicePropertyBufferSizeRange: + case kAudioDevicePropertyVolumeScalar: + case kAudioDevicePropertyMute: + case kAudioDevicePropertyPlayThru: + case kAudioDevicePropertyDataSource: + case kAudioDevicePropertyDeviceIsRunning: + break; + } + + return noErr; + } + + //============================================================================== + static int getAllDataSourcesForDevice (AudioDeviceID deviceID, HeapBlock& types) + { + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyDataSources; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + UInt32 size = 0; + + if (deviceID != 0 + && AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size) == noErr) + { + types.calloc (size, 1); + + if (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, types) == noErr) + return size / (int) sizeof (OSType); + } + + return 0; + } + + bool OK (const OSStatus errorCode) const + { + if (errorCode == noErr) + return true; + + const String errorMessage ("CoreAudio error: " + String::toHexString ((int) errorCode)); + JUCE_COREAUDIOLOG (errorMessage); + + if (callback != nullptr) + callback->audioDeviceError (errorMessage); + + return false; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioInternal) +}; + + +//============================================================================== +class CoreAudioIODevice : public AudioIODevice +{ +public: + CoreAudioIODevice (const String& deviceName, + AudioDeviceID inputDeviceId, const int inputIndex_, + AudioDeviceID outputDeviceId, const int outputIndex_) + : AudioIODevice (deviceName, "CoreAudio"), + inputIndex (inputIndex_), + outputIndex (outputIndex_), + isOpen_ (false), + isStarted (false) + { + CoreAudioInternal* device = nullptr; + + if (outputDeviceId == 0 || outputDeviceId == inputDeviceId) + { + jassert (inputDeviceId != 0); + device = new CoreAudioInternal (*this, inputDeviceId); + } + else + { + device = new CoreAudioInternal (*this, outputDeviceId); + } + + internal = device; + jassert (device != nullptr); + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioObjectPropertySelectorWildcard; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementWildcard; + + AudioObjectAddPropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, internal); + } + + ~CoreAudioIODevice() + { + close(); + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioObjectPropertySelectorWildcard; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementWildcard; + + AudioObjectRemovePropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, internal); + } + + StringArray getOutputChannelNames() override { return internal->outChanNames; } + StringArray getInputChannelNames() override { return internal->inChanNames; } + + bool isOpen() override { return isOpen_; } + + Array getAvailableSampleRates() override { return internal->sampleRates; } + Array getAvailableBufferSizes() override { return internal->bufferSizes; } + + double getCurrentSampleRate() override { return internal->getSampleRate(); } + int getCurrentBitDepth() override { return internal->bitDepth; } + int getCurrentBufferSizeSamples() override { return internal->getBufferSize(); } + + int getDefaultBufferSize() override + { + int best = 0; + + for (int i = 0; best < 512 && i < internal->bufferSizes.size(); ++i) + best = internal->bufferSizes.getUnchecked(i); + + if (best == 0) + best = 512; + + return best; + } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate, int bufferSizeSamples) override + { + isOpen_ = true; + + if (bufferSizeSamples <= 0) + bufferSizeSamples = getDefaultBufferSize(); + + lastError = internal->reopen (inputChannels, outputChannels, sampleRate, bufferSizeSamples); + + JUCE_COREAUDIOLOG ("Opened: " << getName()); + JUCE_COREAUDIOLOG ("Latencies: " << getInputLatencyInSamples() << ' ' << getOutputLatencyInSamples()); + + isOpen_ = lastError.isEmpty(); + return lastError; + } + + void close() override + { + isOpen_ = false; + internal->stop (false); + } + + void restart() + { + JUCE_COREAUDIOLOG ("Restarting"); + AudioIODeviceCallback* oldCallback = internal->callback; + stop(); + start (oldCallback); + } + + BigInteger getActiveOutputChannels() const override { return internal->activeOutputChans; } + BigInteger getActiveInputChannels() const override { return internal->activeInputChans; } + + int getOutputLatencyInSamples() override + { + // this seems like a good guess at getting the latency right - comparing + // this with a round-trip measurement, it gets it to within a few millisecs + // for the built-in mac soundcard + return internal->outputLatency; + } + + int getInputLatencyInSamples() override + { + return internal->inputLatency; + } + + void start (AudioIODeviceCallback* callback) override + { + if (! isStarted) + { + if (callback != nullptr) + callback->audioDeviceAboutToStart (this); + + isStarted = internal->start(); + + if (isStarted) + internal->setCallback (callback); + } + } + + void stop() override + { + if (isStarted) + { + AudioIODeviceCallback* const lastCallback = internal->callback; + + isStarted = false; + internal->stop (true); + + if (lastCallback != nullptr) + lastCallback->audioDeviceStopped(); + } + } + + bool isPlaying() override + { + if (internal->callback == nullptr) + isStarted = false; + + return isStarted; + } + + String getLastError() override + { + return lastError; + } + + int inputIndex, outputIndex; + +private: + ScopedPointer internal; + bool isOpen_, isStarted; + String lastError; + + static OSStatus hardwareListenerProc (AudioDeviceID /*inDevice*/, UInt32 /*inLine*/, const AudioObjectPropertyAddress* pa, void* inClientData) + { + switch (pa->mSelector) + { + case kAudioHardwarePropertyDevices: + static_cast (inClientData)->deviceDetailsChanged(); + break; + + case kAudioHardwarePropertyDefaultOutputDevice: + case kAudioHardwarePropertyDefaultInputDevice: + case kAudioHardwarePropertyDefaultSystemOutputDevice: + break; + } + + return noErr; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioIODevice) +}; + +//============================================================================== +class AudioIODeviceCombiner : public AudioIODevice, + private Thread +{ +public: + AudioIODeviceCombiner (const String& deviceName) + : AudioIODevice (deviceName, "CoreAudio"), + Thread (deviceName), callback (nullptr), + currentSampleRate (0), currentBufferSize (0), active (false) + { + } + + ~AudioIODeviceCombiner() + { + close(); + devices.clear(); + } + + void addDevice (AudioIODevice* device, bool useInputs, bool useOutputs) + { + jassert (device != nullptr); + jassert (! isOpen()); + jassert (! device->isOpen()); + devices.add (new DeviceWrapper (*this, device, useInputs, useOutputs)); + } + + Array getDevices() const + { + Array devs; + + for (int i = 0; i < devices.size(); ++i) + devs.add (devices.getUnchecked(i)->device); + + return devs; + } + + StringArray getOutputChannelNames() override + { + StringArray names; + + for (int i = 0; i < devices.size(); ++i) + names.addArray (devices.getUnchecked(i)->getOutputChannelNames()); + + names.appendNumbersToDuplicates (false, true); + return names; + } + + StringArray getInputChannelNames() override + { + StringArray names; + + for (int i = 0; i < devices.size(); ++i) + names.addArray (devices.getUnchecked(i)->getInputChannelNames()); + + names.appendNumbersToDuplicates (false, true); + return names; + } + + Array getAvailableSampleRates() override + { + Array commonRates; + + for (int i = 0; i < devices.size(); ++i) + { + Array rates (devices.getUnchecked(i)->device->getAvailableSampleRates()); + + if (i == 0) + commonRates = rates; + else + commonRates.removeValuesNotIn (rates); + } + + return commonRates; + } + + Array getAvailableBufferSizes() override + { + Array commonSizes; + + for (int i = 0; i < devices.size(); ++i) + { + Array sizes (devices.getUnchecked(i)->device->getAvailableBufferSizes()); + + if (i == 0) + commonSizes = sizes; + else + commonSizes.removeValuesNotIn (sizes); + } + + return commonSizes; + } + + bool isOpen() override { return active; } + bool isPlaying() override { return callback != nullptr; } + double getCurrentSampleRate() override { return currentSampleRate; } + int getCurrentBufferSizeSamples() override { return currentBufferSize; } + + int getCurrentBitDepth() override + { + int depth = 32; + + for (int i = 0; i < devices.size(); ++i) + depth = jmin (depth, devices.getUnchecked(i)->device->getCurrentBitDepth()); + + return depth; + } + + int getDefaultBufferSize() override + { + int size = 0; + + for (int i = 0; i < devices.size(); ++i) + size = jmax (size, devices.getUnchecked(i)->device->getDefaultBufferSize()); + + return size; + } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate, int bufferSize) override + { + close(); + active = true; + + if (bufferSize <= 0) + bufferSize = getDefaultBufferSize(); + + if (sampleRate <= 0) + { + Array rates (getAvailableSampleRates()); + + for (int i = 0; i < rates.size() && sampleRate < 44100.0; ++i) + sampleRate = rates.getUnchecked(i); + } + + currentSampleRate = sampleRate; + currentBufferSize = bufferSize; + + const int fifoSize = bufferSize * 3 + 1; + int totalInputChanIndex = 0, totalOutputChanIndex = 0; + int chanIndex = 0; + + for (int i = 0; i < devices.size(); ++i) + { + DeviceWrapper& d = *devices.getUnchecked(i); + + BigInteger ins (inputChannels >> totalInputChanIndex); + BigInteger outs (outputChannels >> totalOutputChanIndex); + + int numIns = d.getInputChannelNames().size(); + int numOuts = d.getOutputChannelNames().size(); + + totalInputChanIndex += numIns; + totalOutputChanIndex += numOuts; + + String err = d.open (ins, outs, sampleRate, bufferSize, + chanIndex, fifoSize); + + if (err.isNotEmpty()) + { + close(); + lastError = err; + return err; + } + + chanIndex += d.numInputChans + d.numOutputChans; + } + + fifos.setSize (chanIndex, fifoSize); + fifos.clear(); + startThread (9); + + return String(); + } + + void close() override + { + stop(); + stopThread (10000); + fifos.clear(); + active = false; + + for (int i = 0; i < devices.size(); ++i) + devices.getUnchecked(i)->close(); + } + + BigInteger getActiveOutputChannels() const override + { + BigInteger chans; + int start = 0; + + for (int i = 0; i < devices.size(); ++i) + { + const int numChans = devices.getUnchecked(i)->getOutputChannelNames().size(); + + if (numChans > 0) + { + chans |= (devices.getUnchecked(i)->device->getActiveOutputChannels() << start); + start += numChans; + } + } + + return chans; + } + + BigInteger getActiveInputChannels() const override + { + BigInteger chans; + int start = 0; + + for (int i = 0; i < devices.size(); ++i) + { + const int numChans = devices.getUnchecked(i)->getInputChannelNames().size(); + + if (numChans > 0) + { + chans |= (devices.getUnchecked(i)->device->getActiveInputChannels() << start); + start += numChans; + } + } + + return chans; + } + + int getOutputLatencyInSamples() override + { + int lat = 0; + + for (int i = 0; i < devices.size(); ++i) + lat = jmax (lat, devices.getUnchecked(i)->device->getOutputLatencyInSamples()); + + return lat + currentBufferSize * 2; + } + + int getInputLatencyInSamples() override + { + int lat = 0; + + for (int i = 0; i < devices.size(); ++i) + lat = jmax (lat, devices.getUnchecked(i)->device->getInputLatencyInSamples()); + + return lat + currentBufferSize * 2; + } + + void start (AudioIODeviceCallback* newCallback) override + { + if (callback != newCallback) + { + stop(); + fifos.clear(); + + for (int i = 0; i < devices.size(); ++i) + devices.getUnchecked(i)->start(); + + if (newCallback != nullptr) + newCallback->audioDeviceAboutToStart (this); + + const ScopedLock sl (callbackLock); + callback = newCallback; + } + } + + void stop() override + { + AudioIODeviceCallback* lastCallback = nullptr; + + { + const ScopedLock sl (callbackLock); + std::swap (callback, lastCallback); + } + + for (int i = 0; i < devices.size(); ++i) + devices.getUnchecked(i)->device->stop(); + + if (lastCallback != nullptr) + lastCallback->audioDeviceStopped(); + } + + String getLastError() override + { + return lastError; + } + +private: + CriticalSection callbackLock; + AudioIODeviceCallback* callback; + double currentSampleRate; + int currentBufferSize; + bool active; + String lastError; + + AudioSampleBuffer fifos; + + void run() override + { + const int numSamples = currentBufferSize; + + AudioSampleBuffer buffer (fifos.getNumChannels(), numSamples); + buffer.clear(); + + Array inputChans; + Array outputChans; + + for (int i = 0; i < devices.size(); ++i) + { + DeviceWrapper& d = *devices.getUnchecked(i); + + for (int j = 0; j < d.numInputChans; ++j) inputChans.add (buffer.getReadPointer (d.inputIndex + j)); + for (int j = 0; j < d.numOutputChans; ++j) outputChans.add (buffer.getWritePointer (d.outputIndex + j)); + } + + const int numInputChans = inputChans.size(); + const int numOutputChans = outputChans.size(); + + inputChans.add (nullptr); + outputChans.add (nullptr); + + const int blockSizeMs = jmax (1, (int) (1000 * numSamples / currentSampleRate)); + + jassert (numInputChans + numOutputChans == buffer.getNumChannels()); + + while (! threadShouldExit()) + { + readInput (buffer, numSamples, blockSizeMs); + + bool didCallback = true; + + { + const ScopedLock sl (callbackLock); + + if (callback != nullptr) + callback->audioDeviceIOCallback ((const float**) inputChans.getRawDataPointer(), numInputChans, + outputChans.getRawDataPointer(), numOutputChans, numSamples); + else + didCallback = false; + } + + if (didCallback) + { + pushOutputData (buffer, numSamples, blockSizeMs); + } + else + { + for (int i = 0; i < numOutputChans; ++i) + FloatVectorOperations::clear (outputChans[i], numSamples); + + reset(); + } + } + } + + void reset() + { + for (int i = 0; i < devices.size(); ++i) + devices.getUnchecked(i)->reset(); + } + + void underrun() + { + } + + void readInput (AudioSampleBuffer& buffer, const int numSamples, const int blockSizeMs) + { + for (int i = 0; i < devices.size(); ++i) + { + DeviceWrapper& d = *devices.getUnchecked(i); + d.done = (d.numInputChans == 0); + } + + for (int tries = 5;;) + { + bool anyRemaining = false; + + for (int i = 0; i < devices.size(); ++i) + { + DeviceWrapper& d = *devices.getUnchecked(i); + + if (! d.done) + { + if (d.isInputReady (numSamples)) + { + d.readInput (buffer, numSamples); + d.done = true; + } + else + anyRemaining = true; + } + } + + if (! anyRemaining) + return; + + if (--tries == 0) + break; + + wait (blockSizeMs); + } + + for (int j = 0; j < devices.size(); ++j) + { + DeviceWrapper& d = *devices.getUnchecked(j); + + if (! d.done) + for (int i = 0; i < d.numInputChans; ++i) + buffer.clear (d.inputIndex + i, 0, numSamples); + } + } + + void pushOutputData (AudioSampleBuffer& buffer, const int numSamples, const int blockSizeMs) + { + for (int i = 0; i < devices.size(); ++i) + { + DeviceWrapper& d = *devices.getUnchecked(i); + d.done = (d.numOutputChans == 0); + } + + for (int tries = 5;;) + { + bool anyRemaining = false; + + for (int i = 0; i < devices.size(); ++i) + { + DeviceWrapper& d = *devices.getUnchecked(i); + + if (! d.done) + { + if (d.isOutputReady (numSamples)) + { + d.pushOutputData (buffer, numSamples); + d.done = true; + } + else + anyRemaining = true; + } + } + + if ((! anyRemaining) || --tries == 0) + return; + + wait (blockSizeMs); + } + } + + //============================================================================== + struct DeviceWrapper : private AudioIODeviceCallback + { + DeviceWrapper (AudioIODeviceCombiner& cd, AudioIODevice* d, bool useIns, bool useOuts) + : owner (cd), device (d), inputIndex (0), outputIndex (0), + useInputs (useIns), useOutputs (useOuts), + inputFifo (32), outputFifo (32), done (false) + { + } + + ~DeviceWrapper() + { + close(); + } + + String open (const BigInteger& inputChannels, const BigInteger& outputChannels, + double sampleRate, int bufferSize, + int channelIndex, + int fifoSize) + { + inputFifo.setTotalSize (fifoSize); + outputFifo.setTotalSize (fifoSize); + inputFifo.reset(); + outputFifo.reset(); + + String err (device->open (useInputs ? inputChannels : BigInteger(), + useOutputs ? outputChannels : BigInteger(), + sampleRate, bufferSize)); + + numInputChans = useInputs ? device->getActiveInputChannels().countNumberOfSetBits() : 0; + numOutputChans = useOutputs ? device->getActiveOutputChannels().countNumberOfSetBits() : 0; + + inputIndex = channelIndex; + outputIndex = channelIndex + numInputChans; + + return err; + } + + void close() + { + device->close(); + } + + void start() + { + reset(); + device->start (this); + } + + void reset() + { + inputFifo.reset(); + outputFifo.reset(); + } + + StringArray getOutputChannelNames() const { return useOutputs ? device->getOutputChannelNames() : StringArray(); } + StringArray getInputChannelNames() const { return useInputs ? device->getInputChannelNames() : StringArray(); } + + bool isInputReady (int numSamples) const noexcept + { + return numInputChans == 0 || inputFifo.getNumReady() >= numSamples; + } + + void readInput (AudioSampleBuffer& destBuffer, int numSamples) + { + if (numInputChans == 0) + return; + + int start1, size1, start2, size2; + inputFifo.prepareToRead (numSamples, start1, size1, start2, size2); + + for (int i = 0; i < numInputChans; ++i) + { + const int index = inputIndex + i; + float* const dest = destBuffer.getWritePointer (index); + const float* const src = owner.fifos.getReadPointer (index); + + if (size1 > 0) FloatVectorOperations::copy (dest, src + start1, size1); + if (size2 > 0) FloatVectorOperations::copy (dest + size1, src + start2, size2); + } + + inputFifo.finishedRead (size1 + size2); + } + + bool isOutputReady (int numSamples) const noexcept + { + return numOutputChans == 0 || outputFifo.getFreeSpace() >= numSamples; + } + + void pushOutputData (AudioSampleBuffer& srcBuffer, int numSamples) + { + if (numOutputChans == 0) + return; + + int start1, size1, start2, size2; + outputFifo.prepareToWrite (numSamples, start1, size1, start2, size2); + + for (int i = 0; i < numOutputChans; ++i) + { + const int index = outputIndex + i; + float* const dest = owner.fifos.getWritePointer (index); + const float* const src = srcBuffer.getReadPointer (index); + + if (size1 > 0) FloatVectorOperations::copy (dest + start1, src, size1); + if (size2 > 0) FloatVectorOperations::copy (dest + start2, src + size1, size2); + } + + outputFifo.finishedWrite (size1 + size2); + } + + void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels, + float** outputChannelData, int numOutputChannels, + int numSamples) override + { + AudioSampleBuffer& buf = owner.fifos; + + if (numInputChannels > 0) + { + int start1, size1, start2, size2; + inputFifo.prepareToWrite (numSamples, start1, size1, start2, size2); + + if (size1 + size2 < numSamples) + { + inputFifo.reset(); + inputFifo.prepareToWrite (numSamples, start1, size1, start2, size2); + } + + for (int i = 0; i < numInputChannels; ++i) + { + float* const dest = buf.getWritePointer (inputIndex + i); + const float* const src = inputChannelData[i]; + + if (size1 > 0) FloatVectorOperations::copy (dest + start1, src, size1); + if (size2 > 0) FloatVectorOperations::copy (dest + start2, src + size1, size2); + } + + inputFifo.finishedWrite (size1 + size2); + + if (numSamples > size1 + size2) + { + for (int i = 0; i < numInputChans; ++i) + buf.clear (inputIndex + i, size1 + size2, numSamples - (size1 + size2)); + + owner.underrun(); + } + } + + if (numOutputChannels > 0) + { + int start1, size1, start2, size2; + outputFifo.prepareToRead (numSamples, start1, size1, start2, size2); + + if (size1 + size2 < numSamples) + { + Thread::sleep (1); + outputFifo.prepareToRead (numSamples, start1, size1, start2, size2); + } + + for (int i = 0; i < numOutputChannels; ++i) + { + float* const dest = outputChannelData[i]; + const float* const src = buf.getReadPointer (outputIndex + i); + + if (size1 > 0) FloatVectorOperations::copy (dest, src + start1, size1); + if (size2 > 0) FloatVectorOperations::copy (dest + size1, src + start2, size2); + } + + outputFifo.finishedRead (size1 + size2); + + if (numSamples > size1 + size2) + { + for (int i = 0; i < numOutputChannels; ++i) + FloatVectorOperations::clear (outputChannelData[i] + (size1 + size2), numSamples - (size1 + size2)); + + owner.underrun(); + } + } + + owner.notify(); + } + + void audioDeviceAboutToStart (AudioIODevice*) override {} + void audioDeviceStopped() override {} + + void audioDeviceError (const String& errorMessage) override + { + const ScopedLock sl (owner.callbackLock); + + if (owner.callback != nullptr) + owner.callback->audioDeviceError (errorMessage); + } + + AudioIODeviceCombiner& owner; + ScopedPointer device; + int inputIndex, numInputChans, outputIndex, numOutputChans; + bool useInputs, useOutputs; + AbstractFifo inputFifo, outputFifo; + bool done; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DeviceWrapper) + }; + + OwnedArray devices; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioIODeviceCombiner) +}; + + +//============================================================================== +class CoreAudioIODeviceType : public AudioIODeviceType +{ +public: + CoreAudioIODeviceType() + : AudioIODeviceType ("CoreAudio"), + hasScanned (false) + { + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioHardwarePropertyDevices; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementWildcard; + + AudioObjectAddPropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, this); + } + + ~CoreAudioIODeviceType() + { + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioHardwarePropertyDevices; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementWildcard; + + AudioObjectRemovePropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, this); + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + inputDeviceNames.clear(); + outputDeviceNames.clear(); + inputIds.clear(); + outputIds.clear(); + + UInt32 size; + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioHardwarePropertyDevices; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + + if (AudioObjectGetPropertyDataSize (kAudioObjectSystemObject, &pa, 0, nullptr, &size) == noErr) + { + HeapBlock devs; + devs.calloc (size, 1); + + if (AudioObjectGetPropertyData (kAudioObjectSystemObject, &pa, 0, nullptr, &size, devs) == noErr) + { + const int num = size / (int) sizeof (AudioDeviceID); + for (int i = 0; i < num; ++i) + { + char name [1024]; + size = sizeof (name); + pa.mSelector = kAudioDevicePropertyDeviceName; + + if (AudioObjectGetPropertyData (devs[i], &pa, 0, nullptr, &size, name) == noErr) + { + const String nameString (String::fromUTF8 (name, (int) strlen (name))); + const int numIns = getNumChannels (devs[i], true); + const int numOuts = getNumChannels (devs[i], false); + + if (numIns > 0) + { + inputDeviceNames.add (nameString); + inputIds.add (devs[i]); + } + + if (numOuts > 0) + { + outputDeviceNames.add (nameString); + outputIds.add (devs[i]); + } + } + } + } + } + + inputDeviceNames.appendNumbersToDuplicates (false, true); + outputDeviceNames.appendNumbersToDuplicates (false, true); + } + + StringArray getDeviceNames (bool wantInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return wantInputNames ? inputDeviceNames + : outputDeviceNames; + } + + int getDefaultDeviceIndex (bool forInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + AudioDeviceID deviceID; + UInt32 size = sizeof (deviceID); + + // if they're asking for any input channels at all, use the default input, so we + // get the built-in mic rather than the built-in output with no inputs.. + + AudioObjectPropertyAddress pa; + pa.mSelector = forInput ? kAudioHardwarePropertyDefaultInputDevice + : kAudioHardwarePropertyDefaultOutputDevice; + pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mElement = kAudioObjectPropertyElementMaster; + + if (AudioObjectGetPropertyData (kAudioObjectSystemObject, &pa, 0, nullptr, &size, &deviceID) == noErr) + { + if (forInput) + { + for (int i = inputIds.size(); --i >= 0;) + if (inputIds[i] == deviceID) + return i; + } + else + { + for (int i = outputIds.size(); --i >= 0;) + if (outputIds[i] == deviceID) + return i; + } + } + + return 0; + } + + int getIndexOfDevice (AudioIODevice* device, bool asInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + if (CoreAudioIODevice* const d = dynamic_cast (device)) + return asInput ? d->inputIndex + : d->outputIndex; + + if (AudioIODeviceCombiner* const d = dynamic_cast (device)) + { + const Array devs (d->getDevices()); + + for (int i = 0; i < devs.size(); ++i) + { + const int index = getIndexOfDevice (devs.getUnchecked(i), asInput); + + if (index >= 0) + return index; + } + } + + return -1; + } + + bool hasSeparateInputsAndOutputs() const { return true; } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int inputIndex = inputDeviceNames.indexOf (inputDeviceName); + const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); + + AudioDeviceID inputDeviceID = inputIds [inputIndex]; + AudioDeviceID outputDeviceID = outputIds [outputIndex]; + + if (inputDeviceID == 0 && outputDeviceID == 0) + return nullptr; + + String combinedName (outputDeviceName.isEmpty() ? inputDeviceName : outputDeviceName); + + if (inputDeviceID == outputDeviceID) + return new CoreAudioIODevice (combinedName, inputDeviceID, inputIndex, outputDeviceID, outputIndex); + + ScopedPointer in, out; + + if (inputDeviceID != 0) + in = new CoreAudioIODevice (inputDeviceName, inputDeviceID, inputIndex, 0, -1); + + if (outputDeviceID != 0) + out = new CoreAudioIODevice (outputDeviceName, 0, -1, outputDeviceID, outputIndex); + + if (in == nullptr) return out.release(); + if (out == nullptr) return in.release(); + + ScopedPointer combo (new AudioIODeviceCombiner (combinedName)); + combo->addDevice (in.release(), true, false); + combo->addDevice (out.release(), false, true); + return combo.release(); + } + + //============================================================================== +private: + StringArray inputDeviceNames, outputDeviceNames; + Array inputIds, outputIds; + + bool hasScanned; + + static int getNumChannels (AudioDeviceID deviceID, bool input) + { + int total = 0; + UInt32 size; + + AudioObjectPropertyAddress pa; + pa.mSelector = kAudioDevicePropertyStreamConfiguration; + pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + pa.mElement = kAudioObjectPropertyElementMaster; + + if (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size) == noErr) + { + HeapBlock bufList; + bufList.calloc (size, 1); + + if (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, bufList) == noErr) + { + const int numStreams = (int) bufList->mNumberBuffers; + + for (int i = 0; i < numStreams; ++i) + { + const AudioBuffer& b = bufList->mBuffers[i]; + total += b.mNumberChannels; + } + } + } + + return total; + } + + void audioDeviceListChanged() + { + scanForDevices(); + callDeviceChangeListeners(); + } + + static OSStatus hardwareListenerProc (AudioDeviceID, UInt32, const AudioObjectPropertyAddress*, void* clientData) + { + static_cast (clientData)->audioDeviceListChanged(); + return noErr; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioIODeviceType) +}; + +}; + +//============================================================================== +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio() +{ + return new CoreAudioClasses::CoreAudioIODeviceType(); +} + +#undef JUCE_COREAUDIOLOG diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp new file mode 100644 index 0000000000..5f8b3d5a67 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp @@ -0,0 +1,530 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_LOG_COREMIDI_ERRORS + #define JUCE_LOG_COREMIDI_ERRORS 1 +#endif + +namespace CoreMidiHelpers +{ + static bool checkError (const OSStatus err, const int lineNum) + { + if (err == noErr) + return true; + + #if JUCE_LOG_COREMIDI_ERRORS + Logger::writeToLog ("CoreMIDI error: " + String (lineNum) + " - " + String::toHexString ((int) err)); + #endif + + (void) lineNum; + return false; + } + + #undef CHECK_ERROR + #define CHECK_ERROR(a) CoreMidiHelpers::checkError (a, __LINE__) + + //============================================================================== + static String getMidiObjectName (MIDIObjectRef entity) + { + String result; + CFStringRef str = nullptr; + MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str); + + if (str != nullptr) + { + result = String::fromCFString (str); + CFRelease (str); + } + + return result; + } + + static String getEndpointName (MIDIEndpointRef endpoint, bool isExternal) + { + String result (getMidiObjectName (endpoint)); + + MIDIEntityRef entity = 0; // NB: don't attempt to use nullptr for refs - it fails in some types of build. + MIDIEndpointGetEntity (endpoint, &entity); + + if (entity == 0) + return result; // probably virtual + + if (result.isEmpty()) + result = getMidiObjectName (entity); // endpoint name is empty - try the entity + + // now consider the device's name + MIDIDeviceRef device = 0; + MIDIEntityGetDevice (entity, &device); + + if (device != 0) + { + const String deviceName (getMidiObjectName (device)); + + if (deviceName.isNotEmpty()) + { + // if an external device has only one entity, throw away + // the endpoint name and just use the device name + if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2) + { + result = deviceName; + } + else if (! result.startsWithIgnoreCase (deviceName)) + { + // prepend the device name to the entity name + result = (deviceName + " " + result).trimEnd(); + } + } + } + + return result; + } + + static String getConnectedEndpointName (MIDIEndpointRef endpoint) + { + String result; + + // Does the endpoint have connections? + CFDataRef connections = nullptr; + int numConnections = 0; + + MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections); + + if (connections != nullptr) + { + numConnections = ((int) CFDataGetLength (connections)) / (int) sizeof (MIDIUniqueID); + + if (numConnections > 0) + { + const SInt32* pid = reinterpret_cast (CFDataGetBytePtr (connections)); + + for (int i = 0; i < numConnections; ++i, ++pid) + { + MIDIUniqueID uid = (MIDIUniqueID) ByteOrder::swapIfLittleEndian ((uint32) *pid); + MIDIObjectRef connObject; + MIDIObjectType connObjectType; + OSStatus err = MIDIObjectFindByUniqueID (uid, &connObject, &connObjectType); + + if (err == noErr) + { + String s; + + if (connObjectType == kMIDIObjectType_ExternalSource + || connObjectType == kMIDIObjectType_ExternalDestination) + { + // Connected to an external device's endpoint (10.3 and later). + s = getEndpointName (static_cast (connObject), true); + } + else + { + // Connected to an external device (10.2) (or something else, catch-all) + s = getMidiObjectName (connObject); + } + + if (s.isNotEmpty()) + { + if (result.isNotEmpty()) + result += ", "; + + result += s; + } + } + } + } + + CFRelease (connections); + } + + if (result.isEmpty()) // Here, either the endpoint had no connections, or we failed to obtain names for them. + result = getEndpointName (endpoint, false); + + return result; + } + + static StringArray findDevices (const bool forInput) + { + const ItemCount num = forInput ? MIDIGetNumberOfSources() + : MIDIGetNumberOfDestinations(); + StringArray s; + + for (ItemCount i = 0; i < num; ++i) + { + MIDIEndpointRef dest = forInput ? MIDIGetSource (i) + : MIDIGetDestination (i); + String name; + + if (dest != 0) + name = getConnectedEndpointName (dest); + + if (name.isEmpty()) + name = ""; + + s.add (name); + } + + return s; + } + + static void globalSystemChangeCallback (const MIDINotification*, void*) + { + // TODO.. Should pass-on this notification.. + } + + static String getGlobalMidiClientName() + { + if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) + return app->getApplicationName(); + + return "JUCE"; + } + + static MIDIClientRef getGlobalMidiClient() + { + static MIDIClientRef globalMidiClient = 0; + + if (globalMidiClient == 0) + { + // Since OSX 10.6, the MIDIClientCreate function will only work + // correctly when called from the message thread! + jassert (MessageManager::getInstance()->isThisTheMessageThread()); + + CFStringRef name = getGlobalMidiClientName().toCFString(); + CHECK_ERROR (MIDIClientCreate (name, &globalSystemChangeCallback, nullptr, &globalMidiClient)); + CFRelease (name); + } + + return globalMidiClient; + } + + //============================================================================== + class MidiPortAndEndpoint + { + public: + MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) + : port (p), endPoint (ep) + { + } + + ~MidiPortAndEndpoint() + { + if (port != 0) + MIDIPortDispose (port); + + if (port == 0 && endPoint != 0) // if port == nullptr, it means we created the endpoint, so it's safe to delete it + MIDIEndpointDispose (endPoint); + } + + void send (const MIDIPacketList* const packets) + { + if (port != 0) + MIDISend (port, endPoint, packets); + else + MIDIReceived (endPoint, packets); + } + + MIDIPortRef port; + MIDIEndpointRef endPoint; + }; + + //============================================================================== + class MidiPortAndCallback; + CriticalSection callbackLock; + Array activeCallbacks; + + class MidiPortAndCallback + { + public: + MidiPortAndCallback (MidiInputCallback& cb) + : input (nullptr), active (false), callback (cb), concatenator (2048) + { + } + + ~MidiPortAndCallback() + { + active = false; + + { + const ScopedLock sl (callbackLock); + activeCallbacks.removeFirstMatchingValue (this); + } + + if (portAndEndpoint != 0 && portAndEndpoint->port != 0) + CHECK_ERROR (MIDIPortDisconnectSource (portAndEndpoint->port, portAndEndpoint->endPoint)); + } + + void handlePackets (const MIDIPacketList* const pktlist) + { + const double time = Time::getMillisecondCounterHiRes() * 0.001; + + const ScopedLock sl (callbackLock); + if (activeCallbacks.contains (this) && active) + { + const MIDIPacket* packet = &pktlist->packet[0]; + + for (unsigned int i = 0; i < pktlist->numPackets; ++i) + { + concatenator.pushMidiData (packet->data, (int) packet->length, time, + input, callback); + + packet = MIDIPacketNext (packet); + } + } + } + + MidiInput* input; + ScopedPointer portAndEndpoint; + volatile bool active; + + private: + MidiInputCallback& callback; + MidiDataConcatenator concatenator; + }; + + static void midiInputProc (const MIDIPacketList* pktlist, void* readProcRefCon, void* /*srcConnRefCon*/) + { + static_cast (readProcRefCon)->handlePackets (pktlist); + } +} + +//============================================================================== +StringArray MidiOutput::getDevices() { return CoreMidiHelpers::findDevices (false); } +int MidiOutput::getDefaultDeviceIndex() { return 0; } + +MidiOutput* MidiOutput::openDevice (int index) +{ + MidiOutput* mo = nullptr; + + if (isPositiveAndBelow (index, (int) MIDIGetNumberOfDestinations())) + { + MIDIEndpointRef endPoint = MIDIGetDestination ((ItemCount) index); + + CFStringRef pname; + if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname))) + { + MIDIClientRef client = CoreMidiHelpers::getGlobalMidiClient(); + MIDIPortRef port; + + if (client != 0 && CHECK_ERROR (MIDIOutputPortCreate (client, pname, &port))) + { + mo = new MidiOutput(); + mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (port, endPoint); + } + + CFRelease (pname); + } + } + + return mo; +} + +MidiOutput* MidiOutput::createNewDevice (const String& deviceName) +{ + MidiOutput* mo = nullptr; + MIDIClientRef client = CoreMidiHelpers::getGlobalMidiClient(); + + MIDIEndpointRef endPoint; + CFStringRef name = deviceName.toCFString(); + + if (client != 0 && CHECK_ERROR (MIDISourceCreate (client, name, &endPoint))) + { + mo = new MidiOutput(); + mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (0, endPoint); + } + + CFRelease (name); + return mo; +} + +MidiOutput::~MidiOutput() +{ + stopBackgroundThread(); + + delete static_cast (internal); +} + +void MidiOutput::sendMessageNow (const MidiMessage& message) +{ + #if JUCE_IOS + const MIDITimeStamp timeStamp = mach_absolute_time(); + #else + const MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); + #endif + + HeapBlock allocatedPackets; + MIDIPacketList stackPacket; + MIDIPacketList* packetToSend = &stackPacket; + const size_t dataSize = (size_t) message.getRawDataSize(); + + if (message.isSysEx()) + { + const int maxPacketSize = 256; + int pos = 0, bytesLeft = (int) dataSize; + const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize; + allocatedPackets.malloc ((size_t) (32 * (size_t) numPackets + dataSize), 1); + packetToSend = allocatedPackets; + packetToSend->numPackets = (UInt32) numPackets; + + MIDIPacket* p = packetToSend->packet; + + for (int i = 0; i < numPackets; ++i) + { + p->timeStamp = timeStamp; + p->length = (UInt16) jmin (maxPacketSize, bytesLeft); + memcpy (p->data, message.getRawData() + pos, p->length); + pos += p->length; + bytesLeft -= p->length; + p = MIDIPacketNext (p); + } + } + else if (dataSize < 65536) // max packet size + { + const size_t stackCapacity = sizeof (stackPacket.packet->data); + + if (dataSize > stackCapacity) + { + allocatedPackets.malloc ((sizeof (MIDIPacketList) - stackCapacity) + dataSize, 1); + packetToSend = allocatedPackets; + } + + packetToSend->numPackets = 1; + MIDIPacket& p = *(packetToSend->packet); + p.timeStamp = timeStamp; + p.length = (UInt16) dataSize; + memcpy (p.data, message.getRawData(), dataSize); + } + else + { + jassertfalse; // packet too large to send! + return; + } + + static_cast (internal)->send (packetToSend); +} + +//============================================================================== +StringArray MidiInput::getDevices() { return CoreMidiHelpers::findDevices (true); } +int MidiInput::getDefaultDeviceIndex() { return 0; } + +MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) +{ + jassert (callback != nullptr); + + using namespace CoreMidiHelpers; + MidiInput* newInput = nullptr; + + if (isPositiveAndBelow (index, (int) MIDIGetNumberOfSources())) + { + if (MIDIEndpointRef endPoint = MIDIGetSource ((ItemCount) index)) + { + CFStringRef name; + + if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &name))) + { + if (MIDIClientRef client = getGlobalMidiClient()) + { + MIDIPortRef port; + ScopedPointer mpc (new MidiPortAndCallback (*callback)); + + if (CHECK_ERROR (MIDIInputPortCreate (client, name, midiInputProc, mpc, &port))) + { + if (CHECK_ERROR (MIDIPortConnectSource (port, endPoint, nullptr))) + { + mpc->portAndEndpoint = new MidiPortAndEndpoint (port, endPoint); + + newInput = new MidiInput (getDevices() [index]); + mpc->input = newInput; + newInput->internal = mpc; + + const ScopedLock sl (callbackLock); + activeCallbacks.add (mpc.release()); + } + else + { + CHECK_ERROR (MIDIPortDispose (port)); + } + } + } + } + + CFRelease (name); + } + } + + return newInput; +} + +MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback) +{ + jassert (callback != nullptr); + + using namespace CoreMidiHelpers; + MidiInput* mi = nullptr; + + if (MIDIClientRef client = getGlobalMidiClient()) + { + ScopedPointer mpc (new MidiPortAndCallback (*callback)); + mpc->active = false; + + MIDIEndpointRef endPoint; + CFStringRef name = deviceName.toCFString(); + + if (CHECK_ERROR (MIDIDestinationCreate (client, name, midiInputProc, mpc, &endPoint))) + { + mpc->portAndEndpoint = new MidiPortAndEndpoint (0, endPoint); + + mi = new MidiInput (deviceName); + mpc->input = mi; + mi->internal = mpc; + + const ScopedLock sl (callbackLock); + activeCallbacks.add (mpc.release()); + } + + CFRelease (name); + } + + return mi; +} + +MidiInput::MidiInput (const String& nm) : name (nm) +{ +} + +MidiInput::~MidiInput() +{ + delete static_cast (internal); +} + +void MidiInput::start() +{ + const ScopedLock sl (CoreMidiHelpers::callbackLock); + static_cast (internal)->active = true; +} + +void MidiInput::stop() +{ + const ScopedLock sl (CoreMidiHelpers::callbackLock); + static_cast (internal)->active = false; +} + +#undef CHECK_ERROR diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp new file mode 100644 index 0000000000..b171bedd65 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp @@ -0,0 +1,1630 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#undef WINDOWS + +/* The ASIO SDK *should* declare its callback functions as being __cdecl, but different versions seem + to be pretty random about whether or not they do this. If you hit an error using these functions + it'll be because you're trying to build using __stdcall, in which case you'd need to either get hold of + an ASIO SDK which correctly specifies __cdecl, or add the __cdecl keyword to its functions yourself. +*/ +#define JUCE_ASIOCALLBACK __cdecl + +//============================================================================== +namespace ASIODebugging +{ + #if JUCE_ASIO_DEBUGGING + #define JUCE_ASIO_LOG(msg) ASIODebugging::logMessage (msg) + #define JUCE_ASIO_LOG_ERROR(msg, errNum) ASIODebugging::logError ((msg), (errNum)) + + static void logMessage (String message) + { + message = "ASIO: " + message; + DBG (message); + Logger::writeToLog (message); + } + + static void logError (const String& context, long error) + { + const char* err = "Unknown error"; + + switch (error) + { + case ASE_OK: return; + case ASE_NotPresent: err = "Not Present"; break; + case ASE_HWMalfunction: err = "Hardware Malfunction"; break; + case ASE_InvalidParameter: err = "Invalid Parameter"; break; + case ASE_InvalidMode: err = "Invalid Mode"; break; + case ASE_SPNotAdvancing: err = "Sample position not advancing"; break; + case ASE_NoClock: err = "No Clock"; break; + case ASE_NoMemory: err = "Out of memory"; break; + default: break; + } + + logMessage ("error: " + context + " - " + err); + } + #else + static void dummyLog() {} + #define JUCE_ASIO_LOG(msg) ASIODebugging::dummyLog() + #define JUCE_ASIO_LOG_ERROR(msg, errNum) (void) errNum; ASIODebugging::dummyLog() + #endif +} + +//============================================================================== +struct ASIOSampleFormat +{ + ASIOSampleFormat() noexcept {} + + ASIOSampleFormat (const long type) noexcept + : bitDepth (24), + littleEndian (true), + formatIsFloat (false), + byteStride (4) + { + switch (type) + { + case ASIOSTInt16MSB: byteStride = 2; littleEndian = false; bitDepth = 16; break; + case ASIOSTInt24MSB: byteStride = 3; littleEndian = false; break; + case ASIOSTInt32MSB: bitDepth = 32; littleEndian = false; break; + case ASIOSTFloat32MSB: bitDepth = 32; littleEndian = false; formatIsFloat = true; break; + case ASIOSTFloat64MSB: bitDepth = 64; byteStride = 8; littleEndian = false; break; + case ASIOSTInt32MSB16: bitDepth = 16; littleEndian = false; break; + case ASIOSTInt32MSB18: littleEndian = false; break; + case ASIOSTInt32MSB20: littleEndian = false; break; + case ASIOSTInt32MSB24: littleEndian = false; break; + case ASIOSTInt16LSB: byteStride = 2; bitDepth = 16; break; + case ASIOSTInt24LSB: byteStride = 3; break; + case ASIOSTInt32LSB: bitDepth = 32; break; + case ASIOSTFloat32LSB: bitDepth = 32; formatIsFloat = true; break; + case ASIOSTFloat64LSB: bitDepth = 64; byteStride = 8; break; + case ASIOSTInt32LSB16: bitDepth = 16; break; + case ASIOSTInt32LSB18: break; // (unhandled) + case ASIOSTInt32LSB20: break; // (unhandled) + case ASIOSTInt32LSB24: break; + + case ASIOSTDSDInt8LSB1: break; // (unhandled) + case ASIOSTDSDInt8MSB1: break; // (unhandled) + case ASIOSTDSDInt8NER8: break; // (unhandled) + + default: + jassertfalse; // (not a valid format code..) + break; + } + } + + void convertToFloat (const void* const src, float* const dst, const int samps) const noexcept + { + if (formatIsFloat) + { + memcpy (dst, src, samps * sizeof (float)); + } + else + { + switch (bitDepth) + { + case 16: convertInt16ToFloat (static_cast (src), dst, byteStride, samps, littleEndian); break; + case 24: convertInt24ToFloat (static_cast (src), dst, byteStride, samps, littleEndian); break; + case 32: convertInt32ToFloat (static_cast (src), dst, byteStride, samps, littleEndian); break; + default: jassertfalse; break; + } + } + } + + void convertFromFloat (const float* const src, void* const dst, const int samps) const noexcept + { + if (formatIsFloat) + { + memcpy (dst, src, samps * sizeof (float)); + } + else + { + switch (bitDepth) + { + case 16: convertFloatToInt16 (src, static_cast (dst), byteStride, samps, littleEndian); break; + case 24: convertFloatToInt24 (src, static_cast (dst), byteStride, samps, littleEndian); break; + case 32: convertFloatToInt32 (src, static_cast (dst), byteStride, samps, littleEndian); break; + default: jassertfalse; break; + } + } + } + + void clear (void* dst, const int numSamps) noexcept + { + if (dst != nullptr) + zeromem (dst, numSamps * byteStride); + } + + int bitDepth, byteStride; + bool formatIsFloat, littleEndian; + +private: + static void convertInt16ToFloat (const char* src, float* dest, const int srcStrideBytes, + int numSamples, const bool littleEndian) noexcept + { + const double g = 1.0 / 32768.0; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (short) ByteOrder::littleEndianShort (src)); + src += srcStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (short) ByteOrder::bigEndianShort (src)); + src += srcStrideBytes; + } + } + } + + static void convertFloatToInt16 (const float* src, char* dest, const int dstStrideBytes, + int numSamples, const bool littleEndian) noexcept + { + const double maxVal = (double) 0x7fff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *(uint16*) dest = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *(uint16*) dest = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + } + + static void convertInt24ToFloat (const char* src, float* dest, const int srcStrideBytes, + int numSamples, const bool littleEndian) noexcept + { + const double g = 1.0 / 0x7fffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * ByteOrder::littleEndian24Bit (src)); + src += srcStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * ByteOrder::bigEndian24Bit (src)); + src += srcStrideBytes; + } + } + } + + static void convertFloatToInt24 (const float* src, char* dest, const int dstStrideBytes, + int numSamples, const bool littleEndian) noexcept + { + const double maxVal = (double) 0x7fffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + ByteOrder::littleEndian24BitToChars ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); + dest += dstStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + ByteOrder::bigEndian24BitToChars ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); + dest += dstStrideBytes; + } + } + } + + static void convertInt32ToFloat (const char* src, float* dest, const int srcStrideBytes, + int numSamples, const bool littleEndian) noexcept + { + const double g = 1.0 / 0x7fffffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (int) ByteOrder::littleEndianInt (src)); + src += srcStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (int) ByteOrder::bigEndianInt (src)); + src += srcStrideBytes; + } + } + } + + static void convertFloatToInt32 (const float* src, char* dest, const int dstStrideBytes, + int numSamples, const bool littleEndian) noexcept + { + const double maxVal = (double) 0x7fffffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *(uint32*) dest = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *(uint32*) dest = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + } +}; + +//============================================================================== +class ASIOAudioIODevice; +static ASIOAudioIODevice* volatile currentASIODev[3] = { 0 }; + +extern HWND juce_messageWindowHandle; + +class ASIOAudioIODeviceType; +static void sendASIODeviceChangeToListeners (ASIOAudioIODeviceType*); + +//============================================================================== +class ASIOAudioIODevice : public AudioIODevice, + private Timer +{ +public: + ASIOAudioIODevice (ASIOAudioIODeviceType* ownerType, const String& devName, + const CLSID clsID, const int slotNumber) + : AudioIODevice (devName, "ASIO"), + owner (ownerType), + asioObject (nullptr), + classId (clsID), + inputLatency (0), + outputLatency (0), + minSize (0), maxSize (0), + preferredSize (0), + granularity (0), + numClockSources (0), + currentBlockSizeSamples (0), + currentBitDepth (16), + currentSampleRate (0), + currentCallback (nullptr), + bufferIndex (0), + numActiveInputChans (0), + numActiveOutputChans (0), + deviceIsOpen (false), + isStarted (false), + buffersCreated (false), + calledback (false), + littleEndian (false), + postOutput (true), + needToReset (false), + insideControlPanelModalLoop (false), + shouldUsePreferredSize (false) + { + name = devName; + inBuffers.calloc (4); + outBuffers.calloc (4); + + jassert (currentASIODev [slotNumber] == nullptr); + currentASIODev [slotNumber] = this; + + openDevice(); + } + + ~ASIOAudioIODevice() + { + for (int i = 0; i < numElementsInArray (currentASIODev); ++i) + if (currentASIODev[i] == this) + currentASIODev[i] = nullptr; + + close(); + JUCE_ASIO_LOG ("closed"); + removeCurrentDriver(); + } + + void updateSampleRates() + { + // find a list of sample rates.. + const int possibleSampleRates[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 }; + Array newRates; + + if (asioObject != nullptr) + { + for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index) + if (asioObject->canSampleRate ((double) possibleSampleRates[index]) == 0) + newRates.add ((double) possibleSampleRates[index]); + } + + if (newRates.size() == 0) + { + double cr = getSampleRate(); + JUCE_ASIO_LOG ("No sample rates supported - current rate: " + String ((int) cr)); + + if (cr > 0) + newRates.add ((int) cr); + } + + if (sampleRates != newRates) + { + sampleRates.swapWith (newRates); + + #if JUCE_ASIO_DEBUGGING + StringArray s; + for (int i = 0; i < sampleRates.size(); ++i) + s.add (String (sampleRates.getUnchecked(i))); + + JUCE_ASIO_LOG ("Rates: " + s.joinIntoString (" ")); + #endif + } + } + + StringArray getOutputChannelNames() override { return outputChannelNames; } + StringArray getInputChannelNames() override { return inputChannelNames; } + + Array getAvailableSampleRates() override { return sampleRates; } + Array getAvailableBufferSizes() override { return bufferSizes; } + int getDefaultBufferSize() override { return preferredSize; } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sr, int bufferSizeSamples) override + { + if (isOpen()) + close(); + + jassert (currentCallback == nullptr); + + if (bufferSizeSamples < 8 || bufferSizeSamples > 16384) + shouldUsePreferredSize = true; + + if (asioObject == nullptr) + { + const String openingError (openDevice()); + + if (asioObject == nullptr) + return openingError; + } + + isStarted = false; + bufferIndex = -1; + + long err = asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans); + jassert (err == ASE_OK); + + bufferSizeSamples = readBufferSizes (bufferSizeSamples); + + double sampleRate = sr; + currentSampleRate = sampleRate; + currentBlockSizeSamples = bufferSizeSamples; + currentChansOut.clear(); + currentChansIn.clear(); + inBuffers.clear (totalNumInputChans + 1); + outBuffers.clear (totalNumOutputChans + 1); + + updateSampleRates(); + + if (sampleRate == 0 || (sampleRates.size() > 0 && ! sampleRates.contains (sampleRate))) + sampleRate = sampleRates[0]; + + jassert (sampleRate != 0); + if (sampleRate == 0) + sampleRate = 44100.0; + + updateClockSources(); + currentSampleRate = getSampleRate(); + + error.clear(); + buffersCreated = false; + + setSampleRate (sampleRate); + + if (needToReset) + { + JUCE_ASIO_LOG (" Resetting"); + removeCurrentDriver(); + + loadDriver(); + const String error (initDriver()); + + if (error.isNotEmpty()) + JUCE_ASIO_LOG ("ASIOInit: " + error); + + needToReset = false; + } + + const int totalBuffers = resetBuffers (inputChannels, outputChannels); + + setCallbackFunctions(); + + JUCE_ASIO_LOG ("disposing buffers"); + err = asioObject->disposeBuffers(); + + JUCE_ASIO_LOG ("creating buffers: " + String (totalBuffers) + ", " + String (currentBlockSizeSamples)); + err = asioObject->createBuffers (bufferInfos, totalBuffers, currentBlockSizeSamples, &callbacks); + + if (err != ASE_OK) + { + currentBlockSizeSamples = preferredSize; + JUCE_ASIO_LOG_ERROR ("create buffers 2", err); + + asioObject->disposeBuffers(); + err = asioObject->createBuffers (bufferInfos, totalBuffers, currentBlockSizeSamples, &callbacks); + } + + if (err == ASE_OK) + { + buffersCreated = true; + + tempBuffer.calloc (totalBuffers * currentBlockSizeSamples + 32); + + int n = 0; + Array types; + currentBitDepth = 16; + + for (int i = 0; i < (int) totalNumInputChans; ++i) + { + if (inputChannels[i]) + { + inBuffers[n] = tempBuffer + (currentBlockSizeSamples * n); + + ASIOChannelInfo channelInfo = { 0 }; + channelInfo.channel = i; + channelInfo.isInput = 1; + asioObject->getChannelInfo (&channelInfo); + + types.addIfNotAlreadyThere (channelInfo.type); + inputFormat[n] = ASIOSampleFormat (channelInfo.type); + + currentBitDepth = jmax (currentBitDepth, inputFormat[n].bitDepth); + ++n; + } + } + + jassert (numActiveInputChans == n); + n = 0; + + for (int i = 0; i < (int) totalNumOutputChans; ++i) + { + if (outputChannels[i]) + { + outBuffers[n] = tempBuffer + (currentBlockSizeSamples * (numActiveInputChans + n)); + + ASIOChannelInfo channelInfo = { 0 }; + channelInfo.channel = i; + channelInfo.isInput = 0; + asioObject->getChannelInfo (&channelInfo); + + types.addIfNotAlreadyThere (channelInfo.type); + outputFormat[n] = ASIOSampleFormat (channelInfo.type); + + currentBitDepth = jmax (currentBitDepth, outputFormat[n].bitDepth); + ++n; + } + } + + jassert (numActiveOutputChans == n); + + for (int i = types.size(); --i >= 0;) + JUCE_ASIO_LOG ("channel format: " + String (types[i])); + + jassert (n <= totalBuffers); + + for (int i = 0; i < numActiveOutputChans; ++i) + { + outputFormat[i].clear (bufferInfos [numActiveInputChans + i].buffers[0], currentBlockSizeSamples); + outputFormat[i].clear (bufferInfos [numActiveInputChans + i].buffers[1], currentBlockSizeSamples); + } + + readLatencies(); + + asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity); + deviceIsOpen = true; + + JUCE_ASIO_LOG ("starting"); + calledback = false; + err = asioObject->start(); + + if (err != 0) + { + deviceIsOpen = false; + JUCE_ASIO_LOG ("stop on failure"); + Thread::sleep (10); + asioObject->stop(); + error = "Can't start device"; + Thread::sleep (10); + } + else + { + int count = 300; + while (--count > 0 && ! calledback) + Thread::sleep (10); + + isStarted = true; + + if (! calledback) + { + error = "Device didn't start correctly"; + JUCE_ASIO_LOG ("no callbacks - stopping.."); + asioObject->stop(); + } + } + } + else + { + error = "Can't create i/o buffers"; + } + + if (error.isNotEmpty()) + { + JUCE_ASIO_LOG_ERROR (error, err); + disposeBuffers(); + + Thread::sleep (20); + isStarted = false; + deviceIsOpen = false; + + const String errorCopy (error); + close(); // (this resets the error string) + error = errorCopy; + } + + needToReset = false; + return error; + } + + void close() override + { + error.clear(); + stopTimer(); + stop(); + + if (asioObject != nullptr && deviceIsOpen) + { + const ScopedLock sl (callbackLock); + + deviceIsOpen = false; + isStarted = false; + needToReset = false; + + JUCE_ASIO_LOG ("stopping"); + + if (asioObject != nullptr) + { + Thread::sleep (20); + asioObject->stop(); + Thread::sleep (10); + disposeBuffers(); + } + + Thread::sleep (10); + } + } + + bool isOpen() override { return deviceIsOpen || insideControlPanelModalLoop; } + bool isPlaying() override { return asioObject != nullptr && currentCallback != nullptr; } + + int getCurrentBufferSizeSamples() override { return currentBlockSizeSamples; } + double getCurrentSampleRate() override { return currentSampleRate; } + int getCurrentBitDepth() override { return currentBitDepth; } + + BigInteger getActiveOutputChannels() const override { return currentChansOut; } + BigInteger getActiveInputChannels() const override { return currentChansIn; } + + int getOutputLatencyInSamples() override { return outputLatency + currentBlockSizeSamples / 4; } + int getInputLatencyInSamples() override { return inputLatency + currentBlockSizeSamples / 4; } + + void start (AudioIODeviceCallback* callback) override + { + if (callback != nullptr) + { + callback->audioDeviceAboutToStart (this); + + const ScopedLock sl (callbackLock); + currentCallback = callback; + } + } + + void stop() override + { + AudioIODeviceCallback* const lastCallback = currentCallback; + + { + const ScopedLock sl (callbackLock); + currentCallback = nullptr; + } + + if (lastCallback != nullptr) + lastCallback->audioDeviceStopped(); + } + + String getLastError() { return error; } + bool hasControlPanel() const { return true; } + + bool showControlPanel() + { + JUCE_ASIO_LOG ("showing control panel"); + + bool done = false; + + JUCE_TRY + { + // are there are devices that need to be closed before showing their control panel? + // close(); + insideControlPanelModalLoop = true; + + const uint32 started = Time::getMillisecondCounter(); + + if (asioObject != nullptr) + { + asioObject->controlPanel(); + + const int spent = (int) Time::getMillisecondCounter() - (int) started; + + JUCE_ASIO_LOG ("spent: " + String (spent)); + + if (spent > 300) + { + shouldUsePreferredSize = true; + done = true; + } + } + } + JUCE_CATCH_ALL + + insideControlPanelModalLoop = false; + return done; + } + + void resetRequest() noexcept + { + startTimer (500); + } + + void timerCallback() override + { + if (! insideControlPanelModalLoop) + { + stopTimer(); + + JUCE_ASIO_LOG ("restart request!"); + + AudioIODeviceCallback* const oldCallback = currentCallback; + + close(); + + needToReset = true; + open (BigInteger (currentChansIn), BigInteger (currentChansOut), + currentSampleRate, currentBlockSizeSamples); + + reloadChannelNames(); + + if (oldCallback != nullptr) + start (oldCallback); + + sendASIODeviceChangeToListeners (owner); + } + else + { + startTimer (100); + } + } + +private: + //============================================================================== + WeakReference owner; + IASIO* volatile asioObject; + ASIOCallbacks callbacks; + + CLSID classId; + String error; + + long totalNumInputChans, totalNumOutputChans; + StringArray inputChannelNames, outputChannelNames; + + Array sampleRates; + Array bufferSizes; + long inputLatency, outputLatency; + long minSize, maxSize, preferredSize, granularity; + ASIOClockSource clocks[32]; + int numClockSources; + + int volatile currentBlockSizeSamples; + int volatile currentBitDepth; + double volatile currentSampleRate; + BigInteger currentChansOut, currentChansIn; + AudioIODeviceCallback* volatile currentCallback; + CriticalSection callbackLock; + + HeapBlock bufferInfos; + HeapBlock inBuffers, outBuffers; + HeapBlock inputFormat, outputFormat; + + WaitableEvent event1; + HeapBlock tempBuffer; + int volatile bufferIndex, numActiveInputChans, numActiveOutputChans; + + bool deviceIsOpen, isStarted, buffersCreated; + bool volatile calledback; + bool volatile littleEndian, postOutput, needToReset; + bool volatile insideControlPanelModalLoop; + bool volatile shouldUsePreferredSize; + + //============================================================================== + static String convertASIOString (char* const text, int length) + { + if (CharPointer_UTF8::isValidString (text, length)) + return String::fromUTF8 (text, length); + + WCHAR wideVersion [64] = { 0 }; + MultiByteToWideChar (CP_ACP, 0, text, length, wideVersion, numElementsInArray (wideVersion)); + return wideVersion; + } + + String getChannelName (int index, bool isInput) const + { + ASIOChannelInfo channelInfo = { 0 }; + channelInfo.channel = index; + channelInfo.isInput = isInput ? 1 : 0; + asioObject->getChannelInfo (&channelInfo); + + return convertASIOString (channelInfo.name, sizeof (channelInfo.name)); + } + + void reloadChannelNames() + { + if (asioObject != nullptr + && asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans) == ASE_OK) + { + inputChannelNames.clear(); + outputChannelNames.clear(); + + for (int i = 0; i < totalNumInputChans; ++i) + inputChannelNames.add (getChannelName (i, true)); + + for (int i = 0; i < totalNumOutputChans; ++i) + outputChannelNames.add (getChannelName (i, false)); + + outputChannelNames.trim(); + inputChannelNames.trim(); + outputChannelNames.appendNumbersToDuplicates (false, true); + inputChannelNames.appendNumbersToDuplicates (false, true); + } + } + + int readBufferSizes (int bufferSizeSamples) + { + minSize = 0; + maxSize = 0; + granularity = 0; + + long newPreferredSize = 0; + + if (asioObject->getBufferSize (&minSize, &maxSize, &newPreferredSize, &granularity) == ASE_OK) + { + if (preferredSize != 0 && newPreferredSize != 0 && newPreferredSize != preferredSize) + shouldUsePreferredSize = true; + + if (bufferSizeSamples < minSize || bufferSizeSamples > maxSize) + shouldUsePreferredSize = true; + + preferredSize = newPreferredSize; + } + + // unfortunate workaround for certain drivers which crash if you make + // dynamic changes to the buffer size... + shouldUsePreferredSize = shouldUsePreferredSize || getName().containsIgnoreCase ("Digidesign"); + + if (shouldUsePreferredSize) + { + JUCE_ASIO_LOG ("Using preferred size for buffer.."); + long err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity); + + if (err == ASE_OK) + { + bufferSizeSamples = (int) preferredSize; + } + else + { + bufferSizeSamples = 1024; + JUCE_ASIO_LOG_ERROR ("getBufferSize1", err); + } + + shouldUsePreferredSize = false; + } + + return bufferSizeSamples; + } + + int resetBuffers (const BigInteger& inputChannels, + const BigInteger& outputChannels) + { + numActiveInputChans = 0; + numActiveOutputChans = 0; + + ASIOBufferInfo* info = bufferInfos; + for (int i = 0; i < totalNumInputChans; ++i) + { + if (inputChannels[i]) + { + currentChansIn.setBit (i); + info->isInput = 1; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = nullptr; + ++info; + ++numActiveInputChans; + } + } + + for (int i = 0; i < totalNumOutputChans; ++i) + { + if (outputChannels[i]) + { + currentChansOut.setBit (i); + info->isInput = 0; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = nullptr; + ++info; + ++numActiveOutputChans; + } + } + + return numActiveInputChans + numActiveOutputChans; + } + + void addBufferSizes (long minSize, long maxSize, long preferredSize, long granularity) + { + // find a list of buffer sizes.. + JUCE_ASIO_LOG (String ((int) minSize) + "->" + String ((int) maxSize) + ", " + + String ((int) preferredSize) + ", " + String ((int) granularity)); + + if (granularity >= 0) + { + granularity = jmax (16, (int) granularity); + + for (int i = jmax ((int) (minSize + 15) & ~15, (int) granularity); i < jmin (6400, (int) maxSize); i += granularity) + bufferSizes.addIfNotAlreadyThere (granularity * (i / granularity)); + } + else if (granularity < 0) + { + for (int i = 0; i < 18; ++i) + { + const int s = (1 << i); + + if (s >= minSize && s <= maxSize) + bufferSizes.add (s); + } + } + + bufferSizes.addIfNotAlreadyThere (preferredSize); + + DefaultElementComparator comparator; + bufferSizes.sort (comparator); + } + + double getSampleRate() const + { + double cr = 0; + long err = asioObject->getSampleRate (&cr); + JUCE_ASIO_LOG_ERROR ("getSampleRate", err); + return cr; + } + + void setSampleRate (double newRate) + { + if (currentSampleRate != newRate) + { + JUCE_ASIO_LOG ("rate change: " + String (currentSampleRate) + " to " + String (newRate)); + long err = asioObject->setSampleRate (newRate); + + if (err == ASE_NoClock && numClockSources > 0) + { + JUCE_ASIO_LOG ("trying to set a clock source.."); + Thread::sleep (10); + err = asioObject->setClockSource (clocks[0].index); + JUCE_ASIO_LOG_ERROR ("setClockSource2", err); + + Thread::sleep (10); + err = asioObject->setSampleRate (newRate); + } + + if (err == 0) + currentSampleRate = newRate; + + // on fail, ignore the attempt to change rate, and run with the current one.. + } + } + + void updateClockSources() + { + zeromem (clocks, sizeof (clocks)); + long numSources = numElementsInArray (clocks); + asioObject->getClockSources (clocks, &numSources); + numClockSources = (int) numSources; + + bool isSourceSet = false; + + // careful not to remove this loop because it does more than just logging! + for (int i = 0; i < numClockSources; ++i) + { + String s ("clock: "); + s += clocks[i].name; + + if (clocks[i].isCurrentSource) + { + isSourceSet = true; + s << " (cur)"; + } + + JUCE_ASIO_LOG (s); + } + + if (numClockSources > 1 && ! isSourceSet) + { + JUCE_ASIO_LOG ("setting clock source"); + long err = asioObject->setClockSource (clocks[0].index); + JUCE_ASIO_LOG_ERROR ("setClockSource1", err); + Thread::sleep (20); + } + else + { + if (numClockSources == 0) + JUCE_ASIO_LOG ("no clock sources!"); + } + } + + void readLatencies() + { + inputLatency = outputLatency = 0; + + if (asioObject->getLatencies (&inputLatency, &outputLatency) != 0) + JUCE_ASIO_LOG ("getLatencies() failed"); + else + JUCE_ASIO_LOG ("Latencies: in = " + String ((int) inputLatency) + ", out = " + String ((int) outputLatency)); + } + + void createDummyBuffers (long preferredSize) + { + numActiveInputChans = 0; + numActiveOutputChans = 0; + + ASIOBufferInfo* info = bufferInfos; + int numChans = 0; + + for (int i = 0; i < jmin (2, (int) totalNumInputChans); ++i) + { + info->isInput = 1; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = nullptr; + ++info; + ++numChans; + } + + const int outputBufferIndex = numChans; + + for (int i = 0; i < jmin (2, (int) totalNumOutputChans); ++i) + { + info->isInput = 0; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = nullptr; + ++info; + ++numChans; + } + + setCallbackFunctions(); + + JUCE_ASIO_LOG ("creating buffers (dummy): " + String (numChans) + ", " + String ((int) preferredSize)); + + if (preferredSize > 0) + { + long err = asioObject->createBuffers (bufferInfos, numChans, preferredSize, &callbacks); + JUCE_ASIO_LOG_ERROR ("dummy buffers", err); + } + + long newInps = 0, newOuts = 0; + asioObject->getChannels (&newInps, &newOuts); + + if (totalNumInputChans != newInps || totalNumOutputChans != newOuts) + { + totalNumInputChans = newInps; + totalNumOutputChans = newOuts; + + JUCE_ASIO_LOG (String ((int) totalNumInputChans) + " in; " + String ((int) totalNumOutputChans) + " out"); + } + + updateSampleRates(); + reloadChannelNames(); + + for (int i = 0; i < totalNumOutputChans; ++i) + { + ASIOChannelInfo channelInfo = { 0 }; + channelInfo.channel = i; + channelInfo.isInput = 0; + asioObject->getChannelInfo (&channelInfo); + + outputFormat[i] = ASIOSampleFormat (channelInfo.type); + + if (i < 2) + { + // clear the channels that are used with the dummy stuff + outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[0], preferredSize); + outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[1], preferredSize); + } + } + } + + void removeCurrentDriver() + { + if (asioObject != nullptr) + { + asioObject->Release(); + asioObject = nullptr; + } + } + + bool loadDriver() + { + removeCurrentDriver(); + + bool crashed = false; + bool ok = tryCreatingDriver (crashed); + + if (crashed) + JUCE_ASIO_LOG ("** Driver crashed while being opened"); + + return ok; + } + + bool tryCreatingDriver (bool& crashed) + { + #if ! JUCE_MINGW + __try + #endif + { + return CoCreateInstance (classId, 0, CLSCTX_INPROC_SERVER, + classId, (void**) &asioObject) == S_OK; + } + #if ! JUCE_MINGW + __except (EXCEPTION_EXECUTE_HANDLER) { crashed = true; } + return false; + #endif + } + + String getLastDriverError() const + { + jassert (asioObject != nullptr); + char buffer [512] = { 0 }; + asioObject->getErrorMessage (buffer); + return String (buffer, sizeof (buffer) - 1); + } + + String initDriver() + { + if (asioObject == nullptr) + return "No Driver"; + + const bool initOk = !! asioObject->init (juce_messageWindowHandle); + String driverError; + + // Get error message if init() failed, or if it's a buggy Denon driver, + // which returns true from init() even when it fails. + if ((! initOk) || getName().containsIgnoreCase ("denon dj")) + driverError = getLastDriverError(); + + if ((! initOk) && driverError.isEmpty()) + driverError = "Driver failed to initialise"; + + if (driverError.isEmpty()) + { + char buffer [512]; + asioObject->getDriverName (buffer); // just in case any flimsy drivers expect this to be called.. + } + + return driverError; + } + + String openDevice() + { + // open the device and get its info.. + JUCE_ASIO_LOG ("opening device: " + getName()); + + needToReset = false; + outputChannelNames.clear(); + inputChannelNames.clear(); + bufferSizes.clear(); + sampleRates.clear(); + deviceIsOpen = false; + totalNumInputChans = 0; + totalNumOutputChans = 0; + numActiveInputChans = 0; + numActiveOutputChans = 0; + currentCallback = nullptr; + + error.clear(); + + if (getName().isEmpty()) + return error; + + long err = 0; + + if (loadDriver()) + { + if ((error = initDriver()).isEmpty()) + { + numActiveInputChans = 0; + numActiveOutputChans = 0; + totalNumInputChans = 0; + totalNumOutputChans = 0; + + if (asioObject != nullptr + && (err = asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans)) == 0) + { + JUCE_ASIO_LOG (String ((int) totalNumInputChans) + " in, " + String ((int) totalNumOutputChans) + " out"); + + const int chansToAllocate = totalNumInputChans + totalNumOutputChans + 4; + bufferInfos.calloc (chansToAllocate); + inBuffers.calloc (chansToAllocate); + outBuffers.calloc (chansToAllocate); + inputFormat.calloc (chansToAllocate); + outputFormat.calloc (chansToAllocate); + + if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0) + { + addBufferSizes (minSize, maxSize, preferredSize, granularity); + + double currentRate = getSampleRate(); + + if (currentRate < 1.0 || currentRate > 192001.0) + { + JUCE_ASIO_LOG ("setting default sample rate"); + err = asioObject->setSampleRate (44100.0); + JUCE_ASIO_LOG_ERROR ("setting sample rate", err); + + currentRate = getSampleRate(); + } + + currentSampleRate = currentRate; + + postOutput = (asioObject->outputReady() == 0); + if (postOutput) + JUCE_ASIO_LOG ("outputReady true"); + + updateSampleRates(); + + readLatencies(); // ..doing these steps because cubase does so at this stage + createDummyBuffers (preferredSize); // in initialisation, and some devices fail if we don't. + readLatencies(); + + // start and stop because cubase does it.. + err = asioObject->start(); + // ignore an error here, as it might start later after setting other stuff up + JUCE_ASIO_LOG_ERROR ("start", err); + + Thread::sleep (80); + asioObject->stop(); + } + else + { + error = "Can't detect buffer sizes"; + } + } + else + { + error = "Can't detect asio channels"; + } + } + } + else + { + error = "No such device"; + } + + if (error.isNotEmpty()) + { + JUCE_ASIO_LOG_ERROR (error, err); + disposeBuffers(); + removeCurrentDriver(); + } + else + { + JUCE_ASIO_LOG ("device open"); + } + + deviceIsOpen = false; + needToReset = false; + stopTimer(); + return error; + } + + void disposeBuffers() + { + if (asioObject != nullptr && buffersCreated) + { + buffersCreated = false; + asioObject->disposeBuffers(); + } + } + + //============================================================================== + void JUCE_ASIOCALLBACK callback (const long index) + { + if (isStarted) + { + bufferIndex = index; + processBuffer(); + } + else + { + if (postOutput && (asioObject != nullptr)) + asioObject->outputReady(); + } + + calledback = true; + } + + void processBuffer() + { + const ASIOBufferInfo* const infos = bufferInfos; + const int bi = bufferIndex; + + const ScopedLock sl (callbackLock); + + if (bi >= 0) + { + const int samps = currentBlockSizeSamples; + + if (currentCallback != nullptr) + { + for (int i = 0; i < numActiveInputChans; ++i) + { + jassert (inBuffers[i] != nullptr); + inputFormat[i].convertToFloat (infos[i].buffers[bi], inBuffers[i], samps); + } + + currentCallback->audioDeviceIOCallback (const_cast (inBuffers.getData()), numActiveInputChans, + outBuffers, numActiveOutputChans, samps); + + for (int i = 0; i < numActiveOutputChans; ++i) + { + jassert (outBuffers[i] != nullptr); + outputFormat[i].convertFromFloat (outBuffers[i], infos [numActiveInputChans + i].buffers[bi], samps); + } + } + else + { + for (int i = 0; i < numActiveOutputChans; ++i) + outputFormat[i].clear (infos[numActiveInputChans + i].buffers[bi], samps); + } + } + + if (postOutput) + asioObject->outputReady(); + } + + //============================================================================== + template + struct ASIOCallbackFunctions + { + static ASIOTime* JUCE_ASIOCALLBACK bufferSwitchTimeInfoCallback (ASIOTime*, long index, long) + { + if (currentASIODev[deviceIndex] != nullptr) + currentASIODev[deviceIndex]->callback (index); + + return nullptr; + } + + static void JUCE_ASIOCALLBACK bufferSwitchCallback (long index, long) + { + if (currentASIODev[deviceIndex] != nullptr) + currentASIODev[deviceIndex]->callback (index); + } + + static long JUCE_ASIOCALLBACK asioMessagesCallback (long selector, long value, void*, double*) + { + switch (selector) + { + case kAsioSelectorSupported: + if (value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest + || value == kAsioLatenciesChanged || value == kAsioSupportsInputMonitor) + return 1; + break; + + case kAsioBufferSizeChange: JUCE_ASIO_LOG ("kAsioBufferSizeChange"); return sendResetRequest (deviceIndex); + case kAsioResetRequest: JUCE_ASIO_LOG ("kAsioResetRequest"); return sendResetRequest (deviceIndex); + case kAsioResyncRequest: JUCE_ASIO_LOG ("kAsioResyncRequest"); return sendResetRequest (deviceIndex); + case kAsioLatenciesChanged: JUCE_ASIO_LOG ("kAsioLatenciesChanged"); return 1; + case kAsioEngineVersion: return 2; + + case kAsioSupportsTimeInfo: + case kAsioSupportsTimeCode: + return 0; + } + + return 0; + } + + static void JUCE_ASIOCALLBACK sampleRateChangedCallback (ASIOSampleRate) + { + sendResetRequest (deviceIndex); + } + + static long sendResetRequest (int index) + { + if (currentASIODev[index] != nullptr) + currentASIODev[index]->resetRequest(); + + return 1; + } + + static void setCallbacks (ASIOCallbacks& callbacks) + { + callbacks.bufferSwitch = &bufferSwitchCallback; + callbacks.asioMessage = &asioMessagesCallback; + callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; + callbacks.sampleRateDidChange = &sampleRateChangedCallback; + } + }; + + void setCallbackFunctions() + { + if (currentASIODev[0] == this) ASIOCallbackFunctions<0>::setCallbacks (callbacks); + else if (currentASIODev[1] == this) ASIOCallbackFunctions<1>::setCallbacks (callbacks); + else if (currentASIODev[2] == this) ASIOCallbackFunctions<2>::setCallbacks (callbacks); + else jassertfalse; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODevice) +}; + +//============================================================================== +class ASIOAudioIODeviceType : public AudioIODeviceType +{ +public: + ASIOAudioIODeviceType() + : AudioIODeviceType ("ASIO"), + hasScanned (false) + { + } + + ~ASIOAudioIODeviceType() + { + masterReference.clear(); + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + deviceNames.clear(); + classIds.clear(); + + HKEY hk = 0; + int index = 0; + + if (RegOpenKey (HKEY_LOCAL_MACHINE, _T("software\\asio"), &hk) == ERROR_SUCCESS) + { + TCHAR name [256]; + + while (RegEnumKey (hk, index++, name, numElementsInArray (name)) == ERROR_SUCCESS) + addDriverInfo (name, hk); + + RegCloseKey (hk); + } + } + + StringArray getDeviceNames (bool /*wantInputNames*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return deviceNames; + } + + int getDefaultDeviceIndex (bool) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + for (int i = deviceNames.size(); --i >= 0;) + if (deviceNames[i].containsIgnoreCase ("asio4all")) + return i; // asio4all is a safe choice for a default.. + + #if JUCE_DEBUG + if (deviceNames.size() > 1 && deviceNames[0].containsIgnoreCase ("digidesign")) + return 1; // (the digi m-box driver crashes the app when you run + // it in the debugger, which can be a bit annoying) + #endif + + return 0; + } + + static int findFreeSlot() + { + for (int i = 0; i < numElementsInArray (currentASIODev); ++i) + if (currentASIODev[i] == 0) + return i; + + jassertfalse; // unfortunately you can only have a finite number + // of ASIO devices open at the same time.. + return -1; + } + + int getIndexOfDevice (AudioIODevice* d, bool /*asInput*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return d == nullptr ? -1 : deviceNames.indexOf (d->getName()); + } + + bool hasSeparateInputsAndOutputs() const { return false; } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + // ASIO can't open two different devices for input and output - they must be the same one. + jassert (inputDeviceName == outputDeviceName || outputDeviceName.isEmpty() || inputDeviceName.isEmpty()); + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int index = deviceNames.indexOf (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName); + + if (index >= 0) + { + const int freeSlot = findFreeSlot(); + + if (freeSlot >= 0) + return new ASIOAudioIODevice (this, outputDeviceName, + classIds.getReference (index), freeSlot); + } + + return nullptr; + } + + void sendDeviceChangeToListeners() + { + callDeviceChangeListeners(); + } + + WeakReference::Master masterReference; + +private: + StringArray deviceNames; + Array classIds; + + bool hasScanned; + + //============================================================================== + static bool checkClassIsOk (const String& classId) + { + HKEY hk = 0; + bool ok = false; + + if (RegOpenKey (HKEY_CLASSES_ROOT, _T("clsid"), &hk) == ERROR_SUCCESS) + { + int index = 0; + TCHAR name [512]; + + while (RegEnumKey (hk, index++, name, numElementsInArray (name)) == ERROR_SUCCESS) + { + if (classId.equalsIgnoreCase (name)) + { + HKEY subKey, pathKey; + + if (RegOpenKeyEx (hk, name, 0, KEY_READ, &subKey) == ERROR_SUCCESS) + { + if (RegOpenKeyEx (subKey, _T("InprocServer32"), 0, KEY_READ, &pathKey) == ERROR_SUCCESS) + { + TCHAR pathName [1024] = { 0 }; + DWORD dtype = REG_SZ; + DWORD dsize = sizeof (pathName); + + if (RegQueryValueEx (pathKey, 0, 0, &dtype, (LPBYTE) pathName, &dsize) == ERROR_SUCCESS) + // In older code, this used to check for the existance of the file, but there are situations + // where our process doesn't have access to it, but where the driver still loads ok.. + ok = (pathName[0] != 0); + + RegCloseKey (pathKey); + } + + RegCloseKey (subKey); + } + + break; + } + } + + RegCloseKey (hk); + } + + return ok; + } + + //============================================================================== + void addDriverInfo (const String& keyName, HKEY hk) + { + HKEY subKey; + + if (RegOpenKeyEx (hk, keyName.toWideCharPointer(), 0, KEY_READ, &subKey) == ERROR_SUCCESS) + { + TCHAR buf [256] = { 0 }; + DWORD dtype = REG_SZ; + DWORD dsize = sizeof (buf); + + if (RegQueryValueEx (subKey, _T("clsid"), 0, &dtype, (LPBYTE) buf, &dsize) == ERROR_SUCCESS) + { + if (dsize > 0 && checkClassIsOk (buf)) + { + CLSID classId; + if (CLSIDFromString ((LPOLESTR) buf, &classId) == S_OK) + { + dtype = REG_SZ; + dsize = sizeof (buf); + String deviceName; + + if (RegQueryValueEx (subKey, _T("description"), 0, &dtype, (LPBYTE) buf, &dsize) == ERROR_SUCCESS) + deviceName = buf; + else + deviceName = keyName; + + JUCE_ASIO_LOG ("found " + deviceName); + deviceNames.add (deviceName); + classIds.add (classId); + } + } + + RegCloseKey (subKey); + } + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODeviceType) +}; + +void sendASIODeviceChangeToListeners (ASIOAudioIODeviceType* type) +{ + if (type != nullptr) + type->sendDeviceChangeToListeners(); +} + +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO() +{ + return new ASIOAudioIODeviceType(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp new file mode 100644 index 0000000000..3c3befb80f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp @@ -0,0 +1,411 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace CDBurnerHelpers +{ + IDiscRecorder* enumCDBurners (StringArray* list, int indexToOpen, IDiscMaster** master) + { + CoInitialize (0); + + IDiscMaster* dm; + IDiscRecorder* result = nullptr; + + if (SUCCEEDED (CoCreateInstance (CLSID_MSDiscMasterObj, 0, + CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, + IID_IDiscMaster, + (void**) &dm))) + { + if (SUCCEEDED (dm->Open())) + { + IEnumDiscRecorders* drEnum = nullptr; + + if (SUCCEEDED (dm->EnumDiscRecorders (&drEnum))) + { + IDiscRecorder* dr = nullptr; + DWORD dummy; + int index = 0; + + while (drEnum->Next (1, &dr, &dummy) == S_OK) + { + if (indexToOpen == index) + { + result = dr; + break; + } + else if (list != nullptr) + { + BSTR path; + + if (SUCCEEDED (dr->GetPath (&path))) + list->add ((const WCHAR*) path); + } + + ++index; + dr->Release(); + } + + drEnum->Release(); + } + + if (master == 0) + dm->Close(); + } + + if (master != nullptr) + *master = dm; + else + dm->Release(); + } + + return result; + } +} + +//============================================================================== +class AudioCDBurner::Pimpl : public ComBaseClassHelper , + public Timer +{ +public: + Pimpl (AudioCDBurner& owner_, IDiscMaster* discMaster_, IDiscRecorder* discRecorder_) + : owner (owner_), discMaster (discMaster_), discRecorder (discRecorder_), redbook (0), + listener (0), progress (0), shouldCancel (false) + { + HRESULT hr = discMaster->SetActiveDiscMasterFormat (IID_IRedbookDiscMaster, (void**) &redbook); + jassert (SUCCEEDED (hr)); + hr = discMaster->SetActiveDiscRecorder (discRecorder); + //jassert (SUCCEEDED (hr)); + + lastState = getDiskState(); + startTimer (2000); + } + + ~Pimpl() {} + + void releaseObjects() + { + discRecorder->Close(); + if (redbook != nullptr) + redbook->Release(); + discRecorder->Release(); + discMaster->Release(); + Release(); + } + + JUCE_COMRESULT QueryCancel (boolean* pbCancel) + { + if (listener != nullptr && ! shouldCancel) + shouldCancel = listener->audioCDBurnProgress (progress); + + *pbCancel = shouldCancel; + + return S_OK; + } + + JUCE_COMRESULT NotifyBlockProgress (long nCompleted, long nTotal) + { + progress = nCompleted / (float) nTotal; + shouldCancel = listener != nullptr && listener->audioCDBurnProgress (progress); + + return E_NOTIMPL; + } + + JUCE_COMRESULT NotifyPnPActivity (void) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyAddProgress (long /*nCompletedSteps*/, long /*nTotalSteps*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyTrackProgress (long /*nCurrentTrack*/, long /*nTotalTracks*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyPreparingBurn (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyClosingDisc (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } + + class ScopedDiscOpener + { + public: + ScopedDiscOpener (Pimpl& p) : pimpl (p) { pimpl.discRecorder->OpenExclusive(); } + ~ScopedDiscOpener() { pimpl.discRecorder->Close(); } + + private: + Pimpl& pimpl; + + JUCE_DECLARE_NON_COPYABLE (ScopedDiscOpener) + }; + + DiskState getDiskState() + { + const ScopedDiscOpener opener (*this); + + long type, flags; + HRESULT hr = discRecorder->QueryMediaType (&type, &flags); + + if (FAILED (hr)) + return unknown; + + if (type != 0 && (flags & MEDIA_WRITABLE) != 0) + return writableDiskPresent; + + if (type == 0) + return noDisc; + + return readOnlyDiskPresent; + } + + int getIntProperty (const LPOLESTR name, const int defaultReturn) const + { + ComSmartPtr prop; + if (FAILED (discRecorder->GetRecorderProperties (prop.resetAndGetPointerAddress()))) + return defaultReturn; + + PROPSPEC iPropSpec; + iPropSpec.ulKind = PRSPEC_LPWSTR; + iPropSpec.lpwstr = name; + + PROPVARIANT iPropVariant; + return FAILED (prop->ReadMultiple (1, &iPropSpec, &iPropVariant)) + ? defaultReturn : (int) iPropVariant.lVal; + } + + bool setIntProperty (const LPOLESTR name, const int value) const + { + ComSmartPtr prop; + if (FAILED (discRecorder->GetRecorderProperties (prop.resetAndGetPointerAddress()))) + return false; + + PROPSPEC iPropSpec; + iPropSpec.ulKind = PRSPEC_LPWSTR; + iPropSpec.lpwstr = name; + + PROPVARIANT iPropVariant; + if (FAILED (prop->ReadMultiple (1, &iPropSpec, &iPropVariant))) + return false; + + iPropVariant.lVal = (long) value; + return SUCCEEDED (prop->WriteMultiple (1, &iPropSpec, &iPropVariant, iPropVariant.vt)) + && SUCCEEDED (discRecorder->SetRecorderProperties (prop)); + } + + void timerCallback() override + { + const DiskState state = getDiskState(); + + if (state != lastState) + { + lastState = state; + owner.sendChangeMessage(); + } + } + + AudioCDBurner& owner; + DiskState lastState; + IDiscMaster* discMaster; + IDiscRecorder* discRecorder; + IRedbookDiscMaster* redbook; + AudioCDBurner::BurnProgressListener* listener; + float progress; + bool shouldCancel; +}; + +//============================================================================== +AudioCDBurner::AudioCDBurner (const int deviceIndex) +{ + IDiscMaster* discMaster = nullptr; + IDiscRecorder* discRecorder = CDBurnerHelpers::enumCDBurners (0, deviceIndex, &discMaster); + + if (discRecorder != nullptr) + pimpl = new Pimpl (*this, discMaster, discRecorder); +} + +AudioCDBurner::~AudioCDBurner() +{ + if (pimpl != nullptr) + pimpl.release()->releaseObjects(); +} + +StringArray AudioCDBurner::findAvailableDevices() +{ + StringArray devs; + CDBurnerHelpers::enumCDBurners (&devs, -1, 0); + return devs; +} + +AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) +{ + ScopedPointer b (new AudioCDBurner (deviceIndex)); + + if (b->pimpl == 0) + b = nullptr; + + return b.release(); +} + +AudioCDBurner::DiskState AudioCDBurner::getDiskState() const +{ + return pimpl->getDiskState(); +} + +bool AudioCDBurner::isDiskPresent() const +{ + return getDiskState() == writableDiskPresent; +} + +bool AudioCDBurner::openTray() +{ + const Pimpl::ScopedDiscOpener opener (*pimpl); + return SUCCEEDED (pimpl->discRecorder->Eject()); +} + +AudioCDBurner::DiskState AudioCDBurner::waitUntilStateChange (int timeOutMilliseconds) +{ + const int64 timeout = Time::currentTimeMillis() + timeOutMilliseconds; + DiskState oldState = getDiskState(); + DiskState newState = oldState; + + while (newState == oldState && Time::currentTimeMillis() < timeout) + { + newState = getDiskState(); + Thread::sleep (jmin (250, (int) (timeout - Time::currentTimeMillis()))); + } + + return newState; +} + +Array AudioCDBurner::getAvailableWriteSpeeds() const +{ + Array results; + const int maxSpeed = pimpl->getIntProperty (L"MaxWriteSpeed", 1); + const int speeds[] = { 1, 2, 4, 8, 12, 16, 20, 24, 32, 40, 64, 80 }; + + for (int i = 0; i < numElementsInArray (speeds); ++i) + if (speeds[i] <= maxSpeed) + results.add (speeds[i]); + + results.addIfNotAlreadyThere (maxSpeed); + return results; +} + +bool AudioCDBurner::setBufferUnderrunProtection (const bool shouldBeEnabled) +{ + if (pimpl->getIntProperty (L"BufferUnderrunFreeCapable", 0) == 0) + return false; + + pimpl->setIntProperty (L"EnableBufferUnderrunFree", shouldBeEnabled ? -1 : 0); + return pimpl->getIntProperty (L"EnableBufferUnderrunFree", 0) != 0; +} + +int AudioCDBurner::getNumAvailableAudioBlocks() const +{ + long blocksFree = 0; + pimpl->redbook->GetAvailableAudioTrackBlocks (&blocksFree); + return blocksFree; +} + +String AudioCDBurner::burn (AudioCDBurner::BurnProgressListener* listener, bool ejectDiscAfterwards, + bool performFakeBurnForTesting, int writeSpeed) +{ + pimpl->setIntProperty (L"WriteSpeed", writeSpeed > 0 ? writeSpeed : -1); + + pimpl->listener = listener; + pimpl->progress = 0; + pimpl->shouldCancel = false; + + UINT_PTR cookie; + HRESULT hr = pimpl->discMaster->ProgressAdvise ((AudioCDBurner::Pimpl*) pimpl, &cookie); + + hr = pimpl->discMaster->RecordDisc (performFakeBurnForTesting, + ejectDiscAfterwards); + + String error; + if (hr != S_OK) + { + const char* e = "Couldn't open or write to the CD device"; + + if (hr == IMAPI_E_USERABORT) + e = "User cancelled the write operation"; + else if (hr == IMAPI_E_MEDIUM_NOTPRESENT || hr == IMAPI_E_TRACKOPEN) + e = "No Disk present"; + + error = e; + } + + pimpl->discMaster->ProgressUnadvise (cookie); + pimpl->listener = 0; + + return error; +} + +bool AudioCDBurner::addAudioTrack (AudioSource* audioSource, int numSamples) +{ + if (audioSource == 0) + return false; + + ScopedPointer source (audioSource); + + long bytesPerBlock; + HRESULT hr = pimpl->redbook->GetAudioBlockSize (&bytesPerBlock); + + const int samplesPerBlock = bytesPerBlock / 4; + bool ok = true; + + hr = pimpl->redbook->CreateAudioTrack ((long) numSamples / (bytesPerBlock * 4)); + + HeapBlock buffer (bytesPerBlock); + AudioSampleBuffer sourceBuffer (2, samplesPerBlock); + int samplesDone = 0; + + source->prepareToPlay (samplesPerBlock, 44100.0); + + while (ok) + { + { + AudioSourceChannelInfo info (&sourceBuffer, 0, samplesPerBlock); + sourceBuffer.clear(); + + source->getNextAudioBlock (info); + } + + buffer.clear (bytesPerBlock); + + typedef AudioData::Pointer CDSampleFormat; + + typedef AudioData::Pointer SourceSampleFormat; + + CDSampleFormat left (buffer, 2); + left.convertSamples (SourceSampleFormat (sourceBuffer.getReadPointer (0)), samplesPerBlock); + CDSampleFormat right (buffer + 2, 2); + right.convertSamples (SourceSampleFormat (sourceBuffer.getReadPointer (1)), samplesPerBlock); + + hr = pimpl->redbook->AddAudioTrackBlocks (buffer, bytesPerBlock); + + if (FAILED (hr)) + ok = false; + + samplesDone += samplesPerBlock; + + if (samplesDone >= numSamples) + break; + } + + hr = pimpl->redbook->CloseAudioTrack(); + return ok && hr == S_OK; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp new file mode 100644 index 0000000000..064ca9148f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp @@ -0,0 +1,1309 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace CDReaderHelpers +{ + +#define FILE_ANY_ACCESS 0 +#ifndef FILE_READ_ACCESS + #define FILE_READ_ACCESS 1 +#endif +#ifndef FILE_WRITE_ACCESS + #define FILE_WRITE_ACCESS 2 +#endif + +#define METHOD_BUFFERED 0 +#define IOCTL_SCSI_BASE 4 +#define SCSI_IOCTL_DATA_OUT 0 +#define SCSI_IOCTL_DATA_IN 1 +#define SCSI_IOCTL_DATA_UNSPECIFIED 2 + +#define CTL_CODE2(DevType, Function, Method, Access) (((DevType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) +#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE2( IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS ) +#define IOCTL_SCSI_GET_ADDRESS CTL_CODE2( IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS ) + +#define SENSE_LEN 14 +#define SRB_ENABLE_RESIDUAL_COUNT 0x04 +#define SRB_DIR_IN 0x08 +#define SRB_DIR_OUT 0x10 +#define SRB_EVENT_NOTIFY 0x40 +#define SC_HA_INQUIRY 0x00 +#define SC_GET_DEV_TYPE 0x01 +#define SC_EXEC_SCSI_CMD 0x02 +#define SS_PENDING 0x00 +#define SS_COMP 0x01 +#define SS_ERR 0x04 + +enum +{ + READTYPE_ANY = 0, + READTYPE_ATAPI1 = 1, + READTYPE_ATAPI2 = 2, + READTYPE_READ6 = 3, + READTYPE_READ10 = 4, + READTYPE_READ_D8 = 5, + READTYPE_READ_D4 = 6, + READTYPE_READ_D4_1 = 7, + READTYPE_READ10_2 = 8 +}; + +struct SCSI_PASS_THROUGH +{ + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + ULONG DataBufferOffset; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}; + +struct SCSI_PASS_THROUGH_DIRECT +{ + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}; + +struct SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER +{ + SCSI_PASS_THROUGH_DIRECT spt; + ULONG Filler; + UCHAR ucSenseBuf[32]; +}; + +struct SCSI_ADDRESS +{ + ULONG Length; + UCHAR PortNumber; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; +}; + +#pragma pack(1) + +struct SRB_GDEVBlock +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaID; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; + BYTE SRB_Target; + BYTE SRB_Lun; + BYTE SRB_DeviceType; + BYTE SRB_Rsvd1; + BYTE pad[68]; +}; + + +struct SRB_ExecSCSICmd +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaID; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; + BYTE SRB_Target; + BYTE SRB_Lun; + WORD SRB_Rsvd1; + DWORD SRB_BufLen; + BYTE *SRB_BufPointer; + BYTE SRB_SenseLen; + BYTE SRB_CDBLen; + BYTE SRB_HaStat; + BYTE SRB_TargStat; + VOID *SRB_PostProc; + BYTE SRB_Rsvd2[20]; + BYTE CDBByte[16]; + BYTE SenseArea[SENSE_LEN + 2]; +}; + +struct SRB +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaId; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; +}; + +struct TOCTRACK +{ + BYTE rsvd; + BYTE ADR; + BYTE trackNumber; + BYTE rsvd2; + BYTE addr[4]; +}; + +struct TOC +{ + WORD tocLen; + BYTE firstTrack; + BYTE lastTrack; + TOCTRACK tracks[100]; +}; + +#pragma pack() + +//============================================================================== +struct CDDeviceDescription +{ + CDDeviceDescription() : ha (0), tgt (0), lun (0), scsiDriveLetter (0) + { + } + + void createDescription (const char* data) + { + description << String (data + 8, 8).trim() // vendor + << ' ' << String (data + 16, 16).trim() // product id + << ' ' << String (data + 32, 4).trim(); // rev + } + + String description; + BYTE ha, tgt, lun; + char scsiDriveLetter; // will be 0 if not using scsi +}; + +//============================================================================== +class CDReadBuffer +{ +public: + CDReadBuffer (const int numberOfFrames) + : startFrame (0), numFrames (0), dataStartOffset (0), + dataLength (0), bufferSize (2352 * numberOfFrames), index (0), + buffer (bufferSize), wantsIndex (false) + { + } + + bool isZero() const noexcept + { + for (int i = 0; i < dataLength; ++i) + if (buffer [dataStartOffset + i] != 0) + return false; + + return true; + } + + int startFrame, numFrames, dataStartOffset; + int dataLength, bufferSize, index; + HeapBlock buffer; + bool wantsIndex; +}; + +class CDDeviceHandle; + +//============================================================================== +class CDController +{ +public: + CDController() : initialised (false) {} + virtual ~CDController() {} + + virtual bool read (CDReadBuffer&) = 0; + virtual void shutDown() {} + + bool readAudio (CDReadBuffer& rb, CDReadBuffer* overlapBuffer = 0); + int getLastIndex(); + +public: + CDDeviceHandle* deviceInfo; + int framesToCheck, framesOverlap; + bool initialised; + + void prepare (SRB_ExecSCSICmd& s); + void perform (SRB_ExecSCSICmd& s); + void setPaused (bool paused); +}; + + +//============================================================================== +class CDDeviceHandle +{ +public: + CDDeviceHandle (const CDDeviceDescription& device, HANDLE scsiHandle_) + : info (device), scsiHandle (scsiHandle_), readType (READTYPE_ANY) + { + } + + ~CDDeviceHandle() + { + if (controller != nullptr) + { + controller->shutDown(); + controller = 0; + } + + if (scsiHandle != 0) + CloseHandle (scsiHandle); + } + + bool readTOC (TOC* lpToc); + bool readAudio (CDReadBuffer& buffer, CDReadBuffer* overlapBuffer = 0); + void openDrawer (bool shouldBeOpen); + void performScsiCommand (HANDLE event, SRB_ExecSCSICmd& s); + + CDDeviceDescription info; + HANDLE scsiHandle; + BYTE readType; + +private: + ScopedPointer controller; + + bool testController (int readType, CDController* newController, CDReadBuffer& bufferToUse); +}; + +//============================================================================== +HANDLE createSCSIDeviceHandle (const char driveLetter) +{ + TCHAR devicePath[] = { '\\', '\\', '.', '\\', driveLetter, ':', 0, 0 }; + DWORD flags = GENERIC_READ | GENERIC_WRITE; + HANDLE h = CreateFile (devicePath, flags, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + if (h == INVALID_HANDLE_VALUE) + { + flags ^= GENERIC_WRITE; + h = CreateFile (devicePath, flags, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + } + + return h; +} + +void findCDDevices (Array& list) +{ + for (char driveLetter = 'b'; driveLetter <= 'z'; ++driveLetter) + { + TCHAR drivePath[] = { driveLetter, ':', '\\', 0, 0 }; + + if (GetDriveType (drivePath) == DRIVE_CDROM) + { + HANDLE h = createSCSIDeviceHandle (driveLetter); + + if (h != INVALID_HANDLE_VALUE) + { + char buffer[100] = { 0 }; + + SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER p = { 0 }; + p.spt.Length = sizeof (SCSI_PASS_THROUGH); + p.spt.CdbLength = 6; + p.spt.SenseInfoLength = 24; + p.spt.DataIn = SCSI_IOCTL_DATA_IN; + p.spt.DataTransferLength = sizeof (buffer); + p.spt.TimeOutValue = 2; + p.spt.DataBuffer = buffer; + p.spt.SenseInfoOffset = offsetof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); + p.spt.Cdb[0] = 0x12; + p.spt.Cdb[4] = 100; + + DWORD bytesReturned = 0; + + if (DeviceIoControl (h, IOCTL_SCSI_PASS_THROUGH_DIRECT, + &p, sizeof (p), &p, sizeof (p), + &bytesReturned, 0) != 0) + { + CDDeviceDescription dev; + dev.scsiDriveLetter = driveLetter; + dev.createDescription (buffer); + + SCSI_ADDRESS scsiAddr = { 0 }; + scsiAddr.Length = sizeof (scsiAddr); + + if (DeviceIoControl (h, IOCTL_SCSI_GET_ADDRESS, + 0, 0, &scsiAddr, sizeof (scsiAddr), + &bytesReturned, 0) != 0) + { + dev.ha = scsiAddr.PortNumber; + dev.tgt = scsiAddr.TargetId; + dev.lun = scsiAddr.Lun; + list.add (dev); + } + } + + CloseHandle (h); + } + } + } +} + +DWORD performScsiPassThroughCommand (SRB_ExecSCSICmd* const srb, const char driveLetter, + HANDLE& deviceHandle, const bool retryOnFailure) +{ + SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER s = { 0 }; + s.spt.Length = sizeof (SCSI_PASS_THROUGH); + s.spt.CdbLength = srb->SRB_CDBLen; + + s.spt.DataIn = (BYTE) ((srb->SRB_Flags & SRB_DIR_IN) + ? SCSI_IOCTL_DATA_IN + : ((srb->SRB_Flags & SRB_DIR_OUT) + ? SCSI_IOCTL_DATA_OUT + : SCSI_IOCTL_DATA_UNSPECIFIED)); + + s.spt.DataTransferLength = srb->SRB_BufLen; + s.spt.TimeOutValue = 5; + s.spt.DataBuffer = srb->SRB_BufPointer; + s.spt.SenseInfoOffset = offsetof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); + + memcpy (s.spt.Cdb, srb->CDBByte, srb->SRB_CDBLen); + + srb->SRB_Status = SS_ERR; + srb->SRB_TargStat = 0x0004; + + DWORD bytesReturned = 0; + + if (DeviceIoControl (deviceHandle, IOCTL_SCSI_PASS_THROUGH_DIRECT, + &s, sizeof (s), &s, sizeof (s), &bytesReturned, 0) != 0) + { + srb->SRB_Status = SS_COMP; + } + else if (retryOnFailure) + { + const DWORD error = GetLastError(); + + if ((error == ERROR_MEDIA_CHANGED) || (error == ERROR_INVALID_HANDLE)) + { + if (error != ERROR_INVALID_HANDLE) + CloseHandle (deviceHandle); + + deviceHandle = createSCSIDeviceHandle (driveLetter); + + return performScsiPassThroughCommand (srb, driveLetter, deviceHandle, false); + } + } + + return srb->SRB_Status; +} + + +//============================================================================== +// Controller types.. + +class ControllerType1 : public CDController +{ +public: + ControllerType1() {} + + bool read (CDReadBuffer& rb) + { + if (rb.numFrames * 2352 > rb.bufferSize) + return false; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb.bufferSize; + s.SRB_BufPointer = rb.buffer; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0xBE; + s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); + s.CDBByte[8] = (BYTE) (rb.numFrames & 0xFF); + s.CDBByte[9] = (BYTE) (deviceInfo->readType == READTYPE_ATAPI1 ? 0x10 : 0xF0); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb.dataLength = rb.numFrames * 2352; + rb.dataStartOffset = 0; + return true; + } +}; + +//============================================================================== +class ControllerType2 : public CDController +{ +public: + ControllerType2() {} + + void shutDown() + { + if (initialised) + { + BYTE bufPointer[] = { 0, 0, 0, 8, 83, 0, 0, 0, 0, 0, 8, 0 }; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT; + s.SRB_BufLen = 0x0C; + s.SRB_BufPointer = bufPointer; + s.SRB_CDBLen = 6; + s.CDBByte[0] = 0x15; + s.CDBByte[4] = 0x0C; + perform (s); + } + } + + bool init() + { + SRB_ExecSCSICmd s; + s.SRB_Status = SS_ERR; + + if (deviceInfo->readType == READTYPE_READ10_2) + { + BYTE bufPointer1[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 35, 6, 0, 0, 0, 0, 0, 128 }; + BYTE bufPointer2[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 1, 6, 32, 7, 0, 0, 0, 0 }; + + for (int i = 0; i < 2; ++i) + { + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0x14; + s.SRB_BufPointer = (i == 0) ? bufPointer1 : bufPointer2; + s.SRB_CDBLen = 6; + s.CDBByte[0] = 0x15; + s.CDBByte[1] = 0x10; + s.CDBByte[4] = 0x14; + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + } + } + else + { + BYTE bufPointer[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48 }; + + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0x0C; + s.SRB_BufPointer = bufPointer; + s.SRB_CDBLen = 6; + s.CDBByte[0] = 0x15; + s.CDBByte[4] = 0x0C; + perform (s); + } + + return s.SRB_Status == SS_COMP; + } + + bool read (CDReadBuffer& rb) + { + if (rb.numFrames * 2352 > rb.bufferSize) + return false; + + if (! initialised) + { + initialised = init(); + + if (! initialised) + return false; + } + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb.bufferSize; + s.SRB_BufPointer = rb.buffer; + s.SRB_CDBLen = 10; + s.CDBByte[0] = 0x28; + s.CDBByte[1] = (BYTE) (deviceInfo->info.lun << 5); + s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); + s.CDBByte[8] = (BYTE) (rb.numFrames & 0xFF); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb.dataLength = rb.numFrames * 2352; + rb.dataStartOffset = 0; + return true; + } +}; + +//============================================================================== +class ControllerType3 : public CDController +{ +public: + ControllerType3() {} + + bool read (CDReadBuffer& rb) + { + if (rb.numFrames * 2352 > rb.bufferSize) + return false; + + if (! initialised) + { + setPaused (false); + initialised = true; + } + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb.numFrames * 2352; + s.SRB_BufPointer = rb.buffer; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0xD8; + s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); + s.CDBByte[9] = (BYTE) (rb.numFrames & 0xFF); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb.dataLength = rb.numFrames * 2352; + rb.dataStartOffset = 0; + return true; + } +}; + +//============================================================================== +class ControllerType4 : public CDController +{ +public: + ControllerType4() {} + + bool selectD4Mode() + { + BYTE bufPointer[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 48 }; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_CDBLen = 6; + s.SRB_BufLen = 12; + s.SRB_BufPointer = bufPointer; + s.CDBByte[0] = 0x15; + s.CDBByte[1] = 0x10; + s.CDBByte[4] = 0x08; + perform (s); + + return s.SRB_Status == SS_COMP; + } + + bool read (CDReadBuffer& rb) + { + if (rb.numFrames * 2352 > rb.bufferSize) + return false; + + if (! initialised) + { + setPaused (true); + + if (deviceInfo->readType == READTYPE_READ_D4_1) + selectD4Mode(); + + initialised = true; + } + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb.bufferSize; + s.SRB_BufPointer = rb.buffer; + s.SRB_CDBLen = 10; + s.CDBByte[0] = 0xD4; + s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); + s.CDBByte[8] = (BYTE) (rb.numFrames & 0xFF); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb.dataLength = rb.numFrames * 2352; + rb.dataStartOffset = 0; + return true; + } +}; + + +//============================================================================== +void CDController::prepare (SRB_ExecSCSICmd& s) +{ + zerostruct (s); + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = deviceInfo->info.ha; + s.SRB_Target = deviceInfo->info.tgt; + s.SRB_Lun = deviceInfo->info.lun; + s.SRB_SenseLen = SENSE_LEN; +} + +void CDController::perform (SRB_ExecSCSICmd& s) +{ + s.SRB_PostProc = CreateEvent (0, TRUE, FALSE, 0); + + deviceInfo->performScsiCommand (s.SRB_PostProc, s); +} + +void CDController::setPaused (bool paused) +{ + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_CDBLen = 10; + s.CDBByte[0] = 0x4B; + s.CDBByte[8] = (BYTE) (paused ? 0 : 1); + perform (s); +} + +bool CDController::readAudio (CDReadBuffer& rb, CDReadBuffer* overlapBuffer) +{ + if (overlapBuffer != nullptr) + { + const bool canDoJitter = (overlapBuffer->bufferSize >= 2352 * framesToCheck); + const bool doJitter = canDoJitter && ! overlapBuffer->isZero(); + + if (doJitter + && overlapBuffer->startFrame > 0 + && overlapBuffer->numFrames > 0 + && overlapBuffer->dataLength > 0) + { + const int numFrames = rb.numFrames; + + if (overlapBuffer->startFrame == (rb.startFrame - framesToCheck)) + { + rb.startFrame -= framesOverlap; + + if (framesToCheck < framesOverlap + && numFrames + framesOverlap <= rb.bufferSize / 2352) + rb.numFrames += framesOverlap; + } + else + { + overlapBuffer->dataLength = 0; + overlapBuffer->startFrame = 0; + overlapBuffer->numFrames = 0; + } + } + + if (! read (rb)) + return false; + + if (doJitter) + { + const int checkLen = framesToCheck * 2352; + const int maxToCheck = rb.dataLength - checkLen; + + if (overlapBuffer->dataLength == 0 || overlapBuffer->isZero()) + return true; + + BYTE* const p = overlapBuffer->buffer + overlapBuffer->dataStartOffset; + bool found = false; + + for (int i = 0; i < maxToCheck; ++i) + { + if (memcmp (p, rb.buffer + i, checkLen) == 0) + { + i += checkLen; + rb.dataStartOffset = i; + rb.dataLength -= i; + rb.startFrame = overlapBuffer->startFrame + framesToCheck; + found = true; + break; + } + } + + rb.numFrames = rb.dataLength / 2352; + rb.dataLength = 2352 * rb.numFrames; + + if (! found) + return false; + } + + if (canDoJitter) + { + memcpy (overlapBuffer->buffer, + rb.buffer + rb.dataStartOffset + 2352 * (rb.numFrames - framesToCheck), + 2352 * framesToCheck); + + overlapBuffer->startFrame = rb.startFrame + rb.numFrames - framesToCheck; + overlapBuffer->numFrames = framesToCheck; + overlapBuffer->dataLength = 2352 * framesToCheck; + overlapBuffer->dataStartOffset = 0; + } + else + { + overlapBuffer->startFrame = 0; + overlapBuffer->numFrames = 0; + overlapBuffer->dataLength = 0; + } + + return true; + } + + return read (rb); +} + +int CDController::getLastIndex() +{ + char qdata[100]; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = sizeof (qdata); + s.SRB_BufPointer = (BYTE*) qdata; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0x42; + s.CDBByte[1] = (BYTE) (deviceInfo->info.lun << 5); + s.CDBByte[2] = 64; + s.CDBByte[3] = 1; // get current position + s.CDBByte[7] = 0; + s.CDBByte[8] = (BYTE) sizeof (qdata); + perform (s); + + return s.SRB_Status == SS_COMP ? qdata[7] : 0; +} + +//============================================================================== +bool CDDeviceHandle::readTOC (TOC* lpToc) +{ + SRB_ExecSCSICmd s = { 0 }; + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = info.ha; + s.SRB_Target = info.tgt; + s.SRB_Lun = info.lun; + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0x324; + s.SRB_BufPointer = (BYTE*) lpToc; + s.SRB_SenseLen = 0x0E; + s.SRB_CDBLen = 0x0A; + s.SRB_PostProc = CreateEvent (0, TRUE, FALSE, 0); + s.CDBByte[0] = 0x43; + s.CDBByte[1] = 0x00; + s.CDBByte[7] = 0x03; + s.CDBByte[8] = 0x24; + + performScsiCommand (s.SRB_PostProc, s); + return (s.SRB_Status == SS_COMP); +} + +void CDDeviceHandle::performScsiCommand (HANDLE event, SRB_ExecSCSICmd& s) +{ + ResetEvent (event); + DWORD status = performScsiPassThroughCommand ((SRB_ExecSCSICmd*) &s, info.scsiDriveLetter, scsiHandle, true); + + if (status == SS_PENDING) + WaitForSingleObject (event, 4000); + + CloseHandle (event); +} + +bool CDDeviceHandle::readAudio (CDReadBuffer& buffer, CDReadBuffer* overlapBuffer) +{ + if (controller == 0) + { + testController (READTYPE_ATAPI2, new ControllerType1(), buffer) + || testController (READTYPE_ATAPI1, new ControllerType1(), buffer) + || testController (READTYPE_READ10_2, new ControllerType2(), buffer) + || testController (READTYPE_READ10, new ControllerType2(), buffer) + || testController (READTYPE_READ_D8, new ControllerType3(), buffer) + || testController (READTYPE_READ_D4, new ControllerType4(), buffer) + || testController (READTYPE_READ_D4_1, new ControllerType4(), buffer); + } + + buffer.index = 0; + + if (controller != nullptr && controller->readAudio (buffer, overlapBuffer)) + { + if (buffer.wantsIndex) + buffer.index = controller->getLastIndex(); + + return true; + } + + return false; +} + +void CDDeviceHandle::openDrawer (bool shouldBeOpen) +{ + if (shouldBeOpen) + { + if (controller != nullptr) + { + controller->shutDown(); + controller = nullptr; + } + + if (scsiHandle != 0) + { + CloseHandle (scsiHandle); + scsiHandle = 0; + } + } + + SRB_ExecSCSICmd s = { 0 }; + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = info.ha; + s.SRB_Target = info.tgt; + s.SRB_Lun = info.lun; + s.SRB_SenseLen = SENSE_LEN; + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0; + s.SRB_BufPointer = 0; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0x1b; + s.CDBByte[1] = (BYTE) (info.lun << 5); + s.CDBByte[4] = (BYTE) (shouldBeOpen ? 2 : 3); + s.SRB_PostProc = CreateEvent (0, TRUE, FALSE, 0); + + performScsiCommand (s.SRB_PostProc, s); +} + +bool CDDeviceHandle::testController (const int type, CDController* const newController, CDReadBuffer& rb) +{ + controller = newController; + readType = (BYTE) type; + + controller->deviceInfo = this; + controller->framesToCheck = 1; + controller->framesOverlap = 3; + + bool passed = false; + memset (rb.buffer, 0xcd, rb.bufferSize); + + if (controller->read (rb)) + { + passed = true; + int* p = (int*) (rb.buffer + rb.dataStartOffset); + int wrong = 0; + + for (int i = rb.dataLength / 4; --i >= 0;) + { + if (*p++ == (int) 0xcdcdcdcd) + { + if (++wrong == 4) + { + passed = false; + break; + } + } + else + { + wrong = 0; + } + } + } + + if (! passed) + { + controller->shutDown(); + controller = nullptr; + } + + return passed; +} + + +//============================================================================== +struct CDDeviceWrapper +{ + CDDeviceWrapper (const CDDeviceDescription& device, HANDLE scsiHandle) + : deviceHandle (device, scsiHandle), overlapBuffer (3), jitter (false) + { + // xxx jitter never seemed to actually be enabled (??) + } + + CDDeviceHandle deviceHandle; + CDReadBuffer overlapBuffer; + bool jitter; +}; + +//============================================================================== +int getAddressOfTrack (const TOCTRACK& t) noexcept +{ + return (((DWORD) t.addr[0]) << 24) + (((DWORD) t.addr[1]) << 16) + + (((DWORD) t.addr[2]) << 8) + ((DWORD) t.addr[3]); +} + +const int samplesPerFrame = 44100 / 75; +const int bytesPerFrame = samplesPerFrame * 4; +const int framesPerIndexRead = 4; + +} + +//============================================================================== +StringArray AudioCDReader::getAvailableCDNames() +{ + using namespace CDReaderHelpers; + StringArray results; + + Array list; + findCDDevices (list); + + for (int i = 0; i < list.size(); ++i) + { + String s; + if (list[i].scsiDriveLetter > 0) + s << String::charToString (list[i].scsiDriveLetter).toUpperCase() << ": "; + + s << list[i].description; + results.add (s); + } + + return results; +} + +AudioCDReader* AudioCDReader::createReaderForCD (const int deviceIndex) +{ + using namespace CDReaderHelpers; + + Array list; + findCDDevices (list); + + if (isPositiveAndBelow (deviceIndex, list.size())) + { + HANDLE h = createSCSIDeviceHandle (list [deviceIndex].scsiDriveLetter); + + if (h != INVALID_HANDLE_VALUE) + { + ScopedPointer cd (new AudioCDReader (new CDDeviceWrapper (list [deviceIndex], h))); + + if (cd->lengthInSamples > 0) + return cd.release(); + } + } + + return nullptr; +} + +AudioCDReader::AudioCDReader (void* handle_) + : AudioFormatReader (0, "CD Audio"), + handle (handle_), + indexingEnabled (false), + lastIndex (0), + firstFrameInBuffer (0), + samplesInBuffer (0) +{ + using namespace CDReaderHelpers; + jassert (handle_ != nullptr); + + refreshTrackLengths(); + + sampleRate = 44100.0; + bitsPerSample = 16; + numChannels = 2; + usesFloatingPointData = false; + + buffer.setSize (4 * bytesPerFrame, true); +} + +AudioCDReader::~AudioCDReader() +{ + using namespace CDReaderHelpers; + CDDeviceWrapper* const device = static_cast (handle); + delete device; +} + +bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + using namespace CDReaderHelpers; + CDDeviceWrapper* const device = static_cast (handle); + + bool ok = true; + + while (numSamples > 0) + { + const int bufferStartSample = firstFrameInBuffer * samplesPerFrame; + const int bufferEndSample = bufferStartSample + samplesInBuffer; + + if (startSampleInFile >= bufferStartSample + && startSampleInFile < bufferEndSample) + { + const int toDo = (int) jmin ((int64) numSamples, bufferEndSample - startSampleInFile); + + int* const l = destSamples[0] + startOffsetInDestBuffer; + int* const r = numDestChannels > 1 ? (destSamples[1] + startOffsetInDestBuffer) : nullptr; + const short* src = (const short*) buffer.getData(); + src += 2 * (startSampleInFile - bufferStartSample); + + for (int i = 0; i < toDo; ++i) + { + l[i] = src [i << 1] << 16; + + if (r != nullptr) + r[i] = src [(i << 1) + 1] << 16; + } + + startOffsetInDestBuffer += toDo; + startSampleInFile += toDo; + numSamples -= toDo; + } + else + { + const int framesInBuffer = (int) (buffer.getSize() / bytesPerFrame); + const int frameNeeded = (int) (startSampleInFile / samplesPerFrame); + + if (firstFrameInBuffer + framesInBuffer != frameNeeded) + { + device->overlapBuffer.dataLength = 0; + device->overlapBuffer.startFrame = 0; + device->overlapBuffer.numFrames = 0; + device->jitter = false; + } + + firstFrameInBuffer = frameNeeded; + lastIndex = 0; + + CDReadBuffer readBuffer (framesInBuffer + 4); + readBuffer.wantsIndex = indexingEnabled; + + int i; + for (i = 5; --i >= 0;) + { + readBuffer.startFrame = frameNeeded; + readBuffer.numFrames = framesInBuffer; + + if (device->deviceHandle.readAudio (readBuffer, device->jitter ? &device->overlapBuffer : 0)) + break; + else + device->overlapBuffer.dataLength = 0; + } + + if (i >= 0) + { + buffer.copyFrom (readBuffer.buffer + readBuffer.dataStartOffset, 0, readBuffer.dataLength); + samplesInBuffer = readBuffer.dataLength >> 2; + lastIndex = readBuffer.index; + } + else + { + int* l = destSamples[0] + startOffsetInDestBuffer; + int* r = numDestChannels > 1 ? (destSamples[1] + startOffsetInDestBuffer) : nullptr; + + while (--numSamples >= 0) + { + *l++ = 0; + + if (r != nullptr) + *r++ = 0; + } + + // sometimes the read fails for just the very last couple of blocks, so + // we'll ignore and errors in the last half-second of the disk.. + ok = startSampleInFile > (trackStartSamples [getNumTracks()] - 20000); + break; + } + } + } + + return ok; +} + +bool AudioCDReader::isCDStillPresent() const +{ + using namespace CDReaderHelpers; + TOC toc = { 0 }; + return static_cast (handle)->deviceHandle.readTOC (&toc); +} + +void AudioCDReader::refreshTrackLengths() +{ + using namespace CDReaderHelpers; + trackStartSamples.clear(); + zeromem (audioTracks, sizeof (audioTracks)); + + TOC toc = { 0 }; + + if (static_cast (handle)->deviceHandle.readTOC (&toc)) + { + int numTracks = 1 + toc.lastTrack - toc.firstTrack; + + for (int i = 0; i <= numTracks; ++i) + { + trackStartSamples.add (samplesPerFrame * getAddressOfTrack (toc.tracks [i])); + audioTracks [i] = ((toc.tracks[i].ADR & 4) == 0); + } + } + + lengthInSamples = getPositionOfTrackStart (getNumTracks()); +} + +bool AudioCDReader::isTrackAudio (int trackNum) const +{ + return trackNum >= 0 && trackNum < getNumTracks() && audioTracks [trackNum]; +} + +void AudioCDReader::enableIndexScanning (bool b) +{ + indexingEnabled = b; +} + +int AudioCDReader::getLastIndex() const +{ + return lastIndex; +} + +int AudioCDReader::getIndexAt (int samplePos) +{ + using namespace CDReaderHelpers; + CDDeviceWrapper* const device = static_cast (handle); + + const int frameNeeded = samplePos / samplesPerFrame; + + device->overlapBuffer.dataLength = 0; + device->overlapBuffer.startFrame = 0; + device->overlapBuffer.numFrames = 0; + device->jitter = false; + + firstFrameInBuffer = 0; + lastIndex = 0; + + CDReadBuffer readBuffer (4 + framesPerIndexRead); + readBuffer.wantsIndex = true; + + int i; + for (i = 5; --i >= 0;) + { + readBuffer.startFrame = frameNeeded; + readBuffer.numFrames = framesPerIndexRead; + + if (device->deviceHandle.readAudio (readBuffer)) + break; + } + + if (i >= 0) + return readBuffer.index; + + return -1; +} + +Array AudioCDReader::findIndexesInTrack (const int trackNumber) +{ + using namespace CDReaderHelpers; + Array indexes; + + const int trackStart = getPositionOfTrackStart (trackNumber); + const int trackEnd = getPositionOfTrackStart (trackNumber + 1); + + bool needToScan = true; + + if (trackEnd - trackStart > 20 * 44100) + { + // check the end of the track for indexes before scanning the whole thing + needToScan = false; + int pos = jmax (trackStart, trackEnd - 44100 * 5); + bool seenAnIndex = false; + + while (pos <= trackEnd - samplesPerFrame) + { + const int index = getIndexAt (pos); + + if (index == 0) + { + // lead-out, so skip back a bit if we've not found any indexes yet.. + if (seenAnIndex) + break; + + pos -= 44100 * 5; + + if (pos < trackStart) + break; + } + else + { + if (index > 0) + seenAnIndex = true; + + if (index > 1) + { + needToScan = true; + break; + } + + pos += samplesPerFrame * framesPerIndexRead; + } + } + } + + if (needToScan) + { + CDDeviceWrapper* const device = static_cast (handle); + + int pos = trackStart; + int last = -1; + + while (pos < trackEnd - samplesPerFrame * 10) + { + const int frameNeeded = pos / samplesPerFrame; + + device->overlapBuffer.dataLength = 0; + device->overlapBuffer.startFrame = 0; + device->overlapBuffer.numFrames = 0; + device->jitter = false; + + firstFrameInBuffer = 0; + + CDReadBuffer readBuffer (4); + readBuffer.wantsIndex = true; + + int i; + for (i = 5; --i >= 0;) + { + readBuffer.startFrame = frameNeeded; + readBuffer.numFrames = framesPerIndexRead; + + if (device->deviceHandle.readAudio (readBuffer)) + break; + } + + if (i < 0) + break; + + if (readBuffer.index > last && readBuffer.index > 1) + { + last = readBuffer.index; + indexes.add (pos); + } + + pos += samplesPerFrame * framesPerIndexRead; + } + + indexes.removeFirstMatchingValue (trackStart); + } + + return indexes; +} + +void AudioCDReader::ejectDisk() +{ + using namespace CDReaderHelpers; + static_cast (handle)->deviceHandle.openDrawer (true); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp new file mode 100644 index 0000000000..88a5960fec --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp @@ -0,0 +1,1277 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +} // (juce namespace) + +extern "C" +{ + // Declare just the minimum number of interfaces for the DSound objects that we need.. + typedef struct typeDSBUFFERDESC + { + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; + GUID guid3DAlgorithm; + } DSBUFFERDESC; + + struct IDirectSoundBuffer; + + #undef INTERFACE + #define INTERFACE IDirectSound + DECLARE_INTERFACE_(IDirectSound, IUnknown) + { + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(CreateSoundBuffer) (THIS_ DSBUFFERDESC*, IDirectSoundBuffer**, LPUNKNOWN) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(DuplicateSoundBuffer) (THIS_ IDirectSoundBuffer*, IDirectSoundBuffer**) PURE; + STDMETHOD(SetCooperativeLevel) (THIS_ HWND, DWORD) PURE; + STDMETHOD(Compact) (THIS) PURE; + STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD) PURE; + STDMETHOD(SetSpeakerConfig) (THIS_ DWORD) PURE; + STDMETHOD(Initialize) (THIS_ const GUID*) PURE; + }; + + #undef INTERFACE + #define INTERFACE IDirectSoundBuffer + DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) + { + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE; + STDMETHOD(GetVolume) (THIS_ LPLONG) PURE; + STDMETHOD(GetPan) (THIS_ LPLONG) PURE; + STDMETHOD(GetFrequency) (THIS_ LPDWORD) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE; + STDMETHOD(Initialize) (THIS_ IDirectSound*, DSBUFFERDESC*) PURE; + STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID*, LPDWORD, LPVOID*, LPDWORD, DWORD) PURE; + STDMETHOD(Play) (THIS_ DWORD, DWORD, DWORD) PURE; + STDMETHOD(SetCurrentPosition) (THIS_ DWORD) PURE; + STDMETHOD(SetFormat) (THIS_ const WAVEFORMATEX*) PURE; + STDMETHOD(SetVolume) (THIS_ LONG) PURE; + STDMETHOD(SetPan) (THIS_ LONG) PURE; + STDMETHOD(SetFrequency) (THIS_ DWORD) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; + STDMETHOD(Restore) (THIS) PURE; + }; + + //============================================================================== + typedef struct typeDSCBUFFERDESC + { + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; + } DSCBUFFERDESC; + + struct IDirectSoundCaptureBuffer; + + #undef INTERFACE + #define INTERFACE IDirectSoundCapture + DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown) + { + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(CreateCaptureBuffer) (THIS_ DSCBUFFERDESC*, IDirectSoundCaptureBuffer**, LPUNKNOWN) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(Initialize) (THIS_ const GUID*) PURE; + }; + + #undef INTERFACE + #define INTERFACE IDirectSoundCaptureBuffer + DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown) + { + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE; + STDMETHOD(Initialize) (THIS_ IDirectSoundCapture*, DSCBUFFERDESC*) PURE; + STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID*, LPDWORD, LPVOID*, LPDWORD, DWORD) PURE; + STDMETHOD(Start) (THIS_ DWORD) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; + }; + + #undef INTERFACE +} + +namespace juce +{ + +//============================================================================== +namespace DSoundLogging +{ + String getErrorMessage (HRESULT hr) + { + const char* result = nullptr; + + switch (hr) + { + case MAKE_HRESULT(1, 0x878, 10): result = "Device already allocated"; break; + case MAKE_HRESULT(1, 0x878, 30): result = "Control unavailable"; break; + case E_INVALIDARG: result = "Invalid parameter"; break; + case MAKE_HRESULT(1, 0x878, 50): result = "Invalid call"; break; + case E_FAIL: result = "Generic error"; break; + case MAKE_HRESULT(1, 0x878, 70): result = "Priority level error"; break; + case E_OUTOFMEMORY: result = "Out of memory"; break; + case MAKE_HRESULT(1, 0x878, 100): result = "Bad format"; break; + case E_NOTIMPL: result = "Unsupported function"; break; + case MAKE_HRESULT(1, 0x878, 120): result = "No driver"; break; + case MAKE_HRESULT(1, 0x878, 130): result = "Already initialised"; break; + case CLASS_E_NOAGGREGATION: result = "No aggregation"; break; + case MAKE_HRESULT(1, 0x878, 150): result = "Buffer lost"; break; + case MAKE_HRESULT(1, 0x878, 160): result = "Another app has priority"; break; + case MAKE_HRESULT(1, 0x878, 170): result = "Uninitialised"; break; + case E_NOINTERFACE: result = "No interface"; break; + case S_OK: result = "No error"; break; + default: return "Unknown error: " + String ((int) hr); + } + + return result; + } + + //============================================================================== + #if JUCE_DIRECTSOUND_LOGGING + static void logMessage (String message) + { + message = "DSOUND: " + message; + DBG (message); + Logger::writeToLog (message); + } + + static void logError (HRESULT hr, int lineNum) + { + if (FAILED (hr)) + { + String error ("Error at line "); + error << lineNum << ": " << getErrorMessage (hr); + logMessage (error); + } + } + + #define CATCH JUCE_CATCH_EXCEPTION + #define JUCE_DS_LOG(a) DSoundLogging::logMessage(a); + #define JUCE_DS_LOG_ERROR(a) DSoundLogging::logError(a, __LINE__); + #else + #define CATCH JUCE_CATCH_ALL + #define JUCE_DS_LOG(a) + #define JUCE_DS_LOG_ERROR(a) + #endif +} + +//============================================================================== +namespace +{ + #define DSOUND_FUNCTION(functionName, params) \ + typedef HRESULT (WINAPI *type##functionName) params; \ + static type##functionName ds##functionName = nullptr; + + #define DSOUND_FUNCTION_LOAD(functionName) \ + ds##functionName = (type##functionName) GetProcAddress (h, #functionName); \ + jassert (ds##functionName != nullptr); + + typedef BOOL (CALLBACK *LPDSENUMCALLBACKW) (LPGUID, LPCWSTR, LPCWSTR, LPVOID); + typedef BOOL (CALLBACK *LPDSENUMCALLBACKA) (LPGUID, LPCSTR, LPCSTR, LPVOID); + + DSOUND_FUNCTION (DirectSoundCreate, (const GUID*, IDirectSound**, LPUNKNOWN)) + DSOUND_FUNCTION (DirectSoundCaptureCreate, (const GUID*, IDirectSoundCapture**, LPUNKNOWN)) + DSOUND_FUNCTION (DirectSoundEnumerateW, (LPDSENUMCALLBACKW, LPVOID)) + DSOUND_FUNCTION (DirectSoundCaptureEnumerateW, (LPDSENUMCALLBACKW, LPVOID)) + + void initialiseDSoundFunctions() + { + if (dsDirectSoundCreate == nullptr) + { + HMODULE h = LoadLibraryA ("dsound.dll"); + + DSOUND_FUNCTION_LOAD (DirectSoundCreate) + DSOUND_FUNCTION_LOAD (DirectSoundCaptureCreate) + DSOUND_FUNCTION_LOAD (DirectSoundEnumerateW) + DSOUND_FUNCTION_LOAD (DirectSoundCaptureEnumerateW) + } + } + + // the overall size of buffer used is this value x the block size + enum { blocksPerOverallBuffer = 16 }; +} + +//============================================================================== +class DSoundInternalOutChannel +{ +public: + DSoundInternalOutChannel (const String& name_, const GUID& guid_, int rate, + int bufferSize, float* left, float* right) + : bitDepth (16), name (name_), guid (guid_), sampleRate (rate), + bufferSizeSamples (bufferSize), leftBuffer (left), rightBuffer (right), + pDirectSound (nullptr), pOutputBuffer (nullptr) + { + } + + ~DSoundInternalOutChannel() + { + close(); + } + + void close() + { + if (pOutputBuffer != nullptr) + { + JUCE_DS_LOG ("closing output: " + name); + HRESULT hr = pOutputBuffer->Stop(); + JUCE_DS_LOG_ERROR (hr); (void) hr; + + pOutputBuffer->Release(); + pOutputBuffer = nullptr; + } + + if (pDirectSound != nullptr) + { + pDirectSound->Release(); + pDirectSound = nullptr; + } + } + + String open() + { + JUCE_DS_LOG ("opening output: " + name + " rate=" + String (sampleRate) + + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); + + pDirectSound = nullptr; + pOutputBuffer = nullptr; + writeOffset = 0; + + String error; + HRESULT hr = E_NOINTERFACE; + + if (dsDirectSoundCreate != nullptr) + hr = dsDirectSoundCreate (&guid, &pDirectSound, nullptr); + + if (SUCCEEDED (hr)) + { + bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; + totalBytesPerBuffer = (blocksPerOverallBuffer * bytesPerBuffer) & ~15; + const int numChannels = 2; + + hr = pDirectSound->SetCooperativeLevel (GetDesktopWindow(), 2 /* DSSCL_PRIORITY */); + JUCE_DS_LOG_ERROR (hr); + + if (SUCCEEDED (hr)) + { + IDirectSoundBuffer* pPrimaryBuffer; + + DSBUFFERDESC primaryDesc = { 0 }; + primaryDesc.dwSize = sizeof (DSBUFFERDESC); + primaryDesc.dwFlags = 1 /* DSBCAPS_PRIMARYBUFFER */; + primaryDesc.dwBufferBytes = 0; + primaryDesc.lpwfxFormat = 0; + + JUCE_DS_LOG ("co-op level set"); + hr = pDirectSound->CreateSoundBuffer (&primaryDesc, &pPrimaryBuffer, 0); + JUCE_DS_LOG_ERROR (hr); + + if (SUCCEEDED (hr)) + { + WAVEFORMATEX wfFormat; + wfFormat.wFormatTag = WAVE_FORMAT_PCM; + wfFormat.nChannels = (unsigned short) numChannels; + wfFormat.nSamplesPerSec = (DWORD) sampleRate; + wfFormat.wBitsPerSample = (unsigned short) bitDepth; + wfFormat.nBlockAlign = (unsigned short) (wfFormat.nChannels * wfFormat.wBitsPerSample / 8); + wfFormat.nAvgBytesPerSec = wfFormat.nSamplesPerSec * wfFormat.nBlockAlign; + wfFormat.cbSize = 0; + + hr = pPrimaryBuffer->SetFormat (&wfFormat); + JUCE_DS_LOG_ERROR (hr); + + if (SUCCEEDED (hr)) + { + DSBUFFERDESC secondaryDesc = { 0 }; + secondaryDesc.dwSize = sizeof (DSBUFFERDESC); + secondaryDesc.dwFlags = 0x8000 /* DSBCAPS_GLOBALFOCUS */ + | 0x10000 /* DSBCAPS_GETCURRENTPOSITION2 */; + secondaryDesc.dwBufferBytes = (DWORD) totalBytesPerBuffer; + secondaryDesc.lpwfxFormat = &wfFormat; + + hr = pDirectSound->CreateSoundBuffer (&secondaryDesc, &pOutputBuffer, 0); + JUCE_DS_LOG_ERROR (hr); + + if (SUCCEEDED (hr)) + { + JUCE_DS_LOG ("buffer created"); + + DWORD dwDataLen; + unsigned char* pDSBuffData; + + hr = pOutputBuffer->Lock (0, (DWORD) totalBytesPerBuffer, + (LPVOID*) &pDSBuffData, &dwDataLen, 0, 0, 0); + JUCE_DS_LOG_ERROR (hr); + + if (SUCCEEDED (hr)) + { + zeromem (pDSBuffData, dwDataLen); + + hr = pOutputBuffer->Unlock (pDSBuffData, dwDataLen, 0, 0); + + if (SUCCEEDED (hr)) + { + hr = pOutputBuffer->SetCurrentPosition (0); + + if (SUCCEEDED (hr)) + { + hr = pOutputBuffer->Play (0, 0, 1 /* DSBPLAY_LOOPING */); + + if (SUCCEEDED (hr)) + return String::empty; + } + } + } + } + } + } + } + } + + error = DSoundLogging::getErrorMessage (hr); + close(); + return error; + } + + void synchronisePosition() + { + if (pOutputBuffer != nullptr) + { + DWORD playCursor; + pOutputBuffer->GetCurrentPosition (&playCursor, &writeOffset); + } + } + + bool service() + { + if (pOutputBuffer == 0) + return true; + + DWORD playCursor, writeCursor; + + for (;;) + { + HRESULT hr = pOutputBuffer->GetCurrentPosition (&playCursor, &writeCursor); + + if (hr == MAKE_HRESULT (1, 0x878, 150)) // DSERR_BUFFERLOST + { + pOutputBuffer->Restore(); + continue; + } + + if (SUCCEEDED (hr)) + break; + + JUCE_DS_LOG_ERROR (hr); + jassertfalse; + return true; + } + + int playWriteGap = (int) (writeCursor - playCursor); + if (playWriteGap < 0) + playWriteGap += totalBytesPerBuffer; + + int bytesEmpty = (int) (playCursor - writeOffset); + if (bytesEmpty < 0) + bytesEmpty += totalBytesPerBuffer; + + if (bytesEmpty > (totalBytesPerBuffer - playWriteGap)) + { + writeOffset = writeCursor; + bytesEmpty = totalBytesPerBuffer - playWriteGap; + } + + if (bytesEmpty >= bytesPerBuffer) + { + int* buf1 = nullptr; + int* buf2 = nullptr; + DWORD dwSize1 = 0; + DWORD dwSize2 = 0; + + HRESULT hr = pOutputBuffer->Lock (writeOffset, (DWORD) bytesPerBuffer, + (void**) &buf1, &dwSize1, + (void**) &buf2, &dwSize2, 0); + + if (hr == MAKE_HRESULT (1, 0x878, 150)) // DSERR_BUFFERLOST + { + pOutputBuffer->Restore(); + + hr = pOutputBuffer->Lock (writeOffset, (DWORD) bytesPerBuffer, + (void**) &buf1, &dwSize1, + (void**) &buf2, &dwSize2, 0); + } + + if (SUCCEEDED (hr)) + { + if (bitDepth == 16) + { + const float* left = leftBuffer; + const float* right = rightBuffer; + int samples1 = (int) (dwSize1 >> 2); + int samples2 = (int) (dwSize2 >> 2); + + if (left == nullptr) + { + for (int* dest = buf1; --samples1 >= 0;) *dest++ = convertInputValues (0, *right++); + for (int* dest = buf2; --samples2 >= 0;) *dest++ = convertInputValues (0, *right++); + } + else if (right == nullptr) + { + for (int* dest = buf1; --samples1 >= 0;) *dest++ = convertInputValues (*left++, 0); + for (int* dest = buf2; --samples2 >= 0;) *dest++ = convertInputValues (*left++, 0); + } + else + { + for (int* dest = buf1; --samples1 >= 0;) *dest++ = convertInputValues (*left++, *right++); + for (int* dest = buf2; --samples2 >= 0;) *dest++ = convertInputValues (*left++, *right++); + } + } + else + { + jassertfalse; + } + + writeOffset = (writeOffset + dwSize1 + dwSize2) % totalBytesPerBuffer; + + pOutputBuffer->Unlock (buf1, dwSize1, buf2, dwSize2); + } + else + { + jassertfalse; + JUCE_DS_LOG_ERROR (hr); + } + + bytesEmpty -= bytesPerBuffer; + return true; + } + else + { + return false; + } + } + + int bitDepth; + bool doneFlag; + +private: + String name; + GUID guid; + int sampleRate, bufferSizeSamples; + float* leftBuffer; + float* rightBuffer; + + IDirectSound* pDirectSound; + IDirectSoundBuffer* pOutputBuffer; + DWORD writeOffset; + int totalBytesPerBuffer, bytesPerBuffer; + unsigned int lastPlayCursor; + + static inline int convertInputValues (const float l, const float r) noexcept + { + return jlimit (-32768, 32767, roundToInt (32767.0f * r)) << 16 + | (0xffff & jlimit (-32768, 32767, roundToInt (32767.0f * l))); + } + + JUCE_DECLARE_NON_COPYABLE (DSoundInternalOutChannel) +}; + +//============================================================================== +struct DSoundInternalInChannel +{ +public: + DSoundInternalInChannel (const String& name_, const GUID& guid_, int rate, + int bufferSize, float* left, float* right) + : bitDepth (16), name (name_), guid (guid_), sampleRate (rate), + bufferSizeSamples (bufferSize), leftBuffer (left), rightBuffer (right), + pDirectSound (nullptr), pDirectSoundCapture (nullptr), pInputBuffer (nullptr) + { + } + + ~DSoundInternalInChannel() + { + close(); + } + + void close() + { + if (pInputBuffer != nullptr) + { + JUCE_DS_LOG ("closing input: " + name); + HRESULT hr = pInputBuffer->Stop(); + JUCE_DS_LOG_ERROR (hr); (void) hr; + + pInputBuffer->Release(); + pInputBuffer = nullptr; + } + + if (pDirectSoundCapture != nullptr) + { + pDirectSoundCapture->Release(); + pDirectSoundCapture = nullptr; + } + + if (pDirectSound != nullptr) + { + pDirectSound->Release(); + pDirectSound = nullptr; + } + } + + String open() + { + JUCE_DS_LOG ("opening input: " + name + + " rate=" + String (sampleRate) + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); + + pDirectSound = nullptr; + pDirectSoundCapture = nullptr; + pInputBuffer = nullptr; + readOffset = 0; + totalBytesPerBuffer = 0; + + HRESULT hr = dsDirectSoundCaptureCreate != nullptr + ? dsDirectSoundCaptureCreate (&guid, &pDirectSoundCapture, nullptr) + : E_NOINTERFACE; + + if (SUCCEEDED (hr)) + { + const int numChannels = 2; + bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; + totalBytesPerBuffer = (blocksPerOverallBuffer * bytesPerBuffer) & ~15; + + WAVEFORMATEX wfFormat; + wfFormat.wFormatTag = WAVE_FORMAT_PCM; + wfFormat.nChannels = (unsigned short)numChannels; + wfFormat.nSamplesPerSec = (DWORD) sampleRate; + wfFormat.wBitsPerSample = (unsigned short) bitDepth; + wfFormat.nBlockAlign = (unsigned short) (wfFormat.nChannels * (wfFormat.wBitsPerSample / 8)); + wfFormat.nAvgBytesPerSec = wfFormat.nSamplesPerSec * wfFormat.nBlockAlign; + wfFormat.cbSize = 0; + + DSCBUFFERDESC captureDesc = { 0 }; + captureDesc.dwSize = sizeof (DSCBUFFERDESC); + captureDesc.dwFlags = 0; + captureDesc.dwBufferBytes = (DWORD) totalBytesPerBuffer; + captureDesc.lpwfxFormat = &wfFormat; + + JUCE_DS_LOG ("object created"); + hr = pDirectSoundCapture->CreateCaptureBuffer (&captureDesc, &pInputBuffer, 0); + + if (SUCCEEDED (hr)) + { + hr = pInputBuffer->Start (1 /* DSCBSTART_LOOPING */); + + if (SUCCEEDED (hr)) + return String::empty; + } + } + + JUCE_DS_LOG_ERROR (hr); + const String error (DSoundLogging::getErrorMessage (hr)); + close(); + + return error; + } + + void synchronisePosition() + { + if (pInputBuffer != nullptr) + { + DWORD capturePos; + pInputBuffer->GetCurrentPosition (&capturePos, (DWORD*) &readOffset); + } + } + + bool service() + { + if (pInputBuffer == 0) + return true; + + DWORD capturePos, readPos; + HRESULT hr = pInputBuffer->GetCurrentPosition (&capturePos, &readPos); + JUCE_DS_LOG_ERROR (hr); + + if (FAILED (hr)) + return true; + + int bytesFilled = (int) (readPos - readOffset); + if (bytesFilled < 0) + bytesFilled += totalBytesPerBuffer; + + if (bytesFilled >= bytesPerBuffer) + { + short* buf1 = nullptr; + short* buf2 = nullptr; + DWORD dwsize1 = 0; + DWORD dwsize2 = 0; + + HRESULT hr = pInputBuffer->Lock ((DWORD) readOffset, (DWORD) bytesPerBuffer, + (void**) &buf1, &dwsize1, + (void**) &buf2, &dwsize2, 0); + + if (SUCCEEDED (hr)) + { + if (bitDepth == 16) + { + const float g = 1.0f / 32768.0f; + + float* destL = leftBuffer; + float* destR = rightBuffer; + int samples1 = (int) (dwsize1 >> 2); + int samples2 = (int) (dwsize2 >> 2); + + if (destL == nullptr) + { + for (const short* src = buf1; --samples1 >= 0;) { ++src; *destR++ = *src++ * g; } + for (const short* src = buf2; --samples2 >= 0;) { ++src; *destR++ = *src++ * g; } + } + else if (destR == nullptr) + { + for (const short* src = buf1; --samples1 >= 0;) { *destL++ = *src++ * g; ++src; } + for (const short* src = buf2; --samples2 >= 0;) { *destL++ = *src++ * g; ++src; } + } + else + { + for (const short* src = buf1; --samples1 >= 0;) { *destL++ = *src++ * g; *destR++ = *src++ * g; } + for (const short* src = buf2; --samples2 >= 0;) { *destL++ = *src++ * g; *destR++ = *src++ * g; } + } + } + else + { + jassertfalse; + } + + readOffset = (readOffset + dwsize1 + dwsize2) % totalBytesPerBuffer; + + pInputBuffer->Unlock (buf1, dwsize1, buf2, dwsize2); + } + else + { + JUCE_DS_LOG_ERROR (hr); + jassertfalse; + } + + bytesFilled -= bytesPerBuffer; + + return true; + } + else + { + return false; + } + } + + unsigned int readOffset; + int bytesPerBuffer, totalBytesPerBuffer; + int bitDepth; + bool doneFlag; + +private: + String name; + GUID guid; + int sampleRate, bufferSizeSamples; + float* leftBuffer; + float* rightBuffer; + + IDirectSound* pDirectSound; + IDirectSoundCapture* pDirectSoundCapture; + IDirectSoundCaptureBuffer* pInputBuffer; + + JUCE_DECLARE_NON_COPYABLE (DSoundInternalInChannel) +}; + +//============================================================================== +class DSoundAudioIODevice : public AudioIODevice, + public Thread +{ +public: + DSoundAudioIODevice (const String& deviceName, + const int outputDeviceIndex_, + const int inputDeviceIndex_) + : AudioIODevice (deviceName, "DirectSound"), + Thread ("Juce DSound"), + outputDeviceIndex (outputDeviceIndex_), + inputDeviceIndex (inputDeviceIndex_), + isOpen_ (false), + isStarted (false), + bufferSizeSamples (0), + sampleRate (0.0), + callback (nullptr) + { + if (outputDeviceIndex_ >= 0) + { + outChannels.add (TRANS("Left")); + outChannels.add (TRANS("Right")); + } + + if (inputDeviceIndex_ >= 0) + { + inChannels.add (TRANS("Left")); + inChannels.add (TRANS("Right")); + } + } + + ~DSoundAudioIODevice() + { + close(); + } + + String open (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate, int bufferSizeSamples) override + { + lastError = openDevice (inputChannels, outputChannels, sampleRate, bufferSizeSamples); + isOpen_ = lastError.isEmpty(); + + return lastError; + } + + void close() override + { + stop(); + + if (isOpen_) + { + closeDevice(); + isOpen_ = false; + } + } + + bool isOpen() override { return isOpen_ && isThreadRunning(); } + int getCurrentBufferSizeSamples() override { return bufferSizeSamples; } + double getCurrentSampleRate() override { return sampleRate; } + BigInteger getActiveOutputChannels() const override { return enabledOutputs; } + BigInteger getActiveInputChannels() const override { return enabledInputs; } + int getOutputLatencyInSamples() override { return (int) (getCurrentBufferSizeSamples() * 1.5); } + int getInputLatencyInSamples() override { return getOutputLatencyInSamples(); } + StringArray getOutputChannelNames() override { return outChannels; } + StringArray getInputChannelNames() override { return inChannels; } + + Array getAvailableSampleRates() override + { + static const double rates[] = { 44100.0, 48000.0, 88200.0, 96000.0 }; + return Array (rates, numElementsInArray (rates)); + } + + Array getAvailableBufferSizes() override + { + Array r; + int n = 64; + + for (int i = 0; i < 50; ++i) + { + r.add (n); + n += (n < 512) ? 32 + : ((n < 1024) ? 64 + : ((n < 2048) ? 128 : 256)); + } + + return r; + } + + int getDefaultBufferSize() override { return 2560; } + + int getCurrentBitDepth() override + { + int bits = 256; + + for (int i = inChans.size(); --i >= 0;) + bits = jmin (bits, inChans[i]->bitDepth); + + for (int i = outChans.size(); --i >= 0;) + bits = jmin (bits, outChans[i]->bitDepth); + + if (bits > 32) + bits = 16; + + return bits; + } + + void start (AudioIODeviceCallback* call) override + { + if (isOpen_ && call != nullptr && ! isStarted) + { + if (! isThreadRunning()) + { + // something gone wrong and the thread's stopped.. + isOpen_ = false; + return; + } + + call->audioDeviceAboutToStart (this); + + const ScopedLock sl (startStopLock); + callback = call; + isStarted = true; + } + } + + void stop() override + { + if (isStarted) + { + AudioIODeviceCallback* const callbackLocal = callback; + + { + const ScopedLock sl (startStopLock); + isStarted = false; + } + + if (callbackLocal != nullptr) + callbackLocal->audioDeviceStopped(); + } + } + + bool isPlaying() override { return isStarted && isOpen_ && isThreadRunning(); } + String getLastError() override { return lastError; } + + //============================================================================== + StringArray inChannels, outChannels; + int outputDeviceIndex, inputDeviceIndex; + +private: + bool isOpen_; + bool isStarted; + String lastError; + + OwnedArray inChans; + OwnedArray outChans; + WaitableEvent startEvent; + + int bufferSizeSamples; + double sampleRate; + BigInteger enabledInputs, enabledOutputs; + AudioSampleBuffer inputBuffers, outputBuffers; + + AudioIODeviceCallback* callback; + CriticalSection startStopLock; + + String openDevice (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate_, int bufferSizeSamples_); + + void closeDevice() + { + isStarted = false; + stopThread (5000); + + inChans.clear(); + outChans.clear(); + inputBuffers.setSize (1, 1); + outputBuffers.setSize (1, 1); + } + + void resync() + { + if (! threadShouldExit()) + { + sleep (5); + + for (int i = 0; i < outChans.size(); ++i) + outChans.getUnchecked(i)->synchronisePosition(); + + for (int i = 0; i < inChans.size(); ++i) + inChans.getUnchecked(i)->synchronisePosition(); + } + } + +public: + void run() override + { + while (! threadShouldExit()) + { + if (wait (100)) + break; + } + + const int latencyMs = (int) (bufferSizeSamples * 1000.0 / sampleRate); + const int maxTimeMS = jmax (5, 3 * latencyMs); + + while (! threadShouldExit()) + { + int numToDo = 0; + uint32 startTime = Time::getMillisecondCounter(); + + for (int i = inChans.size(); --i >= 0;) + { + inChans.getUnchecked(i)->doneFlag = false; + ++numToDo; + } + + for (int i = outChans.size(); --i >= 0;) + { + outChans.getUnchecked(i)->doneFlag = false; + ++numToDo; + } + + if (numToDo > 0) + { + const int maxCount = 3; + int count = maxCount; + + for (;;) + { + for (int i = inChans.size(); --i >= 0;) + { + DSoundInternalInChannel* const in = inChans.getUnchecked(i); + + if ((! in->doneFlag) && in->service()) + { + in->doneFlag = true; + --numToDo; + } + } + + for (int i = outChans.size(); --i >= 0;) + { + DSoundInternalOutChannel* const out = outChans.getUnchecked(i); + + if ((! out->doneFlag) && out->service()) + { + out->doneFlag = true; + --numToDo; + } + } + + if (numToDo <= 0) + break; + + if (Time::getMillisecondCounter() > startTime + maxTimeMS) + { + resync(); + break; + } + + if (--count <= 0) + { + Sleep (1); + count = maxCount; + } + + if (threadShouldExit()) + return; + } + } + else + { + sleep (1); + } + + const ScopedLock sl (startStopLock); + + if (isStarted) + { + callback->audioDeviceIOCallback (inputBuffers.getArrayOfReadPointers(), inputBuffers.getNumChannels(), + outputBuffers.getArrayOfWritePointers(), outputBuffers.getNumChannels(), + bufferSizeSamples); + } + else + { + outputBuffers.clear(); + sleep (1); + } + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSoundAudioIODevice) +}; + +//============================================================================== +struct DSoundDeviceList +{ + StringArray outputDeviceNames, inputDeviceNames; + Array outputGuids, inputGuids; + + void scan() + { + outputDeviceNames.clear(); + inputDeviceNames.clear(); + outputGuids.clear(); + inputGuids.clear(); + + if (dsDirectSoundEnumerateW != 0) + { + dsDirectSoundEnumerateW (outputEnumProcW, this); + dsDirectSoundCaptureEnumerateW (inputEnumProcW, this); + } + } + + bool operator!= (const DSoundDeviceList& other) const noexcept + { + return outputDeviceNames != other.outputDeviceNames + || inputDeviceNames != other.inputDeviceNames + || outputGuids != other.outputGuids + || inputGuids != other.inputGuids; + } + +private: + static BOOL enumProc (LPGUID lpGUID, String desc, StringArray& names, Array& guids) + { + desc = desc.trim(); + + if (desc.isNotEmpty()) + { + const String origDesc (desc); + + int n = 2; + while (names.contains (desc)) + desc = origDesc + " (" + String (n++) + ")"; + + names.add (desc); + guids.add (lpGUID != nullptr ? *lpGUID : GUID()); + } + + return TRUE; + } + + BOOL outputEnumProc (LPGUID guid, LPCWSTR desc) { return enumProc (guid, desc, outputDeviceNames, outputGuids); } + BOOL inputEnumProc (LPGUID guid, LPCWSTR desc) { return enumProc (guid, desc, inputDeviceNames, inputGuids); } + + static BOOL CALLBACK outputEnumProcW (LPGUID lpGUID, LPCWSTR description, LPCWSTR, LPVOID object) + { + return static_cast (object)->outputEnumProc (lpGUID, description); + } + + static BOOL CALLBACK inputEnumProcW (LPGUID lpGUID, LPCWSTR description, LPCWSTR, LPVOID object) + { + return static_cast (object)->inputEnumProc (lpGUID, description); + } +}; + +//============================================================================== +String DSoundAudioIODevice::openDevice (const BigInteger& inputChannels, + const BigInteger& outputChannels, + double sampleRate_, int bufferSizeSamples_) +{ + closeDevice(); + + sampleRate = sampleRate_; + + if (bufferSizeSamples_ <= 0) + bufferSizeSamples_ = 960; // use as a default size if none is set. + + bufferSizeSamples = bufferSizeSamples_ & ~7; + + DSoundDeviceList dlh; + dlh.scan(); + + enabledInputs = inputChannels; + enabledInputs.setRange (inChannels.size(), + enabledInputs.getHighestBit() + 1 - inChannels.size(), + false); + + inputBuffers.setSize (jmax (1, enabledInputs.countNumberOfSetBits()), bufferSizeSamples); + inputBuffers.clear(); + int numIns = 0; + + for (int i = 0; i <= enabledInputs.getHighestBit(); i += 2) + { + float* left = enabledInputs[i] ? inputBuffers.getWritePointer (numIns++) : nullptr; + float* right = enabledInputs[i + 1] ? inputBuffers.getWritePointer (numIns++) : nullptr; + + if (left != nullptr || right != nullptr) + inChans.add (new DSoundInternalInChannel (dlh.inputDeviceNames [inputDeviceIndex], + dlh.inputGuids [inputDeviceIndex], + (int) sampleRate, bufferSizeSamples, + left, right)); + } + + enabledOutputs = outputChannels; + enabledOutputs.setRange (outChannels.size(), + enabledOutputs.getHighestBit() + 1 - outChannels.size(), + false); + + outputBuffers.setSize (jmax (1, enabledOutputs.countNumberOfSetBits()), bufferSizeSamples); + outputBuffers.clear(); + int numOuts = 0; + + for (int i = 0; i <= enabledOutputs.getHighestBit(); i += 2) + { + float* left = enabledOutputs[i] ? outputBuffers.getWritePointer (numOuts++) : nullptr; + float* right = enabledOutputs[i + 1] ? outputBuffers.getWritePointer (numOuts++) : nullptr; + + if (left != nullptr || right != nullptr) + outChans.add (new DSoundInternalOutChannel (dlh.outputDeviceNames[outputDeviceIndex], + dlh.outputGuids [outputDeviceIndex], + (int) sampleRate, bufferSizeSamples, + left, right)); + } + + String error; + + // boost our priority while opening the devices to try to get better sync between them + const int oldThreadPri = GetThreadPriority (GetCurrentThread()); + const DWORD oldProcPri = GetPriorityClass (GetCurrentProcess()); + SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); + SetPriorityClass (GetCurrentProcess(), REALTIME_PRIORITY_CLASS); + + for (int i = 0; i < outChans.size(); ++i) + { + error = outChans[i]->open(); + + if (error.isNotEmpty()) + { + error = "Error opening " + dlh.outputDeviceNames[i] + ": \"" + error + "\""; + break; + } + } + + if (error.isEmpty()) + { + for (int i = 0; i < inChans.size(); ++i) + { + error = inChans[i]->open(); + + if (error.isNotEmpty()) + { + error = "Error opening " + dlh.inputDeviceNames[i] + ": \"" + error + "\""; + break; + } + } + } + + if (error.isEmpty()) + { + for (int i = 0; i < outChans.size(); ++i) + outChans.getUnchecked(i)->synchronisePosition(); + + for (int i = 0; i < inChans.size(); ++i) + inChans.getUnchecked(i)->synchronisePosition(); + + startThread (9); + sleep (10); + + notify(); + } + else + { + JUCE_DS_LOG ("Opening failed: " + error); + } + + SetThreadPriority (GetCurrentThread(), oldThreadPri); + SetPriorityClass (GetCurrentProcess(), oldProcPri); + + return error; +} + +//============================================================================== +class DSoundAudioIODeviceType : public AudioIODeviceType, + private DeviceChangeDetector +{ +public: + DSoundAudioIODeviceType() + : AudioIODeviceType ("DirectSound"), + DeviceChangeDetector (L"DirectSound"), + hasScanned (false) + { + initialiseDSoundFunctions(); + } + + void scanForDevices() + { + hasScanned = true; + deviceList.scan(); + } + + StringArray getDeviceNames (bool wantInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return wantInputNames ? deviceList.inputDeviceNames + : deviceList.outputDeviceNames; + } + + int getDefaultDeviceIndex (bool /*forInput*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + return 0; + } + + int getIndexOfDevice (AudioIODevice* device, bool asInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + if (DSoundAudioIODevice* const d = dynamic_cast (device)) + return asInput ? d->inputDeviceIndex + : d->outputDeviceIndex; + + return -1; + } + + bool hasSeparateInputsAndOutputs() const { return true; } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int outputIndex = deviceList.outputDeviceNames.indexOf (outputDeviceName); + const int inputIndex = deviceList.inputDeviceNames.indexOf (inputDeviceName); + + if (outputIndex >= 0 || inputIndex >= 0) + return new DSoundAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName, + outputIndex, inputIndex); + + return nullptr; + } + +private: + DSoundDeviceList deviceList; + bool hasScanned; + + void systemDeviceChanged() override + { + DSoundDeviceList newList; + newList.scan(); + + if (newList != deviceList) + { + deviceList = newList; + callDeviceChangeListeners(); + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSoundAudioIODeviceType) +}; + +//============================================================================== +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound() +{ + return new DSoundAudioIODeviceType(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp new file mode 100644 index 0000000000..2737b1e669 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp @@ -0,0 +1,489 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +class MidiInCollector +{ +public: + MidiInCollector (MidiInput* const input_, + MidiInputCallback& callback_) + : deviceHandle (0), + input (input_), + callback (callback_), + concatenator (4096), + isStarted (false), + startTime (0) + { + } + + ~MidiInCollector() + { + stop(); + + if (deviceHandle != 0) + { + for (int count = 5; --count >= 0;) + { + if (midiInClose (deviceHandle) == MMSYSERR_NOERROR) + break; + + Sleep (20); + } + } + } + + //============================================================================== + void handleMessage (const uint8* bytes, const uint32 timeStamp) + { + if (bytes[0] >= 0x80 && isStarted) + { + concatenator.pushMidiData (bytes, MidiMessage::getMessageLengthFromFirstByte (bytes[0]), + convertTimeStamp (timeStamp), input, callback); + writeFinishedBlocks(); + } + } + + void handleSysEx (MIDIHDR* const hdr, const uint32 timeStamp) + { + if (isStarted && hdr->dwBytesRecorded > 0) + { + concatenator.pushMidiData (hdr->lpData, (int) hdr->dwBytesRecorded, + convertTimeStamp (timeStamp), input, callback); + writeFinishedBlocks(); + } + } + + void start() + { + if (deviceHandle != 0 && ! isStarted) + { + activeMidiCollectors.addIfNotAlreadyThere (this); + + for (int i = 0; i < (int) numHeaders; ++i) + { + headers[i].prepare (deviceHandle); + headers[i].write (deviceHandle); + } + + startTime = Time::getMillisecondCounterHiRes(); + MMRESULT res = midiInStart (deviceHandle); + + if (res == MMSYSERR_NOERROR) + { + concatenator.reset(); + isStarted = true; + } + else + { + unprepareAllHeaders(); + } + } + } + + void stop() + { + if (isStarted) + { + isStarted = false; + midiInReset (deviceHandle); + midiInStop (deviceHandle); + activeMidiCollectors.removeFirstMatchingValue (this); + unprepareAllHeaders(); + concatenator.reset(); + } + } + + static void CALLBACK midiInCallback (HMIDIIN, UINT uMsg, DWORD_PTR dwInstance, + DWORD_PTR midiMessage, DWORD_PTR timeStamp) + { + MidiInCollector* const collector = reinterpret_cast (dwInstance); + + if (activeMidiCollectors.contains (collector)) + { + if (uMsg == MIM_DATA) + collector->handleMessage ((const uint8*) &midiMessage, (uint32) timeStamp); + else if (uMsg == MIM_LONGDATA) + collector->handleSysEx ((MIDIHDR*) midiMessage, (uint32) timeStamp); + } + } + + HMIDIIN deviceHandle; + +private: + static Array activeMidiCollectors; + + MidiInput* input; + MidiInputCallback& callback; + MidiDataConcatenator concatenator; + bool volatile isStarted; + double startTime; + + class MidiHeader + { + public: + MidiHeader() {} + + void prepare (HMIDIIN deviceHandle) + { + zerostruct (hdr); + hdr.lpData = data; + hdr.dwBufferLength = (DWORD) numElementsInArray (data); + + midiInPrepareHeader (deviceHandle, &hdr, sizeof (hdr)); + } + + void unprepare (HMIDIIN deviceHandle) + { + if ((hdr.dwFlags & WHDR_DONE) != 0) + { + int c = 10; + while (--c >= 0 && midiInUnprepareHeader (deviceHandle, &hdr, sizeof (hdr)) == MIDIERR_STILLPLAYING) + Thread::sleep (20); + + jassert (c >= 0); + } + } + + void write (HMIDIIN deviceHandle) + { + hdr.dwBytesRecorded = 0; + midiInAddBuffer (deviceHandle, &hdr, sizeof (hdr)); + } + + void writeIfFinished (HMIDIIN deviceHandle) + { + if ((hdr.dwFlags & WHDR_DONE) != 0) + write (deviceHandle); + } + + private: + MIDIHDR hdr; + char data [256]; + + JUCE_DECLARE_NON_COPYABLE (MidiHeader) + }; + + enum { numHeaders = 32 }; + MidiHeader headers [numHeaders]; + + void writeFinishedBlocks() + { + for (int i = 0; i < (int) numHeaders; ++i) + headers[i].writeIfFinished (deviceHandle); + } + + void unprepareAllHeaders() + { + for (int i = 0; i < (int) numHeaders; ++i) + headers[i].unprepare (deviceHandle); + } + + double convertTimeStamp (uint32 timeStamp) + { + double t = startTime + timeStamp; + + const double now = Time::getMillisecondCounterHiRes(); + if (t > now) + { + if (t > now + 2.0) + startTime -= 1.0; + + t = now; + } + + return t * 0.001; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInCollector) +}; + +Array MidiInCollector::activeMidiCollectors; + + +//============================================================================== +StringArray MidiInput::getDevices() +{ + StringArray s; + const UINT num = midiInGetNumDevs(); + + for (UINT i = 0; i < num; ++i) + { + MIDIINCAPS mc = { 0 }; + + if (midiInGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + s.add (String (mc.szPname, sizeof (mc.szPname))); + } + + return s; +} + +int MidiInput::getDefaultDeviceIndex() +{ + return 0; +} + +MidiInput* MidiInput::openDevice (const int index, MidiInputCallback* const callback) +{ + if (callback == nullptr) + return nullptr; + + UINT deviceId = MIDI_MAPPER; + int n = 0; + String name; + + const UINT num = midiInGetNumDevs(); + + for (UINT i = 0; i < num; ++i) + { + MIDIINCAPS mc = { 0 }; + + if (midiInGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + { + if (index == n) + { + deviceId = i; + name = String (mc.szPname, (size_t) numElementsInArray (mc.szPname)); + break; + } + + ++n; + } + } + + ScopedPointer in (new MidiInput (name)); + ScopedPointer collector (new MidiInCollector (in, *callback)); + + HMIDIIN h; + MMRESULT err = midiInOpen (&h, deviceId, + (DWORD_PTR) &MidiInCollector::midiInCallback, + (DWORD_PTR) (MidiInCollector*) collector, + CALLBACK_FUNCTION); + + if (err == MMSYSERR_NOERROR) + { + collector->deviceHandle = h; + in->internal = collector.release(); + return in.release(); + } + + return nullptr; +} + +MidiInput::MidiInput (const String& name_) + : name (name_), + internal (0) +{ +} + +MidiInput::~MidiInput() +{ + delete static_cast (internal); +} + +void MidiInput::start() { static_cast (internal)->start(); } +void MidiInput::stop() { static_cast (internal)->stop(); } + + +//============================================================================== +struct MidiOutHandle +{ + int refCount; + UINT deviceId; + HMIDIOUT handle; + + static Array activeHandles; + +private: + JUCE_LEAK_DETECTOR (MidiOutHandle) +}; + +Array MidiOutHandle::activeHandles; + +//============================================================================== +StringArray MidiOutput::getDevices() +{ + StringArray s; + const UINT num = midiOutGetNumDevs(); + + for (UINT i = 0; i < num; ++i) + { + MIDIOUTCAPS mc = { 0 }; + + if (midiOutGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + s.add (String (mc.szPname, sizeof (mc.szPname))); + } + + return s; +} + +int MidiOutput::getDefaultDeviceIndex() +{ + const UINT num = midiOutGetNumDevs(); + int n = 0; + + for (UINT i = 0; i < num; ++i) + { + MIDIOUTCAPS mc = { 0 }; + + if (midiOutGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + { + if ((mc.wTechnology & MOD_MAPPER) != 0) + return n; + + ++n; + } + } + + return 0; +} + +MidiOutput* MidiOutput::openDevice (int index) +{ + UINT deviceId = MIDI_MAPPER; + const UINT num = midiOutGetNumDevs(); + int n = 0; + + for (UINT i = 0; i < num; ++i) + { + MIDIOUTCAPS mc = { 0 }; + + if (midiOutGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + { + // use the microsoft sw synth as a default - best not to allow deviceId + // to be MIDI_MAPPER, or else device sharing breaks + if (String (mc.szPname, sizeof (mc.szPname)).containsIgnoreCase ("microsoft")) + deviceId = i; + + if (index == n) + { + deviceId = i; + break; + } + + ++n; + } + } + + for (int i = MidiOutHandle::activeHandles.size(); --i >= 0;) + { + MidiOutHandle* const han = MidiOutHandle::activeHandles.getUnchecked(i); + + if (han->deviceId == deviceId) + { + han->refCount++; + + MidiOutput* const out = new MidiOutput(); + out->internal = han; + return out; + } + } + + for (int i = 4; --i >= 0;) + { + HMIDIOUT h = 0; + MMRESULT res = midiOutOpen (&h, deviceId, 0, 0, CALLBACK_NULL); + + if (res == MMSYSERR_NOERROR) + { + MidiOutHandle* const han = new MidiOutHandle(); + han->deviceId = deviceId; + han->refCount = 1; + han->handle = h; + MidiOutHandle::activeHandles.add (han); + + MidiOutput* const out = new MidiOutput(); + out->internal = han; + return out; + } + else if (res == MMSYSERR_ALLOCATED) + { + Sleep (100); + } + else + { + break; + } + } + + return nullptr; +} + +MidiOutput::~MidiOutput() +{ + stopBackgroundThread(); + + MidiOutHandle* const h = static_cast (internal); + + if (MidiOutHandle::activeHandles.contains (h) && --(h->refCount) == 0) + { + midiOutClose (h->handle); + MidiOutHandle::activeHandles.removeFirstMatchingValue (h); + delete h; + } +} + +void MidiOutput::sendMessageNow (const MidiMessage& message) +{ + const MidiOutHandle* const handle = static_cast (internal); + + if (message.getRawDataSize() > 3 || message.isSysEx()) + { + MIDIHDR h = { 0 }; + + h.lpData = (char*) message.getRawData(); + h.dwBytesRecorded = h.dwBufferLength = (DWORD) message.getRawDataSize(); + + if (midiOutPrepareHeader (handle->handle, &h, sizeof (MIDIHDR)) == MMSYSERR_NOERROR) + { + MMRESULT res = midiOutLongMsg (handle->handle, &h, sizeof (MIDIHDR)); + + if (res == MMSYSERR_NOERROR) + { + while ((h.dwFlags & MHDR_DONE) == 0) + Sleep (1); + + int count = 500; // 1 sec timeout + + while (--count >= 0) + { + res = midiOutUnprepareHeader (handle->handle, &h, sizeof (MIDIHDR)); + + if (res == MIDIERR_STILLPLAYING) + Sleep (2); + else + break; + } + } + } + } + else + { + for (int i = 0; i < 50; ++i) + { + if (midiOutShortMsg (handle->handle, *(unsigned int*) message.getRawData()) != MIDIERR_NOTREADY) + break; + + Sleep (1); + } + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp new file mode 100644 index 0000000000..0ef7811d45 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp @@ -0,0 +1,1509 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_WASAPI_LOGGING + #define JUCE_WASAPI_LOGGING 0 +#endif + +//============================================================================== +namespace WasapiClasses +{ + +void logFailure (HRESULT hr) +{ + (void) hr; + jassert (hr != (HRESULT) 0x800401f0); // If you hit this, it means you're trying to call from + // a thread which hasn't been initialised with CoInitialize(). + + #if JUCE_WASAPI_LOGGING + if (FAILED (hr)) + { + const char* m = nullptr; + + switch (hr) + { + case E_POINTER: m = "E_POINTER"; break; + case E_INVALIDARG: m = "E_INVALIDARG"; break; + + #define JUCE_WASAPI_ERR(desc, n) \ + case MAKE_HRESULT(1, 0x889, n): m = #desc; break; + + JUCE_WASAPI_ERR (AUDCLNT_E_NOT_INITIALIZED, 0x001) + JUCE_WASAPI_ERR (AUDCLNT_E_ALREADY_INITIALIZED, 0x002) + JUCE_WASAPI_ERR (AUDCLNT_E_WRONG_ENDPOINT_TYPE, 0x003) + JUCE_WASAPI_ERR (AUDCLNT_E_DEVICE_INVALIDATED, 0x004) + JUCE_WASAPI_ERR (AUDCLNT_E_NOT_STOPPED, 0x005) + JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_TOO_LARGE, 0x006) + JUCE_WASAPI_ERR (AUDCLNT_E_OUT_OF_ORDER, 0x007) + JUCE_WASAPI_ERR (AUDCLNT_E_UNSUPPORTED_FORMAT, 0x008) + JUCE_WASAPI_ERR (AUDCLNT_E_INVALID_SIZE, 0x009) + JUCE_WASAPI_ERR (AUDCLNT_E_DEVICE_IN_USE, 0x00a) + JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_OPERATION_PENDING, 0x00b) + JUCE_WASAPI_ERR (AUDCLNT_E_THREAD_NOT_REGISTERED, 0x00c) + JUCE_WASAPI_ERR (AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED, 0x00e) + JUCE_WASAPI_ERR (AUDCLNT_E_ENDPOINT_CREATE_FAILED, 0x00f) + JUCE_WASAPI_ERR (AUDCLNT_E_SERVICE_NOT_RUNNING, 0x010) + JUCE_WASAPI_ERR (AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED, 0x011) + JUCE_WASAPI_ERR (AUDCLNT_E_EXCLUSIVE_MODE_ONLY, 0x012) + JUCE_WASAPI_ERR (AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL, 0x013) + JUCE_WASAPI_ERR (AUDCLNT_E_EVENTHANDLE_NOT_SET, 0x014) + JUCE_WASAPI_ERR (AUDCLNT_E_INCORRECT_BUFFER_SIZE, 0x015) + JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_SIZE_ERROR, 0x016) + JUCE_WASAPI_ERR (AUDCLNT_E_CPUUSAGE_EXCEEDED, 0x017) + JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_ERROR, 0x018) + JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED, 0x019) + JUCE_WASAPI_ERR (AUDCLNT_E_INVALID_DEVICE_PERIOD, 0x020) + default: break; + } + + Logger::writeToLog ("WASAPI error: " + (m != nullptr ? String (m) + : String::toHexString ((int) hr))); + } + #endif +} + +#undef check + +bool check (HRESULT hr) +{ + logFailure (hr); + return SUCCEEDED (hr); +} + +//============================================================================== +} + +#if JUCE_MINGW + #define JUCE_COMCLASS(name, guid) \ + struct name; \ + template<> struct UUIDGetter { static CLSID get() { return uuidFromString (guid); } }; \ + struct name + + struct PROPERTYKEY + { + GUID fmtid; + DWORD pid; + }; + + WINOLEAPI PropVariantClear (PROPVARIANT*); +#else + #define JUCE_COMCLASS(name, guid) struct __declspec (uuid (guid)) name +#endif + +#ifndef KSDATAFORMAT_SUBTYPE_PCM + #define KSDATAFORMAT_SUBTYPE_PCM uuidFromString ("00000001-0000-0010-8000-00aa00389b71") + #define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT uuidFromString ("00000003-0000-0010-8000-00aa00389b71") +#endif + +#define JUCE_IUNKNOWNCLASS(name, guid) JUCE_COMCLASS(name, guid) : public IUnknown +#define JUCE_COMCALL virtual HRESULT STDMETHODCALLTYPE + +enum EDataFlow +{ + eRender = 0, + eCapture = (eRender + 1), + eAll = (eCapture + 1) +}; + +enum { DEVICE_STATE_ACTIVE = 1 }; + +JUCE_IUNKNOWNCLASS (IPropertyStore, "886d8eeb-8cf2-4446-8d02-cdba1dbdcf99") +{ + JUCE_COMCALL GetCount (DWORD*) = 0; + JUCE_COMCALL GetAt (DWORD, PROPERTYKEY*) = 0; + JUCE_COMCALL GetValue (const PROPERTYKEY&, PROPVARIANT*) = 0; + JUCE_COMCALL SetValue (const PROPERTYKEY&, const PROPVARIANT&) = 0; + JUCE_COMCALL Commit() = 0; +}; + +JUCE_IUNKNOWNCLASS (IMMDevice, "D666063F-1587-4E43-81F1-B948E807363F") +{ + JUCE_COMCALL Activate (REFIID, DWORD, PROPVARIANT*, void**) = 0; + JUCE_COMCALL OpenPropertyStore (DWORD, IPropertyStore**) = 0; + JUCE_COMCALL GetId (LPWSTR*) = 0; + JUCE_COMCALL GetState (DWORD*) = 0; +}; + +JUCE_IUNKNOWNCLASS (IMMEndpoint, "1BE09788-6894-4089-8586-9A2A6C265AC5") +{ + JUCE_COMCALL GetDataFlow (EDataFlow*) = 0; +}; + +struct IMMDeviceCollection : public IUnknown +{ + JUCE_COMCALL GetCount (UINT*) = 0; + JUCE_COMCALL Item (UINT, IMMDevice**) = 0; +}; + +enum ERole +{ + eConsole = 0, + eMultimedia = (eConsole + 1), + eCommunications = (eMultimedia + 1) +}; + +JUCE_IUNKNOWNCLASS (IMMNotificationClient, "7991EEC9-7E89-4D85-8390-6C703CEC60C0") +{ + JUCE_COMCALL OnDeviceStateChanged (LPCWSTR, DWORD) = 0; + JUCE_COMCALL OnDeviceAdded (LPCWSTR) = 0; + JUCE_COMCALL OnDeviceRemoved (LPCWSTR) = 0; + JUCE_COMCALL OnDefaultDeviceChanged (EDataFlow, ERole, LPCWSTR) = 0; + JUCE_COMCALL OnPropertyValueChanged (LPCWSTR, const PROPERTYKEY) = 0; +}; + +JUCE_IUNKNOWNCLASS (IMMDeviceEnumerator, "A95664D2-9614-4F35-A746-DE8DB63617E6") +{ + JUCE_COMCALL EnumAudioEndpoints (EDataFlow, DWORD, IMMDeviceCollection**) = 0; + JUCE_COMCALL GetDefaultAudioEndpoint (EDataFlow, ERole, IMMDevice**) = 0; + JUCE_COMCALL GetDevice (LPCWSTR, IMMDevice**) = 0; + JUCE_COMCALL RegisterEndpointNotificationCallback (IMMNotificationClient*) = 0; + JUCE_COMCALL UnregisterEndpointNotificationCallback (IMMNotificationClient*) = 0; +}; + +JUCE_COMCLASS (MMDeviceEnumerator, "BCDE0395-E52F-467C-8E3D-C4579291692E"); + +typedef LONGLONG REFERENCE_TIME; + +enum AVRT_PRIORITY +{ + AVRT_PRIORITY_LOW = -1, + AVRT_PRIORITY_NORMAL, + AVRT_PRIORITY_HIGH, + AVRT_PRIORITY_CRITICAL +}; + +enum AUDCLNT_SHAREMODE +{ + AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_SHAREMODE_EXCLUSIVE +}; + +JUCE_IUNKNOWNCLASS (IAudioClient, "1CB9AD4C-DBFA-4c32-B178-C2F568A703B2") +{ + JUCE_COMCALL Initialize (AUDCLNT_SHAREMODE, DWORD, REFERENCE_TIME, REFERENCE_TIME, const WAVEFORMATEX*, LPCGUID) = 0; + JUCE_COMCALL GetBufferSize (UINT32*) = 0; + JUCE_COMCALL GetStreamLatency (REFERENCE_TIME*) = 0; + JUCE_COMCALL GetCurrentPadding (UINT32*) = 0; + JUCE_COMCALL IsFormatSupported (AUDCLNT_SHAREMODE, const WAVEFORMATEX*, WAVEFORMATEX**) = 0; + JUCE_COMCALL GetMixFormat (WAVEFORMATEX**) = 0; + JUCE_COMCALL GetDevicePeriod (REFERENCE_TIME*, REFERENCE_TIME*) = 0; + JUCE_COMCALL Start() = 0; + JUCE_COMCALL Stop() = 0; + JUCE_COMCALL Reset() = 0; + JUCE_COMCALL SetEventHandle (HANDLE) = 0; + JUCE_COMCALL GetService (REFIID, void**) = 0; +}; + +JUCE_IUNKNOWNCLASS (IAudioCaptureClient, "C8ADBD64-E71E-48a0-A4DE-185C395CD317") +{ + JUCE_COMCALL GetBuffer (BYTE**, UINT32*, DWORD*, UINT64*, UINT64*) = 0; + JUCE_COMCALL ReleaseBuffer (UINT32) = 0; + JUCE_COMCALL GetNextPacketSize (UINT32*) = 0; +}; + +JUCE_IUNKNOWNCLASS (IAudioRenderClient, "F294ACFC-3146-4483-A7BF-ADDCA7C260E2") +{ + JUCE_COMCALL GetBuffer (UINT32, BYTE**) = 0; + JUCE_COMCALL ReleaseBuffer (UINT32, DWORD) = 0; +}; + +JUCE_IUNKNOWNCLASS (IAudioEndpointVolume, "5CDF2C82-841E-4546-9722-0CF74078229A") +{ + JUCE_COMCALL RegisterControlChangeNotify (void*) = 0; + JUCE_COMCALL UnregisterControlChangeNotify (void*) = 0; + JUCE_COMCALL GetChannelCount (UINT*) = 0; + JUCE_COMCALL SetMasterVolumeLevel (float, LPCGUID) = 0; + JUCE_COMCALL SetMasterVolumeLevelScalar (float, LPCGUID) = 0; + JUCE_COMCALL GetMasterVolumeLevel (float*) = 0; + JUCE_COMCALL GetMasterVolumeLevelScalar (float*) = 0; + JUCE_COMCALL SetChannelVolumeLevel (UINT, float, LPCGUID) = 0; + JUCE_COMCALL SetChannelVolumeLevelScalar (UINT, float, LPCGUID) = 0; + JUCE_COMCALL GetChannelVolumeLevel (UINT, float*) = 0; + JUCE_COMCALL GetChannelVolumeLevelScalar (UINT, float*) = 0; + JUCE_COMCALL SetMute (BOOL, LPCGUID) = 0; + JUCE_COMCALL GetMute (BOOL*) = 0; + JUCE_COMCALL GetVolumeStepInfo (UINT*, UINT*) = 0; + JUCE_COMCALL VolumeStepUp (LPCGUID) = 0; + JUCE_COMCALL VolumeStepDown (LPCGUID) = 0; + JUCE_COMCALL QueryHardwareSupport (DWORD*) = 0; + JUCE_COMCALL GetVolumeRange (float*, float*, float*) = 0; +}; + +enum AudioSessionDisconnectReason +{ + DisconnectReasonDeviceRemoval = 0, + DisconnectReasonServerShutdown = 1, + DisconnectReasonFormatChanged = 2, + DisconnectReasonSessionLogoff = 3, + DisconnectReasonSessionDisconnected = 4, + DisconnectReasonExclusiveModeOverride = 5 +}; + +enum AudioSessionState +{ + AudioSessionStateInactive = 0, + AudioSessionStateActive = 1, + AudioSessionStateExpired = 2 +}; + +JUCE_IUNKNOWNCLASS (IAudioSessionEvents, "24918ACC-64B3-37C1-8CA9-74A66E9957A8") +{ + JUCE_COMCALL OnDisplayNameChanged (LPCWSTR, LPCGUID) = 0; + JUCE_COMCALL OnIconPathChanged (LPCWSTR, LPCGUID) = 0; + JUCE_COMCALL OnSimpleVolumeChanged (float, BOOL, LPCGUID) = 0; + JUCE_COMCALL OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) = 0; + JUCE_COMCALL OnGroupingParamChanged (LPCGUID, LPCGUID) = 0; + JUCE_COMCALL OnStateChanged (AudioSessionState) = 0; + JUCE_COMCALL OnSessionDisconnected (AudioSessionDisconnectReason) = 0; +}; + +JUCE_IUNKNOWNCLASS (IAudioSessionControl, "F4B1A599-7266-4319-A8CA-E70ACB11E8CD") +{ + JUCE_COMCALL GetState (AudioSessionState*) = 0; + JUCE_COMCALL GetDisplayName (LPWSTR*) = 0; + JUCE_COMCALL SetDisplayName (LPCWSTR, LPCGUID) = 0; + JUCE_COMCALL GetIconPath (LPWSTR*) = 0; + JUCE_COMCALL SetIconPath (LPCWSTR, LPCGUID) = 0; + JUCE_COMCALL GetGroupingParam (GUID*) = 0; + JUCE_COMCALL SetGroupingParam (LPCGUID, LPCGUID) = 0; + JUCE_COMCALL RegisterAudioSessionNotification (IAudioSessionEvents*) = 0; + JUCE_COMCALL UnregisterAudioSessionNotification (IAudioSessionEvents*) = 0; +}; + +#undef JUCE_COMCALL +#undef JUCE_COMCLASS +#undef JUCE_IUNKNOWNCLASS + +//============================================================================== +namespace WasapiClasses +{ + +String getDeviceID (IMMDevice* const device) +{ + String s; + WCHAR* deviceId = nullptr; + + if (check (device->GetId (&deviceId))) + { + s = String (deviceId); + CoTaskMemFree (deviceId); + } + + return s; +} + +EDataFlow getDataFlow (const ComSmartPtr& device) +{ + EDataFlow flow = eRender; + ComSmartPtr endPoint; + if (check (device.QueryInterface (endPoint))) + (void) check (endPoint->GetDataFlow (&flow)); + + return flow; +} + +int refTimeToSamples (const REFERENCE_TIME& t, const double sampleRate) noexcept +{ + return roundToInt (sampleRate * ((double) t) * 0.0000001); +} + +void copyWavFormat (WAVEFORMATEXTENSIBLE& dest, const WAVEFORMATEX* const src) noexcept +{ + memcpy (&dest, src, src->wFormatTag == WAVE_FORMAT_EXTENSIBLE ? sizeof (WAVEFORMATEXTENSIBLE) + : sizeof (WAVEFORMATEX)); +} + +//============================================================================== +class WASAPIDeviceBase +{ +public: + WASAPIDeviceBase (const ComSmartPtr& d, const bool exclusiveMode) + : device (d), + sampleRate (0), + defaultSampleRate (0), + numChannels (0), + actualNumChannels (0), + minBufferSize (0), + defaultBufferSize (0), + latencySamples (0), + useExclusiveMode (exclusiveMode), + sampleRateHasChanged (false) + { + clientEvent = CreateEvent (0, false, false, _T("JuceWASAPI")); + + ComSmartPtr tempClient (createClient()); + if (tempClient == nullptr) + return; + + REFERENCE_TIME defaultPeriod, minPeriod; + if (! check (tempClient->GetDevicePeriod (&defaultPeriod, &minPeriod))) + return; + + WAVEFORMATEX* mixFormat = nullptr; + if (! check (tempClient->GetMixFormat (&mixFormat))) + return; + + WAVEFORMATEXTENSIBLE format; + copyWavFormat (format, mixFormat); + CoTaskMemFree (mixFormat); + + actualNumChannels = numChannels = format.Format.nChannels; + defaultSampleRate = format.Format.nSamplesPerSec; + minBufferSize = refTimeToSamples (minPeriod, defaultSampleRate); + defaultBufferSize = refTimeToSamples (defaultPeriod, defaultSampleRate); + mixFormatChannelMask = format.dwChannelMask; + + rates.addUsingDefaultSort (defaultSampleRate); + + static const int ratesToTest[] = { 44100, 48000, 88200, 96000, 176400, 192000 }; + + for (int i = 0; i < numElementsInArray (ratesToTest); ++i) + { + if (ratesToTest[i] == defaultSampleRate) + continue; + + format.Format.nSamplesPerSec = (DWORD) ratesToTest[i]; + + if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, + (WAVEFORMATEX*) &format, 0))) + if (! rates.contains (ratesToTest[i])) + rates.addUsingDefaultSort (ratesToTest[i]); + } + } + + virtual ~WASAPIDeviceBase() + { + device = nullptr; + CloseHandle (clientEvent); + } + + bool isOk() const noexcept { return defaultBufferSize > 0 && defaultSampleRate > 0; } + + bool openClient (const double newSampleRate, const BigInteger& newChannels) + { + sampleRate = newSampleRate; + channels = newChannels; + channels.setRange (actualNumChannels, channels.getHighestBit() + 1 - actualNumChannels, false); + numChannels = channels.getHighestBit() + 1; + + if (numChannels == 0) + return true; + + client = createClient(); + + if (client != nullptr + && (tryInitialisingWithFormat (true, 4) || tryInitialisingWithFormat (false, 4) + || tryInitialisingWithFormat (false, 3) || tryInitialisingWithFormat (false, 2))) + { + sampleRateHasChanged = false; + + channelMaps.clear(); + for (int i = 0; i <= channels.getHighestBit(); ++i) + if (channels[i]) + channelMaps.add (i); + + REFERENCE_TIME latency; + if (check (client->GetStreamLatency (&latency))) + latencySamples = refTimeToSamples (latency, sampleRate); + + (void) check (client->GetBufferSize (&actualBufferSize)); + + createSessionEventCallback(); + + return check (client->SetEventHandle (clientEvent)); + } + + return false; + } + + void closeClient() + { + if (client != nullptr) + client->Stop(); + + deleteSessionEventCallback(); + client = nullptr; + ResetEvent (clientEvent); + } + + void deviceSampleRateChanged() + { + sampleRateHasChanged = true; + } + + //============================================================================== + ComSmartPtr device; + ComSmartPtr client; + double sampleRate, defaultSampleRate; + int numChannels, actualNumChannels; + int minBufferSize, defaultBufferSize, latencySamples; + DWORD mixFormatChannelMask; + const bool useExclusiveMode; + Array rates; + HANDLE clientEvent; + BigInteger channels; + Array channelMaps; + UINT32 actualBufferSize; + int bytesPerSample; + bool sampleRateHasChanged; + + virtual void updateFormat (bool isFloat) = 0; + +private: + //============================================================================== + class SessionEventCallback : public ComBaseClassHelper + { + public: + SessionEventCallback (WASAPIDeviceBase& d) : owner (d) {} + + JUCE_COMRESULT OnDisplayNameChanged (LPCWSTR, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnIconPathChanged (LPCWSTR, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnSimpleVolumeChanged (float, BOOL, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnGroupingParamChanged (LPCGUID, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnStateChanged (AudioSessionState) { return S_OK; } + + JUCE_COMRESULT OnSessionDisconnected (AudioSessionDisconnectReason reason) + { + if (reason == DisconnectReasonFormatChanged) + owner.deviceSampleRateChanged(); + + return S_OK; + } + + private: + WASAPIDeviceBase& owner; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SessionEventCallback) + }; + + ComSmartPtr audioSessionControl; + ComSmartPtr sessionEventCallback; + + void createSessionEventCallback() + { + deleteSessionEventCallback(); + client->GetService (__uuidof (IAudioSessionControl), + (void**) audioSessionControl.resetAndGetPointerAddress()); + + if (audioSessionControl != nullptr) + { + sessionEventCallback = new SessionEventCallback (*this); + audioSessionControl->RegisterAudioSessionNotification (sessionEventCallback); + sessionEventCallback->Release(); // (required because ComBaseClassHelper objects are constructed with a ref count of 1) + } + } + + void deleteSessionEventCallback() + { + if (audioSessionControl != nullptr && sessionEventCallback != nullptr) + audioSessionControl->UnregisterAudioSessionNotification (sessionEventCallback); + + audioSessionControl = nullptr; + sessionEventCallback = nullptr; + } + + //============================================================================== + ComSmartPtr createClient() + { + ComSmartPtr client; + + if (device != nullptr) + logFailure (device->Activate (__uuidof (IAudioClient), CLSCTX_INPROC_SERVER, + nullptr, (void**) client.resetAndGetPointerAddress())); + + return client; + } + + bool tryInitialisingWithFormat (const bool useFloat, const int bytesPerSampleToTry) + { + WAVEFORMATEXTENSIBLE format; + zerostruct (format); + + if (numChannels <= 2 && bytesPerSampleToTry <= 2) + { + format.Format.wFormatTag = WAVE_FORMAT_PCM; + } + else + { + format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + format.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX); + } + + format.Format.nSamplesPerSec = (DWORD) sampleRate; + format.Format.nChannels = (WORD) numChannels; + format.Format.wBitsPerSample = (WORD) (8 * bytesPerSampleToTry); + format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * numChannels * bytesPerSampleToTry); + format.Format.nBlockAlign = (WORD) (numChannels * bytesPerSampleToTry); + format.SubFormat = useFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; + format.Samples.wValidBitsPerSample = format.Format.wBitsPerSample; + format.dwChannelMask = mixFormatChannelMask; + + WAVEFORMATEXTENSIBLE* nearestFormat = nullptr; + + HRESULT hr = client->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE + : AUDCLNT_SHAREMODE_SHARED, + (WAVEFORMATEX*) &format, + useExclusiveMode ? nullptr : (WAVEFORMATEX**) &nearestFormat); + logFailure (hr); + + if (hr == S_FALSE && format.Format.nSamplesPerSec == nearestFormat->Format.nSamplesPerSec) + { + copyWavFormat (format, (WAVEFORMATEX*) nearestFormat); + hr = S_OK; + } + + CoTaskMemFree (nearestFormat); + + REFERENCE_TIME defaultPeriod = 0, minPeriod = 0; + if (useExclusiveMode) + check (client->GetDevicePeriod (&defaultPeriod, &minPeriod)); + + GUID session; + if (hr == S_OK + && check (client->Initialize (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, + 0x40000 /*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/, + defaultPeriod, defaultPeriod, (WAVEFORMATEX*) &format, &session))) + { + actualNumChannels = format.Format.nChannels; + const bool isFloat = format.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE && format.SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + bytesPerSample = format.Format.wBitsPerSample / 8; + + updateFormat (isFloat); + return true; + } + + return false; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIDeviceBase) +}; + +//============================================================================== +class WASAPIInputDevice : public WASAPIDeviceBase +{ +public: + WASAPIInputDevice (const ComSmartPtr& d, const bool exclusiveMode) + : WASAPIDeviceBase (d, exclusiveMode), + reservoir (1, 1) + { + } + + ~WASAPIInputDevice() + { + close(); + } + + bool open (const double newSampleRate, const BigInteger& newChannels) + { + reservoirSize = 0; + reservoirCapacity = 16384; + reservoir.setSize (actualNumChannels * reservoirCapacity * sizeof (float)); + return openClient (newSampleRate, newChannels) + && (numChannels == 0 || check (client->GetService (__uuidof (IAudioCaptureClient), + (void**) captureClient.resetAndGetPointerAddress()))); + } + + void close() + { + closeClient(); + captureClient = nullptr; + reservoir.reset(); + } + + template + void updateFormatWithType (SourceType*) + { + typedef AudioData::Pointer NativeType; + converter = new AudioData::ConverterInstance, NativeType> (actualNumChannels, 1); + } + + void updateFormat (bool isFloat) + { + if (isFloat) updateFormatWithType ((AudioData::Float32*) 0); + else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) 0); + else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) 0); + else updateFormatWithType ((AudioData::Int16*) 0); + } + + void copyBuffers (float** destBuffers, int numDestBuffers, int bufferSize, Thread& thread) + { + if (numChannels <= 0) + return; + + int offset = 0; + + while (bufferSize > 0) + { + if (reservoirSize > 0) // There's stuff in the reservoir, so use that... + { + const int samplesToDo = jmin (bufferSize, (int) reservoirSize); + + for (int i = 0; i < numDestBuffers; ++i) + converter->convertSamples (destBuffers[i] + offset, 0, reservoir.getData(), channelMaps.getUnchecked(i), samplesToDo); + + bufferSize -= samplesToDo; + offset += samplesToDo; + reservoirSize = 0; + } + else + { + UINT32 packetLength = 0; + if (! check (captureClient->GetNextPacketSize (&packetLength))) + break; + + if (packetLength == 0) + { + if (thread.threadShouldExit() + || WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) + break; + + continue; + } + + uint8* inputData; + UINT32 numSamplesAvailable; + DWORD flags; + + if (check (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, 0, 0))) + { + const int samplesToDo = jmin (bufferSize, (int) numSamplesAvailable); + + for (int i = 0; i < numDestBuffers; ++i) + converter->convertSamples (destBuffers[i] + offset, 0, inputData, channelMaps.getUnchecked(i), samplesToDo); + + bufferSize -= samplesToDo; + offset += samplesToDo; + + if (samplesToDo < (int) numSamplesAvailable) + { + reservoirSize = jmin ((int) (numSamplesAvailable - samplesToDo), reservoirCapacity); + memcpy ((uint8*) reservoir.getData(), inputData + bytesPerSample * actualNumChannels * samplesToDo, + (size_t) (bytesPerSample * actualNumChannels * reservoirSize)); + } + + captureClient->ReleaseBuffer (numSamplesAvailable); + } + } + } + } + + ComSmartPtr captureClient; + MemoryBlock reservoir; + int reservoirSize, reservoirCapacity; + ScopedPointer converter; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIInputDevice) +}; + +//============================================================================== +class WASAPIOutputDevice : public WASAPIDeviceBase +{ +public: + WASAPIOutputDevice (const ComSmartPtr& d, const bool exclusiveMode) + : WASAPIDeviceBase (d, exclusiveMode) + { + } + + ~WASAPIOutputDevice() + { + close(); + } + + bool open (const double newSampleRate, const BigInteger& newChannels) + { + return openClient (newSampleRate, newChannels) + && (numChannels == 0 || check (client->GetService (__uuidof (IAudioRenderClient), (void**) renderClient.resetAndGetPointerAddress()))); + } + + void close() + { + closeClient(); + renderClient = nullptr; + } + + template + void updateFormatWithType (DestType*) + { + typedef AudioData::Pointer NativeType; + converter = new AudioData::ConverterInstance > (1, actualNumChannels); + } + + void updateFormat (bool isFloat) + { + if (isFloat) updateFormatWithType ((AudioData::Float32*) 0); + else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) 0); + else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) 0); + else updateFormatWithType ((AudioData::Int16*) 0); + } + + void copyBuffers (const float** const srcBuffers, const int numSrcBuffers, int bufferSize, Thread& thread) + { + if (numChannels <= 0) + return; + + int offset = 0; + + while (bufferSize > 0) + { + UINT32 padding = 0; + if (! check (client->GetCurrentPadding (&padding))) + return; + + int samplesToDo = useExclusiveMode ? bufferSize + : jmin ((int) (actualBufferSize - padding), bufferSize); + + if (samplesToDo <= 0) + { + if (thread.threadShouldExit() + || WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) + break; + + continue; + } + + uint8* outputData = nullptr; + if (check (renderClient->GetBuffer ((UINT32) samplesToDo, &outputData))) + { + for (int i = 0; i < numSrcBuffers; ++i) + converter->convertSamples (outputData, channelMaps.getUnchecked(i), srcBuffers[i] + offset, 0, samplesToDo); + + renderClient->ReleaseBuffer ((UINT32) samplesToDo, 0); + + offset += samplesToDo; + bufferSize -= samplesToDo; + } + } + } + + ComSmartPtr renderClient; + ScopedPointer converter; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIOutputDevice) +}; + +//============================================================================== +class WASAPIAudioIODevice : public AudioIODevice, + public Thread, + private AsyncUpdater +{ +public: + WASAPIAudioIODevice (const String& deviceName, + const String& outputDeviceId_, + const String& inputDeviceId_, + const bool exclusiveMode) + : AudioIODevice (deviceName, "Windows Audio"), + Thread ("Juce WASAPI"), + outputDeviceId (outputDeviceId_), + inputDeviceId (inputDeviceId_), + useExclusiveMode (exclusiveMode), + isOpen_ (false), + isStarted (false), + currentBufferSizeSamples (0), + currentSampleRate (0), + callback (nullptr) + { + } + + ~WASAPIAudioIODevice() + { + close(); + } + + bool initialise() + { + latencyIn = latencyOut = 0; + Array ratesIn, ratesOut; + + if (createDevices()) + { + jassert (inputDevice != nullptr || outputDevice != nullptr); + + if (inputDevice != nullptr && outputDevice != nullptr) + { + defaultSampleRate = jmin (inputDevice->defaultSampleRate, outputDevice->defaultSampleRate); + minBufferSize = jmin (inputDevice->minBufferSize, outputDevice->minBufferSize); + defaultBufferSize = jmax (inputDevice->defaultBufferSize, outputDevice->defaultBufferSize); + sampleRates = inputDevice->rates; + sampleRates.removeValuesNotIn (outputDevice->rates); + } + else + { + WASAPIDeviceBase* d = inputDevice != nullptr ? static_cast (inputDevice) + : static_cast (outputDevice); + defaultSampleRate = d->defaultSampleRate; + minBufferSize = d->minBufferSize; + defaultBufferSize = d->defaultBufferSize; + sampleRates = d->rates; + } + + bufferSizes.addUsingDefaultSort (defaultBufferSize); + if (minBufferSize != defaultBufferSize) + bufferSizes.addUsingDefaultSort (minBufferSize); + + int n = 64; + for (int i = 0; i < 40; ++i) + { + if (n >= minBufferSize && n <= 2048 && ! bufferSizes.contains (n)) + bufferSizes.addUsingDefaultSort (n); + + n += (n < 512) ? 32 : (n < 1024 ? 64 : 128); + } + + return true; + } + + return false; + } + + StringArray getOutputChannelNames() override + { + StringArray outChannels; + + if (outputDevice != nullptr) + for (int i = 1; i <= outputDevice->actualNumChannels; ++i) + outChannels.add ("Output channel " + String (i)); + + return outChannels; + } + + StringArray getInputChannelNames() override + { + StringArray inChannels; + + if (inputDevice != nullptr) + for (int i = 1; i <= inputDevice->actualNumChannels; ++i) + inChannels.add ("Input channel " + String (i)); + + return inChannels; + } + + Array getAvailableSampleRates() override { return sampleRates; } + Array getAvailableBufferSizes() override { return bufferSizes; } + int getDefaultBufferSize() override { return defaultBufferSize; } + + int getCurrentBufferSizeSamples() override { return currentBufferSizeSamples; } + double getCurrentSampleRate() override { return currentSampleRate; } + int getCurrentBitDepth() override { return 32; } + int getOutputLatencyInSamples() override { return latencyOut; } + int getInputLatencyInSamples() override { return latencyIn; } + BigInteger getActiveOutputChannels() const override { return outputDevice != nullptr ? outputDevice->channels : BigInteger(); } + BigInteger getActiveInputChannels() const override { return inputDevice != nullptr ? inputDevice->channels : BigInteger(); } + String getLastError() override { return lastError; } + + + String open (const BigInteger& inputChannels, const BigInteger& outputChannels, + double sampleRate, int bufferSizeSamples) override + { + close(); + lastError.clear(); + + if (sampleRates.size() == 0 && inputDevice != nullptr && outputDevice != nullptr) + { + lastError = TRANS("The input and output devices don't share a common sample rate!"); + return lastError; + } + + currentBufferSizeSamples = bufferSizeSamples <= 0 ? defaultBufferSize : jmax (bufferSizeSamples, minBufferSize); + currentSampleRate = sampleRate > 0 ? sampleRate : defaultSampleRate; + lastKnownInputChannels = inputChannels; + lastKnownOutputChannels = outputChannels; + + if (inputDevice != nullptr && ! inputDevice->open (currentSampleRate, inputChannels)) + { + lastError = TRANS("Couldn't open the input device!"); + return lastError; + } + + if (outputDevice != nullptr && ! outputDevice->open (currentSampleRate, outputChannels)) + { + close(); + lastError = TRANS("Couldn't open the output device!"); + return lastError; + } + + if (inputDevice != nullptr) ResetEvent (inputDevice->clientEvent); + if (outputDevice != nullptr) ResetEvent (outputDevice->clientEvent); + + startThread (8); + Thread::sleep (5); + + if (inputDevice != nullptr && inputDevice->client != nullptr) + { + latencyIn = (int) (inputDevice->latencySamples + currentBufferSizeSamples); + + if (! check (inputDevice->client->Start())) + { + close(); + lastError = TRANS("Couldn't start the input device!"); + return lastError; + } + } + + if (outputDevice != nullptr && outputDevice->client != nullptr) + { + latencyOut = (int) (outputDevice->latencySamples + currentBufferSizeSamples); + + if (! check (outputDevice->client->Start())) + { + close(); + lastError = TRANS("Couldn't start the output device!"); + return lastError; + } + } + + isOpen_ = true; + return lastError; + } + + void close() override + { + stop(); + signalThreadShouldExit(); + + if (inputDevice != nullptr) SetEvent (inputDevice->clientEvent); + if (outputDevice != nullptr) SetEvent (outputDevice->clientEvent); + + stopThread (5000); + + if (inputDevice != nullptr) inputDevice->close(); + if (outputDevice != nullptr) outputDevice->close(); + + isOpen_ = false; + } + + bool isOpen() override { return isOpen_ && isThreadRunning(); } + bool isPlaying() override { return isStarted && isOpen_ && isThreadRunning(); } + + void start (AudioIODeviceCallback* call) override + { + if (isOpen_ && call != nullptr && ! isStarted) + { + if (! isThreadRunning()) + { + // something's gone wrong and the thread's stopped.. + isOpen_ = false; + return; + } + + call->audioDeviceAboutToStart (this); + + const ScopedLock sl (startStopLock); + callback = call; + isStarted = true; + } + } + + void stop() override + { + if (isStarted) + { + AudioIODeviceCallback* const callbackLocal = callback; + + { + const ScopedLock sl (startStopLock); + isStarted = false; + } + + if (callbackLocal != nullptr) + callbackLocal->audioDeviceStopped(); + } + } + + void setMMThreadPriority() + { + DynamicLibrary dll ("avrt.dll"); + JUCE_LOAD_WINAPI_FUNCTION (dll, AvSetMmThreadCharacteristicsW, avSetMmThreadCharacteristics, HANDLE, (LPCWSTR, LPDWORD)) + JUCE_LOAD_WINAPI_FUNCTION (dll, AvSetMmThreadPriority, avSetMmThreadPriority, HANDLE, (HANDLE, AVRT_PRIORITY)) + + if (avSetMmThreadCharacteristics != 0 && avSetMmThreadPriority != 0) + { + DWORD dummy = 0; + HANDLE h = avSetMmThreadCharacteristics (L"Pro Audio", &dummy); + + if (h != 0) + avSetMmThreadPriority (h, AVRT_PRIORITY_NORMAL); + } + } + + void run() override + { + setMMThreadPriority(); + + const int bufferSize = currentBufferSizeSamples; + const int numInputBuffers = getActiveInputChannels().countNumberOfSetBits(); + const int numOutputBuffers = getActiveOutputChannels().countNumberOfSetBits(); + bool sampleRateChanged = false; + + AudioSampleBuffer ins (jmax (1, numInputBuffers), bufferSize + 32); + AudioSampleBuffer outs (jmax (1, numOutputBuffers), bufferSize + 32); + float** const inputBuffers = ins.getArrayOfWritePointers(); + float** const outputBuffers = outs.getArrayOfWritePointers(); + ins.clear(); + + while (! threadShouldExit()) + { + if (inputDevice != nullptr) + { + inputDevice->copyBuffers (inputBuffers, numInputBuffers, bufferSize, *this); + + if (threadShouldExit()) + break; + + if (inputDevice->sampleRateHasChanged) + { + sampleRateChanged = true; + sampleRateChangedByOutput = false; + } + } + + { + const ScopedLock sl (startStopLock); + + if (isStarted) + callback->audioDeviceIOCallback (const_cast (inputBuffers), numInputBuffers, + outputBuffers, numOutputBuffers, bufferSize); + else + outs.clear(); + } + + if (outputDevice != nullptr) + { + outputDevice->copyBuffers (const_cast (outputBuffers), numOutputBuffers, bufferSize, *this); + + if (outputDevice->sampleRateHasChanged) + { + sampleRateChanged = true; + sampleRateChangedByOutput = true; + } + } + + if (sampleRateChanged) + { + triggerAsyncUpdate(); + break; // Quit the thread... will restart it later! + } + } + } + + //============================================================================== + String outputDeviceId, inputDeviceId; + String lastError; + +private: + // Device stats... + ScopedPointer inputDevice; + ScopedPointer outputDevice; + const bool useExclusiveMode; + double defaultSampleRate; + int minBufferSize, defaultBufferSize; + int latencyIn, latencyOut; + Array sampleRates; + Array bufferSizes; + + // Active state... + bool isOpen_, isStarted; + int currentBufferSizeSamples; + double currentSampleRate; + bool sampleRateChangedByOutput; + + AudioIODeviceCallback* callback; + CriticalSection startStopLock; + + BigInteger lastKnownInputChannels, lastKnownOutputChannels; + + //============================================================================== + bool createDevices() + { + ComSmartPtr enumerator; + if (! check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) + return false; + + ComSmartPtr deviceCollection; + if (! check (enumerator->EnumAudioEndpoints (eAll, DEVICE_STATE_ACTIVE, deviceCollection.resetAndGetPointerAddress()))) + return false; + + UINT32 numDevices = 0; + if (! check (deviceCollection->GetCount (&numDevices))) + return false; + + for (UINT32 i = 0; i < numDevices; ++i) + { + ComSmartPtr device; + if (! check (deviceCollection->Item (i, device.resetAndGetPointerAddress()))) + continue; + + const String deviceId (getDeviceID (device)); + if (deviceId.isEmpty()) + continue; + + const EDataFlow flow = getDataFlow (device); + + if (deviceId == inputDeviceId && flow == eCapture) + inputDevice = new WASAPIInputDevice (device, useExclusiveMode); + else if (deviceId == outputDeviceId && flow == eRender) + outputDevice = new WASAPIOutputDevice (device, useExclusiveMode); + } + + return (outputDeviceId.isEmpty() || (outputDevice != nullptr && outputDevice->isOk())) + && (inputDeviceId.isEmpty() || (inputDevice != nullptr && inputDevice->isOk())); + } + + //============================================================================== + void handleAsyncUpdate() override + { + stop(); + + outputDevice = nullptr; + inputDevice = nullptr; + initialise(); + + open (lastKnownInputChannels, lastKnownOutputChannels, + getChangedSampleRate(), currentBufferSizeSamples); + + start (callback); + } + + double getChangedSampleRate() const + { + if (outputDevice != nullptr && sampleRateChangedByOutput) + return outputDevice->defaultSampleRate; + + if (inputDevice != nullptr && ! sampleRateChangedByOutput) + return inputDevice->defaultSampleRate; + + return 0.0; + } + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIAudioIODevice) +}; + + +//============================================================================== +class WASAPIAudioIODeviceType : public AudioIODeviceType, + private DeviceChangeDetector +{ +public: + WASAPIAudioIODeviceType() + : AudioIODeviceType ("Windows Audio"), + DeviceChangeDetector (L"Windows Audio"), + hasScanned (false) + { + } + + ~WASAPIAudioIODeviceType() + { + if (notifyClient != nullptr) + enumerator->UnregisterEndpointNotificationCallback (notifyClient); + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + outputDeviceNames.clear(); + inputDeviceNames.clear(); + outputDeviceIds.clear(); + inputDeviceIds.clear(); + + scan (outputDeviceNames, inputDeviceNames, + outputDeviceIds, inputDeviceIds); + } + + StringArray getDeviceNames (bool wantInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return wantInputNames ? inputDeviceNames + : outputDeviceNames; + } + + int getDefaultDeviceIndex (bool /*forInput*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + return 0; + } + + int getIndexOfDevice (AudioIODevice* device, bool asInput) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + if (WASAPIAudioIODevice* const d = dynamic_cast (device)) + return asInput ? inputDeviceIds.indexOf (d->inputDeviceId) + : outputDeviceIds.indexOf (d->outputDeviceId); + + return -1; + } + + bool hasSeparateInputsAndOutputs() const { return true; } + + AudioIODevice* createDevice (const String& outputDeviceName, + const String& inputDeviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const bool useExclusiveMode = false; + ScopedPointer device; + + const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); + const int inputIndex = inputDeviceNames.indexOf (inputDeviceName); + + if (outputIndex >= 0 || inputIndex >= 0) + { + device = new WASAPIAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName, + outputDeviceIds [outputIndex], + inputDeviceIds [inputIndex], + useExclusiveMode); + + if (! device->initialise()) + device = nullptr; + } + + return device.release(); + } + + //============================================================================== + StringArray outputDeviceNames, outputDeviceIds; + StringArray inputDeviceNames, inputDeviceIds; + +private: + bool hasScanned; + ComSmartPtr enumerator; + + //============================================================================== + class ChangeNotificationClient : public ComBaseClassHelper + { + public: + ChangeNotificationClient (WASAPIAudioIODeviceType& d) + : ComBaseClassHelper (0), device (d) {} + + HRESULT STDMETHODCALLTYPE OnDeviceAdded (LPCWSTR) { return notify(); } + HRESULT STDMETHODCALLTYPE OnDeviceRemoved (LPCWSTR) { return notify(); } + HRESULT STDMETHODCALLTYPE OnDeviceStateChanged (LPCWSTR, DWORD) { return notify(); } + HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged (EDataFlow, ERole, LPCWSTR) { return notify(); } + HRESULT STDMETHODCALLTYPE OnPropertyValueChanged (LPCWSTR, const PROPERTYKEY) { return notify(); } + + private: + WASAPIAudioIODeviceType& device; + + HRESULT notify() { device.triggerAsyncDeviceChangeCallback(); return S_OK; } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChangeNotificationClient) + }; + + ComSmartPtr notifyClient; + + //============================================================================== + static String getDefaultEndpoint (IMMDeviceEnumerator* const enumerator, const bool forCapture) + { + String s; + IMMDevice* dev = nullptr; + + if (check (enumerator->GetDefaultAudioEndpoint (forCapture ? eCapture : eRender, + eMultimedia, &dev))) + { + WCHAR* deviceId = nullptr; + + if (check (dev->GetId (&deviceId))) + { + s = deviceId; + CoTaskMemFree (deviceId); + } + + dev->Release(); + } + + return s; + } + + //============================================================================== + void scan (StringArray& outputDeviceNames, + StringArray& inputDeviceNames, + StringArray& outputDeviceIds, + StringArray& inputDeviceIds) + { + if (enumerator == nullptr) + { + if (! check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) + return; + + notifyClient = new ChangeNotificationClient (*this); + enumerator->RegisterEndpointNotificationCallback (notifyClient); + } + + const String defaultRenderer (getDefaultEndpoint (enumerator, false)); + const String defaultCapture (getDefaultEndpoint (enumerator, true)); + + ComSmartPtr deviceCollection; + UINT32 numDevices = 0; + + if (! (check (enumerator->EnumAudioEndpoints (eAll, DEVICE_STATE_ACTIVE, deviceCollection.resetAndGetPointerAddress())) + && check (deviceCollection->GetCount (&numDevices)))) + return; + + for (UINT32 i = 0; i < numDevices; ++i) + { + ComSmartPtr device; + if (! check (deviceCollection->Item (i, device.resetAndGetPointerAddress()))) + continue; + + DWORD state = 0; + if (! (check (device->GetState (&state)) && state == DEVICE_STATE_ACTIVE)) + continue; + + const String deviceId (getDeviceID (device)); + String name; + + { + ComSmartPtr properties; + if (! check (device->OpenPropertyStore (STGM_READ, properties.resetAndGetPointerAddress()))) + continue; + + PROPVARIANT value; + zerostruct (value); + + const PROPERTYKEY PKEY_Device_FriendlyName + = { { 0xa45c254e, 0xdf1c, 0x4efd, { 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0 } }, 14 }; + + if (check (properties->GetValue (PKEY_Device_FriendlyName, &value))) + name = value.pwszVal; + + PropVariantClear (&value); + } + + const EDataFlow flow = getDataFlow (device); + + if (flow == eRender) + { + const int index = (deviceId == defaultRenderer) ? 0 : -1; + outputDeviceIds.insert (index, deviceId); + outputDeviceNames.insert (index, name); + } + else if (flow == eCapture) + { + const int index = (deviceId == defaultCapture) ? 0 : -1; + inputDeviceIds.insert (index, deviceId); + inputDeviceNames.insert (index, name); + } + } + + inputDeviceNames.appendNumbersToDuplicates (false, false); + outputDeviceNames.appendNumbersToDuplicates (false, false); + } + + //============================================================================== + void systemDeviceChanged() override + { + StringArray newOutNames, newInNames, newOutIds, newInIds; + scan (newOutNames, newInNames, newOutIds, newInIds); + + if (newOutNames != outputDeviceNames + || newInNames != inputDeviceNames + || newOutIds != outputDeviceIds + || newInIds != inputDeviceIds) + { + hasScanned = true; + outputDeviceNames = newOutNames; + inputDeviceNames = newInNames; + outputDeviceIds = newOutIds; + inputDeviceIds = newInIds; + } + + callDeviceChangeListeners(); + } + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIAudioIODeviceType) +}; + +//============================================================================== +struct MMDeviceMasterVolume +{ + MMDeviceMasterVolume() + { + ComSmartPtr enumerator; + if (check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) + { + ComSmartPtr device; + if (check (enumerator->GetDefaultAudioEndpoint (eRender, eConsole, device.resetAndGetPointerAddress()))) + check (device->Activate (__uuidof (IAudioEndpointVolume), CLSCTX_INPROC_SERVER, nullptr, + (void**) endpointVolume.resetAndGetPointerAddress())); + } + } + + float getGain() const + { + float vol = 0.0f; + if (endpointVolume != nullptr) + check (endpointVolume->GetMasterVolumeLevelScalar (&vol)); + + return vol; + } + + bool setGain (float newGain) const + { + return endpointVolume != nullptr + && check (endpointVolume->SetMasterVolumeLevelScalar (jlimit (0.0f, 1.0f, newGain), nullptr)); + } + + bool isMuted() const + { + BOOL mute = 0; + return endpointVolume != nullptr + && check (endpointVolume->GetMute (&mute)) && mute != 0; + } + + bool setMuted (bool shouldMute) const + { + return endpointVolume != nullptr + && check (endpointVolume->SetMute (shouldMute, nullptr)); + } + + ComSmartPtr endpointVolume; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MMDeviceMasterVolume) +}; + +} + +//============================================================================== +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() +{ + if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista) + return new WasapiClasses::WASAPIAudioIODeviceType(); + + return nullptr; +} + +//============================================================================== +#define JUCE_SYSTEMAUDIOVOL_IMPLEMENTED 1 +float JUCE_CALLTYPE SystemAudioVolume::getGain() { return WasapiClasses::MMDeviceMasterVolume().getGain(); } +bool JUCE_CALLTYPE SystemAudioVolume::setGain (float gain) { return WasapiClasses::MMDeviceMasterVolume().setGain (gain); } +bool JUCE_CALLTYPE SystemAudioVolume::isMuted() { return WasapiClasses::MMDeviceMasterVolume().isMuted(); } +bool JUCE_CALLTYPE SystemAudioVolume::setMuted (bool mute) { return WasapiClasses::MMDeviceMasterVolume().setMuted (mute); } diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp new file mode 100644 index 0000000000..c351795338 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp @@ -0,0 +1,182 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioSourcePlayer::AudioSourcePlayer() + : source (nullptr), + sampleRate (0), + bufferSize (0), + lastGain (1.0f), + gain (1.0f) +{ +} + +AudioSourcePlayer::~AudioSourcePlayer() +{ + setSource (nullptr); +} + +void AudioSourcePlayer::setSource (AudioSource* newSource) +{ + if (source != newSource) + { + AudioSource* const oldSource = source; + + if (newSource != nullptr && bufferSize > 0 && sampleRate > 0) + newSource->prepareToPlay (bufferSize, sampleRate); + + { + const ScopedLock sl (readLock); + source = newSource; + } + + if (oldSource != nullptr) + oldSource->releaseResources(); + } +} + +void AudioSourcePlayer::setGain (const float newGain) noexcept +{ + gain = newGain; +} + +void AudioSourcePlayer::audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) +{ + // these should have been prepared by audioDeviceAboutToStart()... + jassert (sampleRate > 0 && bufferSize > 0); + + const ScopedLock sl (readLock); + + if (source != nullptr) + { + int numActiveChans = 0, numInputs = 0, numOutputs = 0; + + // messy stuff needed to compact the channels down into an array + // of non-zero pointers.. + for (int i = 0; i < totalNumInputChannels; ++i) + { + if (inputChannelData[i] != nullptr) + { + inputChans [numInputs++] = inputChannelData[i]; + if (numInputs >= numElementsInArray (inputChans)) + break; + } + } + + for (int i = 0; i < totalNumOutputChannels; ++i) + { + if (outputChannelData[i] != nullptr) + { + outputChans [numOutputs++] = outputChannelData[i]; + if (numOutputs >= numElementsInArray (outputChans)) + break; + } + } + + if (numInputs > numOutputs) + { + // if there aren't enough output channels for the number of + // inputs, we need to create some temporary extra ones (can't + // use the input data in case it gets written to) + tempBuffer.setSize (numInputs - numOutputs, numSamples, + false, false, true); + + for (int i = 0; i < numOutputs; ++i) + { + channels[numActiveChans] = outputChans[i]; + memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); + ++numActiveChans; + } + + for (int i = numOutputs; i < numInputs; ++i) + { + channels[numActiveChans] = tempBuffer.getWritePointer (i - numOutputs); + memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); + ++numActiveChans; + } + } + else + { + for (int i = 0; i < numInputs; ++i) + { + channels[numActiveChans] = outputChans[i]; + memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); + ++numActiveChans; + } + + for (int i = numInputs; i < numOutputs; ++i) + { + channels[numActiveChans] = outputChans[i]; + zeromem (channels[numActiveChans], sizeof (float) * (size_t) numSamples); + ++numActiveChans; + } + } + + AudioSampleBuffer buffer (channels, numActiveChans, numSamples); + + AudioSourceChannelInfo info (&buffer, 0, numSamples); + source->getNextAudioBlock (info); + + for (int i = info.buffer->getNumChannels(); --i >= 0;) + buffer.applyGainRamp (i, info.startSample, info.numSamples, lastGain, gain); + + lastGain = gain; + } + else + { + for (int i = 0; i < totalNumOutputChannels; ++i) + if (outputChannelData[i] != nullptr) + zeromem (outputChannelData[i], sizeof (float) * (size_t) numSamples); + } +} + +void AudioSourcePlayer::audioDeviceAboutToStart (AudioIODevice* device) +{ + prepareToPlay (device->getCurrentSampleRate(), + device->getCurrentBufferSizeSamples()); +} + +void AudioSourcePlayer::prepareToPlay (double newSampleRate, int newBufferSize) +{ + sampleRate = newSampleRate; + bufferSize = newBufferSize; + zeromem (channels, sizeof (channels)); + + if (source != nullptr) + source->prepareToPlay (bufferSize, sampleRate); +} + +void AudioSourcePlayer::audioDeviceStopped() +{ + if (source != nullptr) + source->releaseResources(); + + sampleRate = 0.0; + bufferSize = 0; + + tempBuffer.setSize (2, 8); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h new file mode 100644 index 0000000000..0a3751c514 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h @@ -0,0 +1,115 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOSOURCEPLAYER_H_INCLUDED +#define JUCE_AUDIOSOURCEPLAYER_H_INCLUDED + + +//============================================================================== +/** + Wrapper class to continuously stream audio from an audio source to an + AudioIODevice. + + This object acts as an AudioIODeviceCallback, so can be attached to an + output device, and will stream audio from an AudioSource. +*/ +class JUCE_API AudioSourcePlayer : public AudioIODeviceCallback +{ +public: + //============================================================================== + /** Creates an empty AudioSourcePlayer. */ + AudioSourcePlayer(); + + /** Destructor. + + Make sure this object isn't still being used by an AudioIODevice before + deleting it! + */ + virtual ~AudioSourcePlayer(); + + //============================================================================== + /** Changes the current audio source to play from. + + If the source passed in is already being used, this method will do nothing. + If the source is not null, its prepareToPlay() method will be called + before it starts being used for playback. + + If there's another source currently playing, its releaseResources() method + will be called after it has been swapped for the new one. + + @param newSource the new source to use - this will NOT be deleted + by this object when no longer needed, so it's the + caller's responsibility to manage it. + */ + void setSource (AudioSource* newSource); + + /** Returns the source that's playing. + May return nullptr if there's no source. + */ + AudioSource* getCurrentSource() const noexcept { return source; } + + /** Sets a gain to apply to the audio data. + @see getGain + */ + void setGain (float newGain) noexcept; + + /** Returns the current gain. + @see setGain + */ + float getGain() const noexcept { return gain; } + + //============================================================================== + /** Implementation of the AudioIODeviceCallback method. */ + void audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) override; + + /** Implementation of the AudioIODeviceCallback method. */ + void audioDeviceAboutToStart (AudioIODevice* device) override; + + /** Implementation of the AudioIODeviceCallback method. */ + void audioDeviceStopped() override; + + /** An alternative method for initialising the source without an AudioIODevice. */ + void prepareToPlay (double sampleRate, int blockSize); + +private: + //============================================================================== + CriticalSection readLock; + AudioSource* source; + double sampleRate; + int bufferSize; + float* channels [128]; + float* outputChans [128]; + const float* inputChans [128]; + AudioSampleBuffer tempBuffer; + float lastGain, gain; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSourcePlayer) +}; + + +#endif // JUCE_AUDIOSOURCEPLAYER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp new file mode 100644 index 0000000000..feb58a983f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp @@ -0,0 +1,298 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioTransportSource::AudioTransportSource() + : source (nullptr), + resamplerSource (nullptr), + bufferingSource (nullptr), + positionableSource (nullptr), + masterSource (nullptr), + gain (1.0f), + lastGain (1.0f), + playing (false), + stopped (true), + sampleRate (44100.0), + sourceSampleRate (0.0), + blockSize (128), + readAheadBufferSize (0), + isPrepared (false), + inputStreamEOF (false) +{ +} + +AudioTransportSource::~AudioTransportSource() +{ + setSource (nullptr); + releaseMasterResources(); +} + +void AudioTransportSource::setSource (PositionableAudioSource* const newSource, + int readAheadSize, TimeSliceThread* readAheadThread, + double sourceSampleRateToCorrectFor, int maxNumChannels) +{ + if (source == newSource) + { + if (source == nullptr) + return; + + setSource (nullptr, 0, nullptr); // deselect and reselect to avoid releasing resources wrongly + } + + readAheadBufferSize = readAheadSize; + sourceSampleRate = sourceSampleRateToCorrectFor; + + ResamplingAudioSource* newResamplerSource = nullptr; + BufferingAudioSource* newBufferingSource = nullptr; + PositionableAudioSource* newPositionableSource = nullptr; + AudioSource* newMasterSource = nullptr; + + ScopedPointer oldResamplerSource (resamplerSource); + ScopedPointer oldBufferingSource (bufferingSource); + AudioSource* oldMasterSource = masterSource; + + if (newSource != nullptr) + { + newPositionableSource = newSource; + + if (readAheadSize > 0) + { + // If you want to use a read-ahead buffer, you must also provide a TimeSliceThread + // for it to use! + jassert (readAheadThread != nullptr); + + newPositionableSource = newBufferingSource + = new BufferingAudioSource (newPositionableSource, *readAheadThread, + false, readAheadSize, maxNumChannels); + } + + newPositionableSource->setNextReadPosition (0); + + if (sourceSampleRateToCorrectFor > 0) + newMasterSource = newResamplerSource + = new ResamplingAudioSource (newPositionableSource, false, maxNumChannels); + else + newMasterSource = newPositionableSource; + + if (isPrepared) + { + if (newResamplerSource != nullptr && sourceSampleRate > 0 && sampleRate > 0) + newResamplerSource->setResamplingRatio (sourceSampleRate / sampleRate); + + newMasterSource->prepareToPlay (blockSize, sampleRate); + } + } + + { + const ScopedLock sl (callbackLock); + + source = newSource; + resamplerSource = newResamplerSource; + bufferingSource = newBufferingSource; + masterSource = newMasterSource; + positionableSource = newPositionableSource; + + inputStreamEOF = false; + playing = false; + } + + if (oldMasterSource != nullptr) + oldMasterSource->releaseResources(); +} + +void AudioTransportSource::start() +{ + if ((! playing) && masterSource != nullptr) + { + { + const ScopedLock sl (callbackLock); + playing = true; + stopped = false; + inputStreamEOF = false; + } + + sendChangeMessage(); + } +} + +void AudioTransportSource::stop() +{ + if (playing) + { + { + const ScopedLock sl (callbackLock); + playing = false; + } + + int n = 500; + while (--n >= 0 && ! stopped) + Thread::sleep (2); + + sendChangeMessage(); + } +} + +void AudioTransportSource::setPosition (double newPosition) +{ + if (sampleRate > 0.0) + setNextReadPosition ((int64) (newPosition * sampleRate)); +} + +double AudioTransportSource::getCurrentPosition() const +{ + if (sampleRate > 0.0) + return getNextReadPosition() / sampleRate; + + return 0.0; +} + +double AudioTransportSource::getLengthInSeconds() const +{ + if (sampleRate > 0.0) + return getTotalLength() / sampleRate; + + return 0.0; +} + +void AudioTransportSource::setNextReadPosition (int64 newPosition) +{ + if (positionableSource != nullptr) + { + if (sampleRate > 0 && sourceSampleRate > 0) + newPosition = (int64) (newPosition * sourceSampleRate / sampleRate); + + positionableSource->setNextReadPosition (newPosition); + + if (resamplerSource != nullptr) + resamplerSource->flushBuffers(); + + inputStreamEOF = false; + } +} + +int64 AudioTransportSource::getNextReadPosition() const +{ + if (positionableSource != nullptr) + { + const double ratio = (sampleRate > 0 && sourceSampleRate > 0) ? sampleRate / sourceSampleRate : 1.0; + return (int64) (positionableSource->getNextReadPosition() * ratio); + } + + return 0; +} + +int64 AudioTransportSource::getTotalLength() const +{ + const ScopedLock sl (callbackLock); + + if (positionableSource != nullptr) + { + const double ratio = (sampleRate > 0 && sourceSampleRate > 0) ? sampleRate / sourceSampleRate : 1.0; + return (int64) (positionableSource->getTotalLength() * ratio); + } + + return 0; +} + +bool AudioTransportSource::isLooping() const +{ + const ScopedLock sl (callbackLock); + return positionableSource != nullptr && positionableSource->isLooping(); +} + +void AudioTransportSource::setGain (const float newGain) noexcept +{ + gain = newGain; +} + +void AudioTransportSource::prepareToPlay (int samplesPerBlockExpected, double newSampleRate) +{ + const ScopedLock sl (callbackLock); + + sampleRate = newSampleRate; + blockSize = samplesPerBlockExpected; + + if (masterSource != nullptr) + masterSource->prepareToPlay (samplesPerBlockExpected, sampleRate); + + if (resamplerSource != nullptr && sourceSampleRate > 0) + resamplerSource->setResamplingRatio (sourceSampleRate / sampleRate); + + inputStreamEOF = false; + isPrepared = true; +} + +void AudioTransportSource::releaseMasterResources() +{ + const ScopedLock sl (callbackLock); + + if (masterSource != nullptr) + masterSource->releaseResources(); + + isPrepared = false; +} + +void AudioTransportSource::releaseResources() +{ + releaseMasterResources(); +} + +void AudioTransportSource::getNextAudioBlock (const AudioSourceChannelInfo& info) +{ + const ScopedLock sl (callbackLock); + + if (masterSource != nullptr && ! stopped) + { + masterSource->getNextAudioBlock (info); + + if (! playing) + { + // just stopped playing, so fade out the last block.. + for (int i = info.buffer->getNumChannels(); --i >= 0;) + info.buffer->applyGainRamp (i, info.startSample, jmin (256, info.numSamples), 1.0f, 0.0f); + + if (info.numSamples > 256) + info.buffer->clear (info.startSample + 256, info.numSamples - 256); + } + + if (positionableSource->getNextReadPosition() > positionableSource->getTotalLength() + 1 + && ! positionableSource->isLooping()) + { + playing = false; + inputStreamEOF = true; + sendChangeMessage(); + } + + stopped = ! playing; + + for (int i = info.buffer->getNumChannels(); --i >= 0;) + info.buffer->applyGainRamp (i, info.startSample, info.numSamples, lastGain, gain); + } + else + { + info.clearActiveBufferRegion(); + stopped = true; + } + + lastGain = gain; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h new file mode 100644 index 0000000000..e60dee013a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h @@ -0,0 +1,180 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOTRANSPORTSOURCE_H_INCLUDED +#define JUCE_AUDIOTRANSPORTSOURCE_H_INCLUDED + + +//============================================================================== +/** + An AudioSource that takes a PositionableAudioSource and allows it to be + played, stopped, started, etc. + + This can also be told use a buffer and background thread to read ahead, and + if can correct for different sample-rates. + + You may want to use one of these along with an AudioSourcePlayer and AudioIODevice + to control playback of an audio file. + + @see AudioSource, AudioSourcePlayer +*/ +class JUCE_API AudioTransportSource : public PositionableAudioSource, + public ChangeBroadcaster +{ +public: + //============================================================================== + /** Creates an AudioTransportSource. + After creating one of these, use the setSource() method to select an input source. + */ + AudioTransportSource(); + + /** Destructor. */ + ~AudioTransportSource(); + + //============================================================================== + /** Sets the reader that is being used as the input source. + + This will stop playback, reset the position to 0 and change to the new reader. + + The source passed in will not be deleted by this object, so must be managed by + the caller. + + @param newSource the new input source to use. This may be zero + @param readAheadBufferSize a size of buffer to use for reading ahead. If this + is zero, no reading ahead will be done; if it's + greater than zero, a BufferingAudioSource will be used + to do the reading-ahead. If you set a non-zero value here, + you'll also need to set the readAheadThread parameter. + @param readAheadThread if you set readAheadBufferSize to a non-zero value, then + you'll also need to supply this TimeSliceThread object for + the background reader to use. The thread object must not be + deleted while the AudioTransport source is still using it. + @param sourceSampleRateToCorrectFor if this is non-zero, it specifies the sample + rate of the source, and playback will be sample-rate + adjusted to maintain playback at the correct pitch. If + this is 0, no sample-rate adjustment will be performed + @param maxNumChannels the maximum number of channels that may need to be played + */ + void setSource (PositionableAudioSource* newSource, + int readAheadBufferSize = 0, + TimeSliceThread* readAheadThread = nullptr, + double sourceSampleRateToCorrectFor = 0.0, + int maxNumChannels = 2); + + //============================================================================== + /** Changes the current playback position in the source stream. + + The next time the getNextAudioBlock() method is called, this + is the time from which it'll read data. + + @see getPosition + */ + void setPosition (double newPosition); + + /** Returns the position that the next data block will be read from + This is a time in seconds. + */ + double getCurrentPosition() const; + + /** Returns the stream's length in seconds. */ + double getLengthInSeconds() const; + + /** Returns true if the player has stopped because its input stream ran out of data. */ + bool hasStreamFinished() const noexcept { return inputStreamEOF; } + + //============================================================================== + /** Starts playing (if a source has been selected). + + If it starts playing, this will send a message to any ChangeListeners + that are registered with this object. + */ + void start(); + + /** Stops playing. + + If it's actually playing, this will send a message to any ChangeListeners + that are registered with this object. + */ + void stop(); + + /** Returns true if it's currently playing. */ + bool isPlaying() const noexcept { return playing; } + + //============================================================================== + /** Changes the gain to apply to the output. + @param newGain a factor by which to multiply the outgoing samples, + so 1.0 = 0dB, 0.5 = -6dB, 2.0 = 6dB, etc. + */ + void setGain (float newGain) noexcept; + + /** Returns the current gain setting. + @see setGain + */ + float getGain() const noexcept { return gain; } + + //============================================================================== + /** Implementation of the AudioSource method. */ + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + + /** Implementation of the AudioSource method. */ + void releaseResources() override; + + /** Implementation of the AudioSource method. */ + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + + //============================================================================== + /** Implements the PositionableAudioSource method. */ + void setNextReadPosition (int64 newPosition) override; + + /** Implements the PositionableAudioSource method. */ + int64 getNextReadPosition() const override; + + /** Implements the PositionableAudioSource method. */ + int64 getTotalLength() const override; + + /** Implements the PositionableAudioSource method. */ + bool isLooping() const override; + +private: + //============================================================================== + PositionableAudioSource* source; + ResamplingAudioSource* resamplerSource; + BufferingAudioSource* bufferingSource; + PositionableAudioSource* positionableSource; + AudioSource* masterSource; + + CriticalSection callbackLock; + float volatile gain, lastGain; + bool volatile playing, stopped; + double sampleRate, sourceSampleRate; + int blockSize, readAheadBufferSize; + bool volatile isPrepared, inputStreamEOF; + + void releaseMasterResources(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioTransportSource) +}; + + +#endif // JUCE_AUDIOTRANSPORTSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt new file mode 100644 index 0000000000..39992bdfbe --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt @@ -0,0 +1,49 @@ + +===================================================================== + +I've incorporated FLAC directly into the Juce codebase because it makes +things much easier than having to make all your builds link correctly to +the appropriate libraries on every different platform. + +I've made minimal changes to the FLAC code - just tweaked a few include paths +to make it build smoothly, added some headers to allow you to turn off FLAC +compilation, and commented-out a couple of unused bits of code. + +===================================================================== + + +The following license is the BSD-style license that comes with the +Flac distribution, and which applies just to the files I've +included in this directory. For more info, and to get the rest of the +distribution, visit the Flac homepage: flac.sourceforge.net + +===================================================================== + +Copyright (C) 2000,2001,2002,2003,2004,2005,2006 Josh Coalson + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h new file mode 100644 index 0000000000..cc01e0511d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h @@ -0,0 +1,371 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__ALL_H +#define FLAC__ALL_H + +#include "export.h" + +#include "assert.h" +#include "callback.h" +#include "format.h" +#include "metadata.h" +#include "ordinals.h" +#include "stream_decoder.h" +#include "stream_encoder.h" + +/** \mainpage + * + * \section intro Introduction + * + * This is the documentation for the FLAC C and C++ APIs. It is + * highly interconnected; this introduction should give you a top + * level idea of the structure and how to find the information you + * need. As a prerequisite you should have at least a basic + * knowledge of the FLAC format, documented + * here. + * + * \section c_api FLAC C API + * + * The FLAC C API is the interface to libFLAC, a set of structures + * describing the components of FLAC streams, and functions for + * encoding and decoding streams, as well as manipulating FLAC + * metadata in files. The public include files will be installed + * in your include area (for example /usr/include/FLAC/...). + * + * By writing a little code and linking against libFLAC, it is + * relatively easy to add FLAC support to another program. The + * library is licensed under Xiph's BSD license. + * Complete source code of libFLAC as well as the command-line + * encoder and plugins is available and is a useful source of + * examples. + * + * Aside from encoders and decoders, libFLAC provides a powerful + * metadata interface for manipulating metadata in FLAC files. It + * allows the user to add, delete, and modify FLAC metadata blocks + * and it can automatically take advantage of PADDING blocks to avoid + * rewriting the entire FLAC file when changing the size of the + * metadata. + * + * libFLAC usually only requires the standard C library and C math + * library. In particular, threading is not used so there is no + * dependency on a thread library. However, libFLAC does not use + * global variables and should be thread-safe. + * + * libFLAC also supports encoding to and decoding from Ogg FLAC. + * However the metadata editing interfaces currently have limited + * read-only support for Ogg FLAC files. + * + * \section cpp_api FLAC C++ API + * + * The FLAC C++ API is a set of classes that encapsulate the + * structures and functions in libFLAC. They provide slightly more + * functionality with respect to metadata but are otherwise + * equivalent. For the most part, they share the same usage as + * their counterparts in libFLAC, and the FLAC C API documentation + * can be used as a supplement. The public include files + * for the C++ API will be installed in your include area (for + * example /usr/include/FLAC++/...). + * + * libFLAC++ is also licensed under + * Xiph's BSD license. + * + * \section getting_started Getting Started + * + * A good starting point for learning the API is to browse through + * the modules. Modules are logical + * groupings of related functions or classes, which correspond roughly + * to header files or sections of header files. Each module includes a + * detailed description of the general usage of its functions or + * classes. + * + * From there you can go on to look at the documentation of + * individual functions. You can see different views of the individual + * functions through the links in top bar across this page. + * + * If you prefer a more hands-on approach, you can jump right to some + * example code. + * + * \section porting_guide Porting Guide + * + * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink + * has been introduced which gives detailed instructions on how to + * port your code to newer versions of FLAC. + * + * \section embedded_developers Embedded Developers + * + * libFLAC has grown larger over time as more functionality has been + * included, but much of it may be unnecessary for a particular embedded + * implementation. Unused parts may be pruned by some simple editing of + * src/libFLAC/Makefile.am. In general, the decoders, encoders, and + * metadata interface are all independent from each other. + * + * It is easiest to just describe the dependencies: + * + * - All modules depend on the \link flac_format Format \endlink module. + * - The decoders and encoders depend on the bitbuffer. + * - The decoder is independent of the encoder. The encoder uses the + * decoder because of the verify feature, but this can be removed if + * not needed. + * - Parts of the metadata interface require the stream decoder (but not + * the encoder). + * - Ogg support is selectable through the compile time macro + * \c FLAC__HAS_OGG. + * + * For example, if your application only requires the stream decoder, no + * encoder, and no metadata interface, you can remove the stream encoder + * and the metadata interface, which will greatly reduce the size of the + * library. + * + * Also, there are several places in the libFLAC code with comments marked + * with "OPT:" where a #define can be changed to enable code that might be + * faster on a specific platform. Experimenting with these can yield faster + * binaries. + */ + +/** \defgroup porting Porting Guide for New Versions + * + * This module describes differences in the library interfaces from + * version to version. It assists in the porting of code that uses + * the libraries to newer versions of FLAC. + * + * One simple facility for making porting easier that has been added + * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each + * library's includes (e.g. \c include/FLAC/export.h). The + * \c #defines mirror the libraries' + * libtool version numbers, + * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, + * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. + * These can be used to support multiple versions of an API during the + * transition phase, e.g. + * + * \code + * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 + * legacy code + * #else + * new code + * #endif + * \endcode + * + * The the source will work for multiple versions and the legacy code can + * easily be removed when the transition is complete. + * + * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in + * include/FLAC/export.h), which can be used to determine whether or not + * the library has been compiled with support for Ogg FLAC. This is + * simpler than trying to call an Ogg init function and catching the + * error. + */ + +/** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 + * \ingroup porting + * + * \brief + * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. + * + * The main change between the APIs in 1.1.2 and 1.1.3 is that they have + * been simplified. First, libOggFLAC has been merged into libFLAC and + * libOggFLAC++ has been merged into libFLAC++. Second, both the three + * decoding layers and three encoding layers have been merged into a + * single stream decoder and stream encoder. That is, the functionality + * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged + * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and + * FLAC__FileEncoder into FLAC__StreamEncoder. Only the + * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means + * is there is now a single API that can be used to encode or decode + * streams to/from native FLAC or Ogg FLAC and the single API can work + * on both seekable and non-seekable streams. + * + * Instead of creating an encoder or decoder of a certain layer, now the + * client will always create a FLAC__StreamEncoder or + * FLAC__StreamDecoder. The old layers are now differentiated by the + * initialization function. For example, for the decoder, + * FLAC__stream_decoder_init() has been replaced by + * FLAC__stream_decoder_init_stream(). This init function takes + * callbacks for the I/O, and the seeking callbacks are optional. This + * allows the client to use the same object for seekable and + * non-seekable streams. For decoding a FLAC file directly, the client + * can use FLAC__stream_decoder_init_file() and pass just a filename + * and fewer callbacks; most of the other callbacks are supplied + * internally. For situations where fopen()ing by filename is not + * possible (e.g. Unicode filenames on Windows) the client can instead + * open the file itself and supply the FILE* to + * FLAC__stream_decoder_init_FILE(). The init functions now returns a + * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. + * Since the callbacks and client data are now passed to the init + * function, the FLAC__stream_decoder_set_*_callback() functions and + * FLAC__stream_decoder_set_client_data() are no longer needed. The + * rest of the calls to the decoder are the same as before. + * + * There are counterpart init functions for Ogg FLAC, e.g. + * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls + * and callbacks are the same as for native FLAC. + * + * As an example, in FLAC 1.1.2 a seekable stream decoder would have + * been set up like so: + * + * \code + * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); + * if(decoder == NULL) do_something; + * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); + * [... other settings ...] + * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); + * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); + * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); + * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); + * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); + * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); + * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); + * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); + * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); + * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; + * \endcode + * + * In FLAC 1.1.3 it is like this: + * + * \code + * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); + * if(decoder == NULL) do_something; + * FLAC__stream_decoder_set_md5_checking(decoder, true); + * [... other settings ...] + * if(FLAC__stream_decoder_init_stream( + * decoder, + * my_read_callback, + * my_seek_callback, // or NULL + * my_tell_callback, // or NULL + * my_length_callback, // or NULL + * my_eof_callback, // or NULL + * my_write_callback, + * my_metadata_callback, // or NULL + * my_error_callback, + * my_client_data + * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; + * \endcode + * + * or you could do; + * + * \code + * [...] + * FILE *file = fopen("somefile.flac","rb"); + * if(file == NULL) do_somthing; + * if(FLAC__stream_decoder_init_FILE( + * decoder, + * file, + * my_write_callback, + * my_metadata_callback, // or NULL + * my_error_callback, + * my_client_data + * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; + * \endcode + * + * or just: + * + * \code + * [...] + * if(FLAC__stream_decoder_init_file( + * decoder, + * "somefile.flac", + * my_write_callback, + * my_metadata_callback, // or NULL + * my_error_callback, + * my_client_data + * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; + * \endcode + * + * Another small change to the decoder is in how it handles unparseable + * streams. Before, when the decoder found an unparseable stream + * (reserved for when the decoder encounters a stream from a future + * encoder that it can't parse), it changed the state to + * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead + * drops sync and calls the error callback with a new error code + * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is + * more robust. If your error callback does not discriminate on the the + * error state, your code does not need to be changed. + * + * The encoder now has a new setting: + * FLAC__stream_encoder_set_apodization(). This is for setting the + * method used to window the data before LPC analysis. You only need to + * add a call to this function if the default is not suitable. There + * are also two new convenience functions that may be useful: + * FLAC__metadata_object_cuesheet_calculate_cddb_id() and + * FLAC__metadata_get_cuesheet(). + * + * The \a bytes parameter to FLAC__StreamDecoderReadCallback, + * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback + * is now \c size_t instead of \c unsigned. + */ + +/** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 + * \ingroup porting + * + * \brief + * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. + * + * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. + * There was a slight change in the implementation of + * FLAC__stream_encoder_set_metadata(); the function now makes a copy + * of the \a metadata array of pointers so the client no longer needs + * to maintain it after the call. The objects themselves that are + * pointed to by the array are still not copied though and must be + * maintained until the call to FLAC__stream_encoder_finish(). + */ + +/** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 + * \ingroup porting + * + * \brief + * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. + * + * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. + * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. + * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. + * + * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN + * has changed to reflect the conversion of one of the reserved bits + * into active use. It used to be \c 2 and now is \c 1. However the + * FLAC frame header length has not changed, so to skip the proper + * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + + * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN + */ + +/** \defgroup flac FLAC C API + * + * The FLAC C API is the interface to libFLAC, a set of structures + * describing the components of FLAC streams, and functions for + * encoding and decoding streams, as well as manipulating FLAC + * metadata in files. + * + * You should start with the format components as all other modules + * are dependent on it. + */ + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h new file mode 100644 index 0000000000..83595ac1bb --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h @@ -0,0 +1,209 @@ +/* alloc - Convenience routines for safely allocating memory + * Copyright (C) 2007-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__SHARE__ALLOC_H +#define FLAC__SHARE__ALLOC_H + +#if HAVE_CONFIG_H +# include +#endif + +/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early + * before #including this file, otherwise SIZE_MAX might not be defined + */ + +#include /* for SIZE_MAX */ +#if HAVE_STDINT_H +#include /* for SIZE_MAX in case limits.h didn't get it */ +#endif +#include /* for size_t, malloc(), etc */ +#include "compat.h" + +#ifndef SIZE_MAX +# ifndef SIZE_T_MAX +# ifdef _MSC_VER +# ifdef _WIN64 +# define SIZE_T_MAX 0xffffffffffffffffui64 +# else +# define SIZE_T_MAX 0xffffffff +# endif +# else +# error +# endif +# endif +# define SIZE_MAX SIZE_T_MAX +#endif + +/* avoid malloc()ing 0 bytes, see: + * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 +*/ +static inline void *safe_malloc_(size_t size) +{ + /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if(!size) + size++; + return malloc(size); +} + +static inline void *safe_calloc_(size_t nmemb, size_t size) +{ + if(!nmemb || !size) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + return calloc(nmemb, size); +} + +/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ + +static inline void *safe_malloc_add_2op_(size_t size1, size_t size2) +{ + size2 += size1; + if(size2 < size1) + return 0; + return safe_malloc_(size2); +} + +static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + return safe_malloc_(size3); +} + +static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + size4 += size3; + if(size4 < size3) + return 0; + return safe_malloc_(size4); +} + +void *safe_malloc_mul_2op_(size_t size1, size_t size2) ; + +static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) +{ + if(!size1 || !size2 || !size3) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if(size1 > SIZE_MAX / size2) + return 0; + size1 *= size2; + if(size1 > SIZE_MAX / size3) + return 0; + return malloc(size1*size3); +} + +/* size1*size2 + size3 */ +static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) +{ + if(!size1 || !size2) + return safe_malloc_(size3); + if(size1 > SIZE_MAX / size2) + return 0; + return safe_malloc_add_2op_(size1*size2, size3); +} + +/* size1 * (size2 + size3) */ +static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) +{ + if(!size1 || (!size2 && !size3)) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + size2 += size3; + if(size2 < size3) + return 0; + if(size1 > SIZE_MAX / size2) + return 0; + return malloc(size1*size2); +} + +static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) +{ + size2 += size1; + if(size2 < size1) + return 0; + return realloc(ptr, size2); +} + +static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + return realloc(ptr, size3); +} + +static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + size4 += size3; + if(size4 < size3) + return 0; + return realloc(ptr, size4); +} + +static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) +{ + if(!size1 || !size2) + return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ + if(size1 > SIZE_MAX / size2) + return 0; + return realloc(ptr, size1*size2); +} + +/* size1 * (size2 + size3) */ +static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) +{ + if(!size1 || (!size2 && !size3)) + return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ + size2 += size3; + if(size2 < size3) + return 0; + return safe_realloc_mul_2op_(ptr, size1, size2); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h new file mode 100644 index 0000000000..fab30f7e83 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h @@ -0,0 +1,46 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__ASSERT_H +#define FLAC__ASSERT_H + +/* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ +#ifdef DEBUG +#include +#define FLAC__ASSERT(x) assert(x) +#define FLAC__ASSERT_DECLARATION(x) x +#else +#define FLAC__ASSERT(x) +#define FLAC__ASSERT_DECLARATION(x) +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h new file mode 100644 index 0000000000..5f58552cef --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h @@ -0,0 +1,185 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2004-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__CALLBACK_H +#define FLAC__CALLBACK_H + +#include "ordinals.h" +#include /* for size_t */ + +/** \file include/FLAC/callback.h + * + * \brief + * This module defines the structures for describing I/O callbacks + * to the other FLAC interfaces. + * + * See the detailed documentation for callbacks in the + * \link flac_callbacks callbacks \endlink module. + */ + +/** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures + * \ingroup flac + * + * \brief + * This module defines the structures for describing I/O callbacks + * to the other FLAC interfaces. + * + * The purpose of the I/O callback functions is to create a common way + * for the metadata interfaces to handle I/O. + * + * Originally the metadata interfaces required filenames as the way of + * specifying FLAC files to operate on. This is problematic in some + * environments so there is an additional option to specify a set of + * callbacks for doing I/O on the FLAC file, instead of the filename. + * + * In addition to the callbacks, a FLAC__IOHandle type is defined as an + * opaque structure for a data source. + * + * The callback function prototypes are similar (but not identical) to the + * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use + * stdio streams to implement the callbacks, you can pass fread, fwrite, and + * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or + * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle + * is required. \warning You generally CANNOT directly use fseek or ftell + * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems + * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with + * large files. You will have to find an equivalent function (e.g. ftello), + * or write a wrapper. The same is true for feof() since this is usually + * implemented as a macro, not as a function whose address can be taken. + * + * \{ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the opaque handle type used by the callbacks. Typically + * this is a \c FILE* or address of a file descriptor. + */ +typedef void* FLAC__IOHandle; + +/** Signature for the read callback. + * The signature and semantics match POSIX fread() implementations + * and can generally be used interchangeably. + * + * \param ptr The address of the read buffer. + * \param size The size of the records to be read. + * \param nmemb The number of records to be read. + * \param handle The handle to the data source. + * \retval size_t + * The number of records read. + */ +typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); + +/** Signature for the write callback. + * The signature and semantics match POSIX fwrite() implementations + * and can generally be used interchangeably. + * + * \param ptr The address of the write buffer. + * \param size The size of the records to be written. + * \param nmemb The number of records to be written. + * \param handle The handle to the data source. + * \retval size_t + * The number of records written. + */ +typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); + +/** Signature for the seek callback. + * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT + * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' + * and 32-bits wide. + * + * \param handle The handle to the data source. + * \param offset The new position, relative to \a whence + * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END + * \retval int + * \c 0 on success, \c -1 on error. + */ +typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); + +/** Signature for the tell callback. + * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT + * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' + * and 32-bits wide. + * + * \param handle The handle to the data source. + * \retval FLAC__int64 + * The current position on success, \c -1 on error. + */ +typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); + +/** Signature for the EOF callback. + * The signature and semantics mostly match POSIX feof() but WATCHOUT: + * on many systems, feof() is a macro, so in this case a wrapper function + * must be provided instead. + * + * \param handle The handle to the data source. + * \retval int + * \c 0 if not at end of file, nonzero if at end of file. + */ +typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); + +/** Signature for the close callback. + * The signature and semantics match POSIX fclose() implementations + * and can generally be used interchangeably. + * + * \param handle The handle to the data source. + * \retval int + * \c 0 on success, \c EOF on error. + */ +typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); + +/** A structure for holding a set of callbacks. + * Each FLAC interface that requires a FLAC__IOCallbacks structure will + * describe which of the callbacks are required. The ones that are not + * required may be set to NULL. + * + * If the seek requirement for an interface is optional, you can signify that + * a data sorce is not seekable by setting the \a seek field to \c NULL. + */ +typedef struct { + FLAC__IOCallback_Read read; + FLAC__IOCallback_Write write; + FLAC__IOCallback_Seek seek; + FLAC__IOCallback_Tell tell; + FLAC__IOCallback_Eof eof; + FLAC__IOCallback_Close close; +} FLAC__IOCallbacks; + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h new file mode 100644 index 0000000000..6c436cc101 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h @@ -0,0 +1,195 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2012 Xiph.org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* This is the prefered location of all CPP hackery to make $random_compiler + * work like something approaching a C99 (or maybe more accurately GNU99) + * compiler. + * + * It is assumed that this header will be included after "config.h". + */ + +#ifndef FLAC__SHARE__COMPAT_H +#define FLAC__SHARE__COMPAT_H + +#if defined _WIN32 && !defined __CYGWIN__ +/* where MSVC puts unlink() */ +# include +#else +# include +#endif + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#include /* for off_t */ +#define FLAC__off_t __int64 /* use this instead of off_t to fix the 2 GB limit */ +#if !defined __MINGW32__ +#define fseeko _fseeki64 +#define ftello _ftelli64 +#else /* MinGW */ +#if !defined(HAVE_FSEEKO) +#define fseeko fseeko64 +#define ftello ftello64 +#endif +#endif +#else +#define FLAC__off_t off_t +#endif + +#if HAVE_INTTYPES_H +#define __STDC_FORMAT_MACROS +#include +#endif + +#if defined(_MSC_VER) +#define strtoll _strtoi64 +#define strtoull _strtoui64 +#endif + +#if defined(_MSC_VER) +#if _MSC_VER < 1500 +/* Visual Studio 2008 has restrict. */ +#define restrict __restrict +#endif +#define inline __inline +#endif + +/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ +#ifdef _MSC_VER +#define FLAC__U64L(x) x +#else +#define FLAC__U64L(x) x##LLU +#endif + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#define FLAC__STRNCASECMP strnicmp +#else +#define FLAC__STRNCASECMP strncasecmp +#endif + +#if defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ || defined __EMX__ +#include /* for _setmode(), chmod() */ +#include /* for _O_BINARY */ +#else +#include /* for chown(), unlink() */ +#endif + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#if defined __BORLANDC__ +#include /* for utime() */ +#else +#include /* for utime() */ +#endif +#else +#include /* some flavors of BSD (like OS X) require this to get time_t */ +#include /* for utime() */ +#endif + +#if defined _MSC_VER +# if _MSC_VER >= 1600 +/* Visual Studio 2010 has decent C99 support */ +# include +# define PRIu64 "llu" +# define PRId64 "lld" +# define PRIx64 "llx" +# else +# include +# ifndef UINT32_MAX +# define UINT32_MAX _UI32_MAX +# endif + typedef unsigned __int64 uint64_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int8 uint8_t; + typedef __int64 int64_t; + typedef __int32 int32_t; + typedef __int16 int16_t; + typedef __int8 int8_t; +# define PRIu64 "I64u" +# define PRId64 "I64d" +# define PRIx64 "I64x" +# endif +#endif /* defined _MSC_VER */ + +#ifdef _WIN32 +/* All char* strings are in UTF-8 format. Added to support Unicode files on Windows */ + +#define flac_printf printf_utf8 +#define flac_fprintf fprintf_utf8 +#define flac_vfprintf vfprintf_utf8 +#define flac_fopen fopen_utf8 +#define flac_chmod chmod_utf8 +#define flac_utime utime_utf8 +#define flac_unlink unlink_utf8 +#define flac_rename rename_utf8 +#define flac_stat _stat64_utf8 + +#else + +#define flac_printf printf +#define flac_fprintf fprintf +#define flac_vfprintf vfprintf +#define flac_fopen fopen +#define flac_chmod chmod +#define flac_utime utime +#define flac_unlink unlink +#define flac_rename rename + +#ifdef _WIN32 +#define flac_stat _stat64 +#else +#define flac_stat stat +#endif + +#endif + +#ifdef _WIN32 +#define flac_stat_s __stat64 /* stat struct */ +#define flac_fstat _fstat64 +#else +#define flac_stat_s stat /* stat struct */ +#define flac_fstat fstat +#endif + + +/* FLAC needs to compile and work correctly on systems with a norrmal ISO C99 + * snprintf as well as Microsoft Visual Studio which has an non-standards + * conformant snprint_s function. + * + * This function wraps the MS version to behave more like the the ISO version. + */ +#ifdef __cplusplus +extern "C" { +#endif +int flac_snprintf(char *str, size_t size, const char *fmt, ...); +#ifdef __cplusplus +}; +#endif + +#endif /* FLAC__SHARE__COMPAT_H */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h new file mode 100644 index 0000000000..2e09404bf1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h @@ -0,0 +1,52 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2012 Xiph.org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* It is assumed that this header will be included after "config.h". */ + +#if HAVE_BSWAP32 /* GCC and Clang */ + +#define ENDSWAP_32(x) (__builtin_bswap32 (x)) + +#elif defined _MSC_VER /* Windows. Apparently in . */ + +#define ENDSWAP_32(x) (_byteswap_ulong (x)) + +#elif defined HAVE_BYTESWAP_H /* Linux */ + +#include + +#define ENDSWAP_32(x) (bswap_32 (x)) + +#else + +#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24)) + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h new file mode 100644 index 0000000000..d7ca735ee6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h @@ -0,0 +1,97 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__EXPORT_H +#define FLAC__EXPORT_H + +/** \file include/FLAC/export.h + * + * \brief + * This module contains #defines and symbols for exporting function + * calls, and providing version information and compiled-in features. + * + * See the \link flac_export export \endlink module. + */ + +/** \defgroup flac_export FLAC/export.h: export symbols + * \ingroup flac + * + * \brief + * This module contains #defines and symbols for exporting function + * calls, and providing version information and compiled-in features. + * + * If you are compiling with MSVC and will link to the static library + * (libFLAC.lib) you should define FLAC__NO_DLL in your project to + * make sure the symbols are exported properly. + * + * \{ + */ + +#if defined(FLAC__NO_DLL) +#define FLAC_API + +#elif defined(_MSC_VER) +#ifdef FLAC_API_EXPORTS +#define FLAC_API _declspec(dllexport) +#else +#define FLAC_API _declspec(dllimport) +#endif + +#elif defined(FLAC__USE_VISIBILITY_ATTR) +#define FLAC_API __attribute__ ((visibility ("default"))) + +#else +#define FLAC_API + +#endif + +/** These #defines will mirror the libtool-based library version number, see + * http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning + */ +#define FLAC_API_VERSION_CURRENT 11 +#define FLAC_API_VERSION_REVISION 0 /**< see above */ +#define FLAC_API_VERSION_AGE 3 /**< see above */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ +extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; + +#ifdef __cplusplus +} +#endif + +/* \} */ + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h new file mode 100644 index 0000000000..ecebe80281 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h @@ -0,0 +1,1023 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__FORMAT_H +#define FLAC__FORMAT_H + +#include "export.h" +#include "ordinals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file include/FLAC/format.h + * + * \brief + * This module contains structure definitions for the representation + * of FLAC format components in memory. These are the basic + * structures used by the rest of the interfaces. + * + * See the detailed documentation in the + * \link flac_format format \endlink module. + */ + +/** \defgroup flac_format FLAC/format.h: format components + * \ingroup flac + * + * \brief + * This module contains structure definitions for the representation + * of FLAC format components in memory. These are the basic + * structures used by the rest of the interfaces. + * + * First, you should be familiar with the + * FLAC format. Many of the values here + * follow directly from the specification. As a user of libFLAC, the + * interesting parts really are the structures that describe the frame + * header and metadata blocks. + * + * The format structures here are very primitive, designed to store + * information in an efficient way. Reading information from the + * structures is easy but creating or modifying them directly is + * more complex. For the most part, as a user of a library, editing + * is not necessary; however, for metadata blocks it is, so there are + * convenience functions provided in the \link flac_metadata metadata + * module \endlink to simplify the manipulation of metadata blocks. + * + * \note + * It's not the best convention, but symbols ending in _LEN are in bits + * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of + * global variables because they are usually used when declaring byte + * arrays and some compilers require compile-time knowledge of array + * sizes when declared on the stack. + * + * \{ + */ + + +/* + Most of the values described in this file are defined by the FLAC + format specification. There is nothing to tune here. +*/ + +/** The largest legal metadata type code. */ +#define FLAC__MAX_METADATA_TYPE_CODE (126u) + +/** The minimum block size, in samples, permitted by the format. */ +#define FLAC__MIN_BLOCK_SIZE (16u) + +/** The maximum block size, in samples, permitted by the format. */ +#define FLAC__MAX_BLOCK_SIZE (65535u) + +/** The maximum block size, in samples, permitted by the FLAC subset for + * sample rates up to 48kHz. */ +#define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) + +/** The maximum number of channels permitted by the format. */ +#define FLAC__MAX_CHANNELS (8u) + +/** The minimum sample resolution permitted by the format. */ +#define FLAC__MIN_BITS_PER_SAMPLE (4u) + +/** The maximum sample resolution permitted by the format. */ +#define FLAC__MAX_BITS_PER_SAMPLE (32u) + +/** The maximum sample resolution permitted by libFLAC. + * + * \warning + * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, + * the reference encoder/decoder is currently limited to 24 bits because + * of prevalent 32-bit math, so make sure and use this value when + * appropriate. + */ +#define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) + +/** The maximum sample rate permitted by the format. The value is + * ((2 ^ 16) - 1) * 10; see FLAC format + * as to why. + */ +#define FLAC__MAX_SAMPLE_RATE (655350u) + +/** The maximum LPC order permitted by the format. */ +#define FLAC__MAX_LPC_ORDER (32u) + +/** The maximum LPC order permitted by the FLAC subset for sample rates + * up to 48kHz. */ +#define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) + +/** The minimum quantized linear predictor coefficient precision + * permitted by the format. + */ +#define FLAC__MIN_QLP_COEFF_PRECISION (5u) + +/** The maximum quantized linear predictor coefficient precision + * permitted by the format. + */ +#define FLAC__MAX_QLP_COEFF_PRECISION (15u) + +/** The maximum order of the fixed predictors permitted by the format. */ +#define FLAC__MAX_FIXED_ORDER (4u) + +/** The maximum Rice partition order permitted by the format. */ +#define FLAC__MAX_RICE_PARTITION_ORDER (15u) + +/** The maximum Rice partition order permitted by the FLAC Subset. */ +#define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) + +/** The version string of the release, stamped onto the libraries and binaries. + * + * \note + * This does not correspond to the shared library version number, which + * is used to determine binary compatibility. + */ +extern FLAC_API const char *FLAC__VERSION_STRING; + +/** The vendor string inserted by the encoder into the VORBIS_COMMENT block. + * This is a NUL-terminated ASCII string; when inserted into the + * VORBIS_COMMENT the trailing null is stripped. + */ +extern FLAC_API const char *FLAC__VENDOR_STRING; + +/** The byte string representation of the beginning of a FLAC stream. */ +extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ + +/** The 32-bit integer big-endian representation of the beginning of + * a FLAC stream. + */ +extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */ + +/** The length of the FLAC signature in bits. */ +extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */ + +/** The length of the FLAC signature in bytes. */ +#define FLAC__STREAM_SYNC_LENGTH (4u) + + +/***************************************************************************** + * + * Subframe structures + * + *****************************************************************************/ + +/*****************************************************************************/ + +/** An enumeration of the available entropy coding methods. */ +typedef enum { + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, + /**< Residual is coded by partitioning into contexts, each with it's own + * 4-bit Rice parameter. */ + + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 + /**< Residual is coded by partitioning into contexts, each with it's own + * 5-bit Rice parameter. */ +} FLAC__EntropyCodingMethodType; + +/** Maps a FLAC__EntropyCodingMethodType to a C string. + * + * Using a FLAC__EntropyCodingMethodType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; + + +/** Contents of a Rice partitioned residual + */ +typedef struct { + + unsigned *parameters; + /**< The Rice parameters for each context. */ + + unsigned *raw_bits; + /**< Widths for escape-coded partitions. Will be non-zero for escaped + * partitions and zero for unescaped partitions. + */ + + unsigned capacity_by_order; + /**< The capacity of the \a parameters and \a raw_bits arrays + * specified as an order, i.e. the number of array elements + * allocated is 2 ^ \a capacity_by_order. + */ +} FLAC__EntropyCodingMethod_PartitionedRiceContents; + +/** Header for a Rice partitioned residual. (c.f. format specification) + */ +typedef struct { + + unsigned order; + /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ + + const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; + /**< The context's Rice parameters and/or raw bits. */ + +} FLAC__EntropyCodingMethod_PartitionedRice; + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN; /**< == 5 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */ + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; +/**< == (1<format specification) + */ +typedef struct { + FLAC__EntropyCodingMethodType type; + union { + FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; + } data; +} FLAC__EntropyCodingMethod; + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ + +/*****************************************************************************/ + +/** An enumeration of the available subframe types. */ +typedef enum { + FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ + FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ + FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ + FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ +} FLAC__SubframeType; + +/** Maps a FLAC__SubframeType to a C string. + * + * Using a FLAC__SubframeType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__SubframeTypeString[]; + + +/** CONSTANT subframe. (c.f. format specification) + */ +typedef struct { + FLAC__int32 value; /**< The constant signal value. */ +} FLAC__Subframe_Constant; + + +/** VERBATIM subframe. (c.f. format specification) + */ +typedef struct { + const FLAC__int32 *data; /**< A pointer to verbatim signal. */ +} FLAC__Subframe_Verbatim; + + +/** FIXED subframe. (c.f. format specification) + */ +typedef struct { + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ + + unsigned order; + /**< The polynomial order. */ + + FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ + + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ +} FLAC__Subframe_Fixed; + + +/** LPC subframe. (c.f. format specification) + */ +typedef struct { + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ + + unsigned order; + /**< The FIR order. */ + + unsigned qlp_coeff_precision; + /**< Quantized FIR filter coefficient precision in bits. */ + + int quantization_level; + /**< The qlp coeff shift needed. */ + + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + /**< FIR filter coefficients. */ + + FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ + + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ +} FLAC__Subframe_LPC; + +extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */ + + +/** FLAC subframe structure. (c.f. format specification) + */ +typedef struct { + FLAC__SubframeType type; + union { + FLAC__Subframe_Constant constant; + FLAC__Subframe_Fixed fixed; + FLAC__Subframe_LPC lpc; + FLAC__Subframe_Verbatim verbatim; + } data; + unsigned wasted_bits; +} FLAC__Subframe; + +/** == 1 (bit) + * + * This used to be a zero-padding bit (hence the name + * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a + * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 + * to mean something else. + */ +extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ +extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ + +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /**< = 0x00 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /**< = 0x02 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /**< = 0x10 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = 0x40 */ + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Frame structures + * + *****************************************************************************/ + +/** An enumeration of the available channel assignments. */ +typedef enum { + FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ + FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ +} FLAC__ChannelAssignment; + +/** Maps a FLAC__ChannelAssignment to a C string. + * + * Using a FLAC__ChannelAssignment as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; + +/** An enumeration of the possible frame numbering methods. */ +typedef enum { + FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ + FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ +} FLAC__FrameNumberType; + +/** Maps a FLAC__FrameNumberType to a C string. + * + * Using a FLAC__FrameNumberType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; + + +/** FLAC frame header structure. (c.f. format specification) + */ +typedef struct { + unsigned blocksize; + /**< The number of samples per subframe. */ + + unsigned sample_rate; + /**< The sample rate in Hz. */ + + unsigned channels; + /**< The number of channels (== number of subframes). */ + + FLAC__ChannelAssignment channel_assignment; + /**< The channel assignment for the frame. */ + + unsigned bits_per_sample; + /**< The sample resolution. */ + + FLAC__FrameNumberType number_type; + /**< The numbering scheme used for the frame. As a convenience, the + * decoder will always convert a frame number to a sample number because + * the rules are complex. */ + + union { + FLAC__uint32 frame_number; + FLAC__uint64 sample_number; + } number; + /**< The frame number or sample number of first sample in frame; + * use the \a number_type value to determine which to use. */ + + FLAC__uint8 crc; + /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) + * of the raw frame header bytes, meaning everything before the CRC byte + * including the sync code. + */ +} FLAC__FrameHeader; + +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 1 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN; /**< == 1 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ + + +/** FLAC frame footer structure. (c.f. format specification) + */ +typedef struct { + FLAC__uint16 crc; + /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with + * 0) of the bytes before the crc, back to and including the frame header + * sync code. + */ +} FLAC__FrameFooter; + +extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ + + +/** FLAC frame structure. (c.f. format specification) + */ +typedef struct { + FLAC__FrameHeader header; + FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; + FLAC__FrameFooter footer; +} FLAC__Frame; + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Meta-data structures + * + *****************************************************************************/ + +/** An enumeration of the available metadata block types. */ +typedef enum { + + FLAC__METADATA_TYPE_STREAMINFO = 0, + /**< STREAMINFO block */ + + FLAC__METADATA_TYPE_PADDING = 1, + /**< PADDING block */ + + FLAC__METADATA_TYPE_APPLICATION = 2, + /**< APPLICATION block */ + + FLAC__METADATA_TYPE_SEEKTABLE = 3, + /**< SEEKTABLE block */ + + FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, + /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ + + FLAC__METADATA_TYPE_CUESHEET = 5, + /**< CUESHEET block */ + + FLAC__METADATA_TYPE_PICTURE = 6, + /**< PICTURE block */ + + FLAC__METADATA_TYPE_UNDEFINED = 7 + /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ + +} FLAC__MetadataType; + +/** Maps a FLAC__MetadataType to a C string. + * + * Using a FLAC__MetadataType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__MetadataTypeString[]; + + +/** FLAC STREAMINFO structure. (c.f. format specification) + */ +typedef struct { + unsigned min_blocksize, max_blocksize; + unsigned min_framesize, max_framesize; + unsigned sample_rate; + unsigned channels; + unsigned bits_per_sample; + FLAC__uint64 total_samples; + FLAC__byte md5sum[16]; +} FLAC__StreamMetadata_StreamInfo; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */ + +/** The total stream length of the STREAMINFO block in bytes. */ +#define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) + +/** FLAC PADDING structure. (c.f. format specification) + */ +typedef struct { + int dummy; + /**< Conceptually this is an empty struct since we don't store the + * padding bytes. Empty structs are not allowed by some C compilers, + * hence the dummy. + */ +} FLAC__StreamMetadata_Padding; + + +/** FLAC APPLICATION structure. (c.f. format specification) + */ +typedef struct { + FLAC__byte id[4]; + FLAC__byte *data; +} FLAC__StreamMetadata_Application; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ + +/** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) + */ +typedef struct { + FLAC__uint64 sample_number; + /**< The sample number of the target frame. */ + + FLAC__uint64 stream_offset; + /**< The offset, in bytes, of the target frame with respect to + * beginning of the first frame. */ + + unsigned frame_samples; + /**< The number of samples in the target frame. */ +} FLAC__StreamMetadata_SeekPoint; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */ + +/** The total stream length of a seek point in bytes. */ +#define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) + +/** The value used in the \a sample_number field of + * FLAC__StreamMetadataSeekPoint used to indicate a placeholder + * point (== 0xffffffffffffffff). + */ +extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + + +/** FLAC SEEKTABLE structure. (c.f. format specification) + * + * \note From the format specification: + * - The seek points must be sorted by ascending sample number. + * - Each seek point's sample number must be the first sample of the + * target frame. + * - Each seek point's sample number must be unique within the table. + * - Existence of a SEEKTABLE block implies a correct setting of + * total_samples in the stream_info block. + * - Behavior is undefined when more than one SEEKTABLE block is + * present in a stream. + */ +typedef struct { + unsigned num_points; + FLAC__StreamMetadata_SeekPoint *points; +} FLAC__StreamMetadata_SeekTable; + + +/** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) + * + * For convenience, the APIs maintain a trailing NUL character at the end of + * \a entry which is not counted toward \a length, i.e. + * \code strlen(entry) == length \endcode + */ +typedef struct { + FLAC__uint32 length; + FLAC__byte *entry; +} FLAC__StreamMetadata_VorbisComment_Entry; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ + + +/** FLAC VORBIS_COMMENT structure. (c.f. format specification) + */ +typedef struct { + FLAC__StreamMetadata_VorbisComment_Entry vendor_string; + FLAC__uint32 num_comments; + FLAC__StreamMetadata_VorbisComment_Entry *comments; +} FLAC__StreamMetadata_VorbisComment; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ + + +/** FLAC CUESHEET track index structure. (See the + * format specification for + * the full description of each field.) + */ +typedef struct { + FLAC__uint64 offset; + /**< Offset in samples, relative to the track offset, of the index + * point. + */ + + FLAC__byte number; + /**< The index point number. */ +} FLAC__StreamMetadata_CueSheet_Index; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */ + + +/** FLAC CUESHEET track structure. (See the + * format specification for + * the full description of each field.) + */ +typedef struct { + FLAC__uint64 offset; + /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ + + FLAC__byte number; + /**< The track number. */ + + char isrc[13]; + /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ + + unsigned type:1; + /**< The track type: 0 for audio, 1 for non-audio. */ + + unsigned pre_emphasis:1; + /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ + + FLAC__byte num_indices; + /**< The number of track index points. */ + + FLAC__StreamMetadata_CueSheet_Index *indices; + /**< NULL if num_indices == 0, else pointer to array of index points. */ + +} FLAC__StreamMetadata_CueSheet_Track; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */ + + +/** FLAC CUESHEET structure. (See the + * format specification + * for the full description of each field.) + */ +typedef struct { + char media_catalog_number[129]; + /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In + * general, the media catalog number may be 0 to 128 bytes long; any + * unused characters should be right-padded with NUL characters. + */ + + FLAC__uint64 lead_in; + /**< The number of lead-in samples. */ + + FLAC__bool is_cd; + /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ + + unsigned num_tracks; + /**< The number of tracks. */ + + FLAC__StreamMetadata_CueSheet_Track *tracks; + /**< NULL if num_tracks == 0, else pointer to array of tracks. */ + +} FLAC__StreamMetadata_CueSheet; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */ + + +/** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ +typedef enum { + FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ + FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ + FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ + FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED +} FLAC__StreamMetadata_Picture_Type; + +/** Maps a FLAC__StreamMetadata_Picture_Type to a C string. + * + * Using a FLAC__StreamMetadata_Picture_Type as the index to this array + * will give the string equivalent. The contents should not be + * modified. + */ +extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; + +/** FLAC PICTURE structure. (See the + * format specification + * for the full description of each field.) + */ +typedef struct { + FLAC__StreamMetadata_Picture_Type type; + /**< The kind of picture stored. */ + + char *mime_type; + /**< Picture data's MIME type, in ASCII printable characters + * 0x20-0x7e, NUL terminated. For best compatibility with players, + * use picture data of MIME type \c image/jpeg or \c image/png. A + * MIME type of '-->' is also allowed, in which case the picture + * data should be a complete URL. In file storage, the MIME type is + * stored as a 32-bit length followed by the ASCII string with no NUL + * terminator, but is converted to a plain C string in this structure + * for convenience. + */ + + FLAC__byte *description; + /**< Picture's description in UTF-8, NUL terminated. In file storage, + * the description is stored as a 32-bit length followed by the UTF-8 + * string with no NUL terminator, but is converted to a plain C string + * in this structure for convenience. + */ + + FLAC__uint32 width; + /**< Picture's width in pixels. */ + + FLAC__uint32 height; + /**< Picture's height in pixels. */ + + FLAC__uint32 depth; + /**< Picture's color depth in bits-per-pixel. */ + + FLAC__uint32 colors; + /**< For indexed palettes (like GIF), picture's number of colors (the + * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). + */ + + FLAC__uint32 data_length; + /**< Length of binary picture data in bytes. */ + + FLAC__byte *data; + /**< Binary picture data. */ + +} FLAC__StreamMetadata_Picture; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /**< == 32 (bits) */ + + +/** Structure that is used when a metadata block of unknown type is loaded. + * The contents are opaque. The structure is used only internally to + * correctly handle unknown metadata. + */ +typedef struct { + FLAC__byte *data; +} FLAC__StreamMetadata_Unknown; + + +/** FLAC metadata block structure. (c.f. format specification) + */ +typedef struct { + FLAC__MetadataType type; + /**< The type of the metadata block; used determine which member of the + * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED + * then \a data.unknown must be used. */ + + FLAC__bool is_last; + /**< \c true if this metadata block is the last, else \a false */ + + unsigned length; + /**< Length, in bytes, of the block data as it appears in the stream. */ + + union { + FLAC__StreamMetadata_StreamInfo stream_info; + FLAC__StreamMetadata_Padding padding; + FLAC__StreamMetadata_Application application; + FLAC__StreamMetadata_SeekTable seek_table; + FLAC__StreamMetadata_VorbisComment vorbis_comment; + FLAC__StreamMetadata_CueSheet cue_sheet; + FLAC__StreamMetadata_Picture picture; + FLAC__StreamMetadata_Unknown unknown; + } data; + /**< Polymorphic block data; use the \a type value to determine which + * to use. */ +} FLAC__StreamMetadata; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */ + +/** The total stream length of a metadata block header in bytes. */ +#define FLAC__STREAM_METADATA_HEADER_LENGTH (4u) + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Utility functions + * + *****************************************************************************/ + +/** Tests that a sample rate is valid for FLAC. + * + * \param sample_rate The sample rate to test for compliance. + * \retval FLAC__bool + * \c true if the given sample rate conforms to the specification, else + * \c false. + */ +FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate); + +/** Tests that a blocksize at the given sample rate is valid for the FLAC + * subset. + * + * \param blocksize The blocksize to test for compliance. + * \param sample_rate The sample rate is needed, since the valid subset + * blocksize depends on the sample rate. + * \retval FLAC__bool + * \c true if the given blocksize conforms to the specification for the + * subset at the given sample rate, else \c false. + */ +FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate); + +/** Tests that a sample rate is valid for the FLAC subset. The subset rules + * for valid sample rates are slightly more complex since the rate has to + * be expressible completely in the frame header. + * + * \param sample_rate The sample rate to test for compliance. + * \retval FLAC__bool + * \c true if the given sample rate conforms to the specification for the + * subset, else \c false. + */ +FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate); + +/** Check a Vorbis comment entry name to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment names must be composed only of characters from + * [0x20-0x3C,0x3E-0x7D]. + * + * \param name A NUL-terminated string to be checked. + * \assert + * \code name != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); + +/** Check a Vorbis comment entry value to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment values must be valid UTF-8 sequences. + * + * \param value A string to be checked. + * \param length A the length of \a value in bytes. May be + * \c (unsigned)(-1) to indicate that \a value is a plain + * UTF-8 NUL-terminated string. + * \assert + * \code value != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length); + +/** Check a Vorbis comment entry to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment entries must be of the form 'name=value', and 'name' and + * 'value' must be legal according to + * FLAC__format_vorbiscomment_entry_name_is_legal() and + * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. + * + * \param entry An entry to be checked. + * \param length The length of \a entry in bytes. + * \assert + * \code value != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length); + +/** Check a seek table to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * seek table. + * + * \param seek_table A pointer to a seek table to be checked. + * \assert + * \code seek_table != NULL \endcode + * \retval FLAC__bool + * \c false if seek table is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); + +/** Sort a seek table's seek points according to the format specification. + * This includes a "unique-ification" step to remove duplicates, i.e. + * seek points with identical \a sample_number values. Duplicate seek + * points are converted into placeholder points and sorted to the end of + * the table. + * + * \param seek_table A pointer to a seek table to be sorted. + * \assert + * \code seek_table != NULL \endcode + * \retval unsigned + * The number of duplicate seek points converted into placeholders. + */ +FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); + +/** Check a cue sheet to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * cue sheet. + * + * \param cue_sheet A pointer to an existing cue sheet to be checked. + * \param check_cd_da_subset If \c true, check CUESHEET against more + * stringent requirements for a CD-DA (audio) disc. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code cue_sheet != NULL \endcode + * \retval FLAC__bool + * \c false if cue sheet is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); + +/** Check picture data to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * PICTURE block. + * + * \param picture A pointer to existing picture data to be checked. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code picture != NULL \endcode + * \retval FLAC__bool + * \c false if picture data is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c new file mode 100644 index 0000000000..3ea040efe4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c @@ -0,0 +1,110 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "include/private/bitmath.h" +#include "../assert.h" + +/* An example of what FLAC__bitmath_silog2() computes: + * + * silog2(-10) = 5 + * silog2(- 9) = 5 + * silog2(- 8) = 4 + * silog2(- 7) = 4 + * silog2(- 6) = 4 + * silog2(- 5) = 4 + * silog2(- 4) = 3 + * silog2(- 3) = 3 + * silog2(- 2) = 2 + * silog2(- 1) = 2 + * silog2( 0) = 0 + * silog2( 1) = 2 + * silog2( 2) = 3 + * silog2( 3) = 3 + * silog2( 4) = 4 + * silog2( 5) = 4 + * silog2( 6) = 4 + * silog2( 7) = 4 + * silog2( 8) = 5 + * silog2( 9) = 5 + * silog2( 10) = 5 + */ +unsigned FLAC__bitmath_silog2(int v) +{ + while(1) { + if(v == 0) { + return 0; + } + else if(v > 0) { + unsigned l = 0; + while(v) { + l++; + v >>= 1; + } + return l+1; + } + else if(v == -1) { + return 2; + } + else { + v++; + v = -v; + } + } +} + +unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) +{ + while(1) { + if(v == 0) { + return 0; + } + else if(v > 0) { + unsigned l = 0; + while(v) { + l++; + v >>= 1; + } + return l+1; + } + else if(v == -1) { + return 2; + } + else { + v++; + v = -v; + } + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c new file mode 100644 index 0000000000..3fc7e1df62 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c @@ -0,0 +1,1062 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "include/private/bitmath.h" +#include "include/private/bitreader.h" +#include "include/private/crc.h" +#include "../assert.h" +#include "../compat.h" +#include "../endswap.h" + +/* Things should be fastest when this matches the machine word size */ +/* WATCHOUT: if you change this you must also change the following #defines down to FLAC__clz_uint32 below to match */ +/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ +/* also, some sections currently only have fast versions for 4 or 8 bytes per word */ +#define FLAC__BYTES_PER_WORD 4 /* sizeof uint32_t */ +#define FLAC__BITS_PER_WORD (8 * FLAC__BYTES_PER_WORD) +#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) +/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ +#if WORDS_BIGENDIAN +#define SWAP_BE_WORD_TO_HOST(x) (x) +#else +#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) +#endif + +/* + * This should be at least twice as large as the largest number of words + * required to represent any 'number' (in any encoding) you are going to + * read. With FLAC this is on the order of maybe a few hundred bits. + * If the buffer is smaller than that, the decoder won't be able to read + * in a whole number that is in a variable length encoding (e.g. Rice). + * But to be practical it should be at least 1K bytes. + * + * Increase this number to decrease the number of read callbacks, at the + * expense of using more memory. Or decrease for the reverse effect, + * keeping in mind the limit from the first paragraph. The optimal size + * also depends on the CPU cache size and other factors; some twiddling + * may be necessary to squeeze out the best performance. + */ +static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */ + +/* WATCHOUT: assembly routines rely on the order in which these fields are declared */ +struct FLAC__BitReader { + /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ + /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ + uint32_t *buffer; + unsigned capacity; /* in words */ + unsigned words; /* # of completed words in buffer */ + unsigned bytes; /* # of bytes in incomplete word at buffer[words] */ + unsigned consumed_words; /* #words ... */ + unsigned consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ + unsigned read_crc16; /* the running frame CRC */ + unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ + FLAC__BitReaderReadCallback read_callback; + void *client_data; + FLAC__CPUInfo cpu_info; +}; + +static inline void crc16_update_word_(FLAC__BitReader *br, uint32_t word) +{ + register unsigned crc = br->read_crc16; +#if FLAC__BYTES_PER_WORD == 4 + switch(br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 24), crc); + case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); + case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); + case 24: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); + } +#elif FLAC__BYTES_PER_WORD == 8 + switch(br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 56), crc); + case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 48) & 0xff), crc); + case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 40) & 0xff), crc); + case 24: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 32) & 0xff), crc); + case 32: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 24) & 0xff), crc); + case 40: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); + case 48: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); + case 56: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); + } +#else + for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) + crc = FLAC__CRC16_UPDATE((unsigned)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc); + br->read_crc16 = crc; +#endif + br->crc16_align = 0; +} + +/* would be static except it needs to be called by asm routines */ +FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) +{ + unsigned start, end; + size_t bytes; + FLAC__byte *target; + + /* first shift the unconsumed buffer data toward the front as much as possible */ + if(br->consumed_words > 0) { + start = br->consumed_words; + end = br->words + (br->bytes? 1:0); + memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start)); + + br->words -= start; + br->consumed_words = 0; + } + + /* + * set the target for reading, taking into account word alignment and endianness + */ + bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; + if(bytes == 0) + return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ + target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes; + + /* before reading, if the existing reader looks like this (say uint32_t is 32 bits wide) + * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) + * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown layed out as bytes sequentially in memory) + * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) + * ^^-------target, bytes=3 + * on LE machines, have to byteswap the odd tail word so nothing is + * overwritten: + */ +#if WORDS_BIGENDIAN +#else + if(br->bytes) + br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); +#endif + + /* now it looks like: + * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 + * buffer[BE]: 11 22 33 44 55 ?? ?? ?? + * buffer[LE]: 44 33 22 11 55 ?? ?? ?? + * ^^-------target, bytes=3 + */ + + /* read in the data; note that the callback may return a smaller number of bytes */ + if(!br->read_callback(target, &bytes, br->client_data)) + return false; + + /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: + * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? + * now have to byteswap on LE machines: + */ +#if WORDS_BIGENDIAN +#else + end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; + for(start = br->words; start < end; start++) + br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); +#endif + + /* now it looks like: + * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD + * finally we'll update the reader values: + */ + end = br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes; + br->words = end / FLAC__BYTES_PER_WORD; + br->bytes = end % FLAC__BYTES_PER_WORD; + + return true; +} + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +FLAC__BitReader *FLAC__bitreader_new(void) +{ + FLAC__BitReader *br = (FLAC__BitReader*) calloc(1, sizeof(FLAC__BitReader)); + + /* calloc() implies: + memset(br, 0, sizeof(FLAC__BitReader)); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; + */ + return br; +} + +void FLAC__bitreader_delete(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + + FLAC__bitreader_free(br); + free(br); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd) +{ + FLAC__ASSERT(0 != br); + + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; + br->buffer = (uint32_t*) malloc(sizeof(uint32_t) * br->capacity); + if(br->buffer == 0) + return false; + br->read_callback = rcb; + br->client_data = cd; + br->cpu_info = cpu; + + return true; +} + +void FLAC__bitreader_free(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + + if(0 != br->buffer) + free(br->buffer); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; +} + +FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) +{ + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + return true; +} + +void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) +{ + unsigned i, j; + if(br == 0) { + fprintf(out, "bitreader is NULL\n"); + } + else { + fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); + + for(i = 0; i < br->words; i++) { + fprintf(out, "%08X: ", i); + for(j = 0; j < FLAC__BITS_PER_WORD; j++) + if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) + fprintf(out, "."); + else + fprintf(out, "%01u", br->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); + fprintf(out, "\n"); + } + if(br->bytes > 0) { + fprintf(out, "%08X: ", i); + for(j = 0; j < br->bytes*8; j++) + if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) + fprintf(out, "."); + else + fprintf(out, "%01u", br->buffer[i] & (1 << (br->bytes*8-j-1)) ? 1:0); + fprintf(out, "\n"); + } + } +} + +void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + + br->read_crc16 = (unsigned)seed; + br->crc16_align = br->consumed_bits; +} + +FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + FLAC__ASSERT(br->crc16_align <= br->consumed_bits); + + /* CRC any tail bytes in a partially-consumed word */ + if(br->consumed_bits) { + const uint32_t tail = br->buffer[br->consumed_words]; + for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8) + br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16); + } + return br->read_crc16; +} + +inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) +{ + return ((br->consumed_bits & 7) == 0); +} + +inline unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) +{ + return 8 - (br->consumed_bits & 7); +} + +inline unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) +{ + return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits; +} + +FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + FLAC__ASSERT(bits <= 32); + FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits); + FLAC__ASSERT(br->consumed_words <= br->words); + + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ + *val = 0; + return true; + } + + while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) { + if(!bitreader_read_from_client_(br)) + return false; + } + if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if(br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + const unsigned n = FLAC__BITS_PER_WORD - br->consumed_bits; + const uint32_t word = br->buffer[br->consumed_words]; + if(bits < n) { + *val = (word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits); + br->consumed_bits += bits; + return true; + } + *val = word & (FLAC__WORD_ALL_ONES >> br->consumed_bits); + bits -= n; + crc16_update_word_(br, word); + br->consumed_words++; + br->consumed_bits = 0; + if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ + *val <<= bits; + *val |= (br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); + br->consumed_bits = bits; + } + return true; + } + else { + const uint32_t word = br->buffer[br->consumed_words]; + if(bits < FLAC__BITS_PER_WORD) { + *val = word >> (FLAC__BITS_PER_WORD-bits); + br->consumed_bits = bits; + return true; + } + /* at this point 'bits' must be == FLAC__BITS_PER_WORD; because of previous assertions, it can't be larger */ + *val = word; + crc16_update_word_(br, word); + br->consumed_words++; + return true; + } + } + else { + /* in this case we're starting our read at a partial tail word; + * the reader has guaranteed that we have at least 'bits' bits + * available to read, which makes this case simpler. + */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if(br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8); + *val = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits); + br->consumed_bits += bits; + return true; + } + else { + *val = br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits); + br->consumed_bits += bits; + return true; + } + } +} + +FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits) +{ + /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ + if(!FLAC__bitreader_read_raw_uint32(br, (FLAC__uint32*)val, bits)) + return false; + /* sign-extend: */ + *val <<= (32-bits); + *val >>= (32-bits); + return true; +} + +FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits) +{ + FLAC__uint32 hi, lo; + + if(bits > 32) { + if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32)) + return false; + if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) + return false; + *val = hi; + *val <<= 32; + *val |= lo; + } + else { + if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) + return false; + *val = lo; + } + return true; +} + +inline FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) +{ + FLAC__uint32 x8, x32 = 0; + + /* this doesn't need to be that fast as currently it is only used for vorbis comments */ + + if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) + return false; + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 8); + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 16); + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 24); + + *val = x32; + return true; +} + +FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits) +{ + /* + * OPT: a faster implementation is possible but probably not that useful + * since this is only called a couple of times in the metadata readers. + */ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + if(bits > 0) { + const unsigned n = br->consumed_bits & 7; + unsigned m; + FLAC__uint32 x; + + if(n != 0) { + m = flac_min(8-n, bits); + if(!FLAC__bitreader_read_raw_uint32(br, &x, m)) + return false; + bits -= m; + } + m = bits / 8; + if(m > 0) { + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) + return false; + bits %= 8; + } + if(bits > 0) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, bits)) + return false; + } + } + + return true; +} + +FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals) +{ + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: skip over partial head word to get word aligned */ + while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + nvals--; + } + if(0 == nvals) + return true; + /* step 2: skip whole words in chunks */ + while(nvals >= FLAC__BYTES_PER_WORD) { + if(br->consumed_words < br->words) { + br->consumed_words++; + nvals -= FLAC__BYTES_PER_WORD; + } + else if(!bitreader_read_from_client_(br)) + return false; + } + /* step 3: skip any remainder from partial tail bytes */ + while(nvals) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + nvals--; + } + + return true; +} + +FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals) +{ + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: read from partial head word to get word aligned */ + while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + *val++ = (FLAC__byte)x; + nvals--; + } + if(0 == nvals) + return true; + /* step 2: read whole words in chunks */ + while(nvals >= FLAC__BYTES_PER_WORD) { + if(br->consumed_words < br->words) { + const uint32_t word = br->buffer[br->consumed_words++]; +#if FLAC__BYTES_PER_WORD == 4 + val[0] = (FLAC__byte)(word >> 24); + val[1] = (FLAC__byte)(word >> 16); + val[2] = (FLAC__byte)(word >> 8); + val[3] = (FLAC__byte)word; +#elif FLAC__BYTES_PER_WORD == 8 + val[0] = (FLAC__byte)(word >> 56); + val[1] = (FLAC__byte)(word >> 48); + val[2] = (FLAC__byte)(word >> 40); + val[3] = (FLAC__byte)(word >> 32); + val[4] = (FLAC__byte)(word >> 24); + val[5] = (FLAC__byte)(word >> 16); + val[6] = (FLAC__byte)(word >> 8); + val[7] = (FLAC__byte)word; +#else + for(x = 0; x < FLAC__BYTES_PER_WORD; x++) + val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1))); +#endif + val += FLAC__BYTES_PER_WORD; + nvals -= FLAC__BYTES_PER_WORD; + } + else if(!bitreader_read_from_client_(br)) + return false; + } + /* step 3: read any remainder from partial tail bytes */ + while(nvals) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + *val++ = (FLAC__byte)x; + nvals--; + } + + return true; +} + +FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val) +#if 0 /* slow but readable version */ +{ + unsigned bit; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while(1) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + if(bit) + break; + else + *val++; + } + return true; +} +#else +{ + unsigned i; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while(1) { + while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + uint32_t b = br->buffer[br->consumed_words] << br->consumed_bits; + if(b) { + i = FLAC__clz_uint32(b); + *val += i; + i++; + br->consumed_bits += i; + if(br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + } + return true; + } + else { + *val += FLAC__BITS_PER_WORD - br->consumed_bits; + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + /* didn't find stop bit yet, have to keep going... */ + } + } + /* at this point we've eaten up all the whole words; have to try + * reading through any tail bytes before calling the read callback. + * this is a repeat of the above logic adjusted for the fact we + * don't have a whole word. note though if the client is feeding + * us data a byte at a time (unlikely), br->consumed_bits may not + * be zero. + */ + if(br->bytes*8 > br->consumed_bits) { + const unsigned end = br->bytes * 8; + uint32_t b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; + if(b) { + i = FLAC__clz_uint32(b); + *val += i; + i++; + br->consumed_bits += i; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + return true; + } + else { + *val += end - br->consumed_bits; + br->consumed_bits = end; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + /* didn't find stop bit yet, have to keep going... */ + } + } + if(!bitreader_read_from_client_(br)) + return false; + } +} +#endif + +FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter) +{ + FLAC__uint32 lsbs = 0, msbs = 0; + unsigned uval; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(parameter <= 31); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) + return false; + + /* compose the value */ + uval = (msbs << parameter) | lsbs; + if(uval & 1) + *val = -((int)(uval >> 1)) - 1; + else + *val = (int)(uval >> 1); + + return true; +} + +/* this is by far the most heavily used reader call. it ain't pretty but it's fast */ +FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter) +{ + /* try and get br->consumed_words and br->consumed_bits into register; + * must remember to flush them back to *br before calling other + * bitreader functions that use them, and before returning */ + unsigned cwords, words, lsbs, msbs, x, y; + unsigned ucbits; /* keep track of the number of unconsumed bits in word */ + uint32_t b; + int *val, *end; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + FLAC__ASSERT(parameter < 32); + /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ + + val = vals; + end = vals + nvals; + + if(parameter == 0) { + while(val < end) { + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + *val++ = (int)(msbs >> 1) ^ -(int)(msbs & 1); + } + + return true; + } + + FLAC__ASSERT(parameter > 0); + + cwords = br->consumed_words; + words = br->words; + + /* if we've not consumed up to a partial tail word... */ + if(cwords >= words) { + x = 0; + goto process_tail; + } + + ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; + b = br->buffer[cwords] << br->consumed_bits; /* keep unconsumed bits aligned to left */ + + while(val < end) { + /* read the unary MSBs and end bit */ + x = y = FLAC__clz2_uint32(b); + if(x == FLAC__BITS_PER_WORD) { + x = ucbits; + do { + /* didn't find stop bit yet, have to keep going... */ + crc16_update_word_(br, br->buffer[cwords++]); + if (cwords >= words) + goto incomplete_msbs; + b = br->buffer[cwords]; + y = FLAC__clz2_uint32(b); + x += y; + } while(y == FLAC__BITS_PER_WORD); + } + b <<= y; + b <<= 1; /* account for stop bit */ + ucbits = (ucbits - x - 1) % FLAC__BITS_PER_WORD; + msbs = x; + + /* read the binary LSBs */ + x = b >> (FLAC__BITS_PER_WORD - parameter); + if(parameter <= ucbits) { + ucbits -= parameter; + b <<= parameter; + } else { + /* there are still bits left to read, they will all be in the next word */ + crc16_update_word_(br, br->buffer[cwords++]); + if (cwords >= words) + goto incomplete_lsbs; + b = br->buffer[cwords]; + ucbits += FLAC__BITS_PER_WORD - parameter; + x |= b >> ucbits; + b <<= FLAC__BITS_PER_WORD - ucbits; + } + lsbs = x; + + /* compose the value */ + x = (msbs << parameter) | lsbs; + *val++ = (int)(x >> 1) ^ -(int)(x & 1); + + continue; + + /* at this point we've eaten up all the whole words */ +process_tail: + do { + if(0) { +incomplete_msbs: + br->consumed_bits = 0; + br->consumed_words = cwords; + } + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + msbs += x; + x = ucbits = 0; + + if(0) { +incomplete_lsbs: + br->consumed_bits = 0; + br->consumed_words = cwords; + } + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter - ucbits)) + return false; + lsbs = x | lsbs; + + /* compose the value */ + x = (msbs << parameter) | lsbs; + *val++ = (int)(x >> 1) ^ -(int)(x & 1); + x = 0; + + cwords = br->consumed_words; + words = br->words; + ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; + b = br->buffer[cwords] << br->consumed_bits; + } while(cwords >= words && val < end); + } + + if(ucbits == 0 && cwords < words) { + /* don't leave the head word with no unconsumed bits */ + crc16_update_word_(br, br->buffer[cwords++]); + ucbits = FLAC__BITS_PER_WORD; + } + + br->consumed_bits = FLAC__BITS_PER_WORD - ucbits; + br->consumed_words = cwords; + + return true; +} + +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter) +{ + FLAC__uint32 lsbs = 0, msbs = 0; + unsigned bit, uval, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) + return false; + + if(parameter == 1u<= d) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + uval = msbs * parameter + lsbs; + } + + /* unfold unsigned to signed */ + if(uval & 1) + *val = -((int)(uval >> 1)) - 1; + else + *val = (int)(uval >> 1); + + return true; +} + +FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter) +{ + FLAC__uint32 lsbs, msbs = 0; + unsigned bit, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) + return false; + + if(parameter == 1u<= d) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + *val = msbs * parameter + lsbs; + } + + return true; +} +#endif /* UNUSED */ + +/* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */ +FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen) +{ + FLAC__uint32 v = 0; + FLAC__uint32 x; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } + else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } + else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } + else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } + else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } + else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } + else { + *val = 0xffffffff; + return true; + } + for( ; i; i--) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = 0xffffffff; + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; +} + +/* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */ +FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen) +{ + FLAC__uint64 v = 0; + FLAC__uint32 x; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } + else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } + else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } + else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } + else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } + else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } + else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */ + v = 0; + i = 6; + } + else { + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + for( ; i; i--) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; +} + +/* These functions a declared inline in this file but are also callable as + * externs from elsewhere. + * According to the C99 sepc, section 6.7.4, simply providing a function + * prototype in a header file without 'inline' and making the function inline + * in this file should be sufficient. + * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To + * fix that we add extern declarations here. + */ +extern FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); +extern unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); +extern unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); +extern FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c new file mode 100644 index 0000000000..9ac9ee5395 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c @@ -0,0 +1,868 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "include/private/bitwriter.h" +#include "include/private/crc.h" +#include "../assert.h" +#include "../alloc.h" +#include "../compat.h" +#include "../endswap.h" + +/* Things should be fastest when this matches the machine word size */ +/* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ +/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ +#define FLAC__BYTES_PER_WORD 4 +#undef FLAC__BITS_PER_WORD +#define FLAC__BITS_PER_WORD 32 +#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) +/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ +#if WORDS_BIGENDIAN +#define SWAP_BE_WORD_TO_HOST(x) (x) +#else +#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) +#endif + +/* + * The default capacity here doesn't matter too much. The buffer always grows + * to hold whatever is written to it. Usually the encoder will stop adding at + * a frame or metadata block, then write that out and clear the buffer for the + * next one. + */ +static const unsigned FLAC__BITWRITER_DEFAULT_CAPACITY = 32768u / sizeof(uint32_t); /* size in words */ +/* When growing, increment 4K at a time */ +static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(uint32_t); /* size in words */ + +#define FLAC__WORDS_TO_BITS(words) ((words) * FLAC__BITS_PER_WORD) +#define FLAC__TOTAL_BITS(bw) (FLAC__WORDS_TO_BITS((bw)->words) + (bw)->bits) + +struct FLAC__BitWriter { + uint32_t *buffer; + uint32_t accum; /* accumulator; bits are right-justified; when full, accum is appended to buffer */ + unsigned capacity; /* capacity of buffer in words */ + unsigned words; /* # of complete words in buffer */ + unsigned bits; /* # of used bits in accum */ +}; + +/* * WATCHOUT: The current implementation only grows the buffer. */ +#ifndef __SUNPRO_C +static +#endif +FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) +{ + unsigned new_capacity; + uint32_t *new_buffer; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + /* calculate total words needed to store 'bits_to_add' additional bits */ + new_capacity = bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD); + + /* it's possible (due to pessimism in the growth estimation that + * leads to this call) that we don't actually need to grow + */ + if(bw->capacity >= new_capacity) + return true; + + /* round up capacity increase to the nearest FLAC__BITWRITER_DEFAULT_INCREMENT */ + if((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT) + new_capacity += FLAC__BITWRITER_DEFAULT_INCREMENT - ((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); + /* make sure we got everything right */ + FLAC__ASSERT(0 == (new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); + FLAC__ASSERT(new_capacity > bw->capacity); + FLAC__ASSERT(new_capacity >= bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD)); + + new_buffer = (uint32_t*) safe_realloc_mul_2op_(bw->buffer, sizeof(uint32_t), /*times*/new_capacity); + if(new_buffer == 0) + return false; + bw->buffer = new_buffer; + bw->capacity = new_capacity; + return true; +} + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +FLAC__BitWriter *FLAC__bitwriter_new(void) +{ + FLAC__BitWriter *bw = (FLAC__BitWriter*) calloc(1, sizeof(FLAC__BitWriter)); + /* note that calloc() sets all members to 0 for us */ + return bw; +} + +void FLAC__bitwriter_delete(FLAC__BitWriter *bw) +{ + FLAC__ASSERT(0 != bw); + + FLAC__bitwriter_free(bw); + free(bw); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw) +{ + FLAC__ASSERT(0 != bw); + + bw->words = bw->bits = 0; + bw->capacity = FLAC__BITWRITER_DEFAULT_CAPACITY; + bw->buffer = (uint32_t*) malloc(sizeof(uint32_t) * bw->capacity); + if(bw->buffer == 0) + return false; + + return true; +} + +void FLAC__bitwriter_free(FLAC__BitWriter *bw) +{ + FLAC__ASSERT(0 != bw); + + if(0 != bw->buffer) + free(bw->buffer); + bw->buffer = 0; + bw->capacity = 0; + bw->words = bw->bits = 0; +} + +void FLAC__bitwriter_clear(FLAC__BitWriter *bw) +{ + bw->words = bw->bits = 0; +} + +void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out) +{ + unsigned i, j; + if(bw == 0) { + fprintf(out, "bitwriter is NULL\n"); + } + else { + fprintf(out, "bitwriter: capacity=%u words=%u bits=%u total_bits=%u\n", bw->capacity, bw->words, bw->bits, FLAC__TOTAL_BITS(bw)); + + for(i = 0; i < bw->words; i++) { + fprintf(out, "%08X: ", i); + for(j = 0; j < FLAC__BITS_PER_WORD; j++) + fprintf(out, "%01u", bw->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); + fprintf(out, "\n"); + } + if(bw->bits > 0) { + fprintf(out, "%08X: ", i); + for(j = 0; j < bw->bits; j++) + fprintf(out, "%01u", bw->accum & (1 << (bw->bits-j-1)) ? 1:0); + fprintf(out, "\n"); + } + } +} + +FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc) +{ + const FLAC__byte *buffer; + size_t bytes; + + FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ + + if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) + return false; + + *crc = (FLAC__uint16)FLAC__crc16(buffer, bytes); + FLAC__bitwriter_release_buffer(bw); + return true; +} + +FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc) +{ + const FLAC__byte *buffer; + size_t bytes; + + FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ + + if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) + return false; + + *crc = FLAC__crc8(buffer, bytes); + FLAC__bitwriter_release_buffer(bw); + return true; +} + +FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw) +{ + return ((bw->bits & 7) == 0); +} + +unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw) +{ + return FLAC__TOTAL_BITS(bw); +} + +FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes) +{ + FLAC__ASSERT((bw->bits & 7) == 0); + /* double protection */ + if(bw->bits & 7) + return false; + /* if we have bits in the accumulator we have to flush those to the buffer first */ + if(bw->bits) { + FLAC__ASSERT(bw->words <= bw->capacity); + if(bw->words == bw->capacity && !bitwriter_grow_(bw, FLAC__BITS_PER_WORD)) + return false; + /* append bits as complete word to buffer, but don't change bw->accum or bw->bits */ + bw->buffer[bw->words] = SWAP_BE_WORD_TO_HOST(bw->accum << (FLAC__BITS_PER_WORD-bw->bits)); + } + /* now we can just return what we have */ + *buffer = (FLAC__byte*)bw->buffer; + *bytes = (FLAC__BYTES_PER_WORD * bw->words) + (bw->bits >> 3); + return true; +} + +void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw) +{ + /* nothing to do. in the future, strict checking of a 'writer-is-in- + * get-mode' flag could be added everywhere and then cleared here + */ + (void)bw; +} + +inline FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits) +{ + unsigned n; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + if(bits == 0) + return true; + /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ + if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) + return false; + /* first part gets to word alignment */ + if(bw->bits) { + n = flac_min(FLAC__BITS_PER_WORD - bw->bits, bits); + bw->accum <<= n; + bits -= n; + bw->bits += n; + if(bw->bits == FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->bits = 0; + } + else + return true; + } + /* do whole words */ + while(bits >= FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = 0; + bits -= FLAC__BITS_PER_WORD; + } + /* do any leftovers */ + if(bits > 0) { + bw->accum = 0; + bw->bits = bits; + } + return true; +} + +inline FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits) +{ + register unsigned left; + + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + FLAC__ASSERT(bits <= 32); + if(bits == 0) + return true; + + /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ + if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) + return false; + + left = FLAC__BITS_PER_WORD - bw->bits; + if(bits < left) { + bw->accum <<= bits; + bw->accum |= val; + bw->bits += bits; + } + else if(bw->bits) { /* WATCHOUT: if bw->bits == 0, left==FLAC__BITS_PER_WORD and bw->accum<<=left is a NOP instead of setting to 0 */ + bw->accum <<= left; + bw->accum |= val >> (bw->bits = bits - left); + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->accum = val; + } + else { + bw->accum = val; + bw->bits = 0; + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(val); + } + + return true; +} + +inline FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits) +{ + /* zero-out unused bits */ + if(bits < 32) + val &= (~(0xffffffff << bits)); + + return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); +} + +inline FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits) +{ + /* this could be a little faster but it's not used for much */ + if(bits > 32) { + return + FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(val>>32), bits-32) && + FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 32); + } + else + return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); +} + +inline FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val) +{ + /* this doesn't need to be that fast as currently it is only used for vorbis comments */ + + if(!FLAC__bitwriter_write_raw_uint32(bw, val & 0xff, 8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>8) & 0xff, 8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>16) & 0xff, 8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, val>>24, 8)) + return false; + + return true; +} + +inline FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals) +{ + unsigned i; + + /* this could be faster but currently we don't need it to be since it's only used for writing metadata */ + for(i = 0; i < nvals; i++) { + if(!FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(vals[i]), 8)) + return false; + } + + return true; +} + +FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val) +{ + if(val < 32) + return FLAC__bitwriter_write_raw_uint32(bw, 1, ++val); + else + return + FLAC__bitwriter_write_zeroes(bw, val) && + FLAC__bitwriter_write_raw_uint32(bw, 1, 1); +} + +unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter) +{ + FLAC__uint32 uval; + + FLAC__ASSERT(parameter < sizeof(unsigned)*8); + + /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ + uval = (val<<1) ^ (val>>31); + + return 1 + parameter + (uval >> parameter); +} + +#if 0 /* UNUSED */ +unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter) +{ + unsigned bits, msbs, uval; + unsigned k; + + FLAC__ASSERT(parameter > 0); + + /* fold signed to unsigned */ + if(val < 0) + uval = (unsigned)(((-(++val)) << 1) + 1); + else + uval = (unsigned)(val << 1); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + bits = 1 + k + msbs; + } + else { + unsigned q, r, d; + + d = (1 << (k+1)) - parameter; + q = uval / parameter; + r = uval - (q * parameter); + + bits = 1 + q + k; + if(r >= d) + bits++; + } + return bits; +} + +unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned uval, unsigned parameter) +{ + unsigned bits, msbs; + unsigned k; + + FLAC__ASSERT(parameter > 0); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + bits = 1 + k + msbs; + } + else { + unsigned q, r, d; + + d = (1 << (k+1)) - parameter; + q = uval / parameter; + r = uval - (q * parameter); + + bits = 1 + q + k; + if(r >= d) + bits++; + } + return bits; +} +#endif /* UNUSED */ + +FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter) +{ + unsigned total_bits, interesting_bits, msbs; + FLAC__uint32 uval, pattern; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter < 8*sizeof(uval)); + + /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ + uval = (val<<1) ^ (val>>31); + + msbs = uval >> parameter; + interesting_bits = 1 + parameter; + total_bits = interesting_bits + msbs; + pattern = 1 << parameter; /* the unary end bit */ + pattern |= (uval & ((1<> (31-parameter); /* ...then mask off the bits above the stop bit with val&=mask2*/ + FLAC__uint32 uval; + unsigned left; + const unsigned lsbits = 1 + parameter; + unsigned msbits; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter < 8*sizeof(uint32_t)-1); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + while(nvals) { + /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ + uval = (*vals<<1) ^ (*vals>>31); + + msbits = uval >> parameter; + +#if 0 /* OPT: can remove this special case if it doesn't make up for the extra compare (doesn't make a statistically significant difference with msvc or gcc/x86) */ + if(bw->bits && bw->bits + msbits + lsbits <= FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ + /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ + bw->bits = bw->bits + msbits + lsbits; + uval |= mask1; /* set stop bit */ + uval &= mask2; /* mask off unused top bits */ + /* NOT: bw->accum <<= msbits + lsbits because msbits+lsbits could be 32, then the shift would be a NOP */ + bw->accum <<= msbits; + bw->accum <<= lsbits; + bw->accum |= uval; + if(bw->bits == FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->bits = 0; + /* burying the capacity check down here means we have to grow the buffer a little if there are more vals to do */ + if(bw->capacity <= bw->words && nvals > 1 && !bitwriter_grow_(bw, 1)) { + FLAC__ASSERT(bw->capacity == bw->words); + return false; + } + } + } + else { +#elif 1 /*@@@@@@ OPT: try this version with MSVC6 to see if better, not much difference for gcc-4 */ + if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ + /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ + bw->bits = bw->bits + msbits + lsbits; + uval |= mask1; /* set stop bit */ + uval &= mask2; /* mask off unused top bits */ + bw->accum <<= msbits + lsbits; + bw->accum |= uval; + } + else { +#endif + /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ + /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */ + if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 uint32_t*/ && !bitwriter_grow_(bw, msbits+lsbits)) + return false; + + if(msbits) { + /* first part gets to word alignment */ + if(bw->bits) { + left = FLAC__BITS_PER_WORD - bw->bits; + if(msbits < left) { + bw->accum <<= msbits; + bw->bits += msbits; + goto break1; + } + else { + bw->accum <<= left; + msbits -= left; + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->bits = 0; + } + } + /* do whole words */ + while(msbits >= FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = 0; + msbits -= FLAC__BITS_PER_WORD; + } + /* do any leftovers */ + if(msbits > 0) { + bw->accum = 0; + bw->bits = msbits; + } + } +break1: + uval |= mask1; /* set stop bit */ + uval &= mask2; /* mask off unused top bits */ + + left = FLAC__BITS_PER_WORD - bw->bits; + if(lsbits < left) { + bw->accum <<= lsbits; + bw->accum |= uval; + bw->bits += lsbits; + } + else { + /* if bw->bits == 0, left==FLAC__BITS_PER_WORD which will always + * be > lsbits (because of previous assertions) so it would have + * triggered the (lsbitsbits); + FLAC__ASSERT(left < FLAC__BITS_PER_WORD); + bw->accum <<= left; + bw->accum |= uval >> (bw->bits = lsbits - left); + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->accum = uval; + } +#if 1 + } +#endif + vals++; + nvals--; + } + return true; +} + +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter) +{ + unsigned total_bits, msbs, uval; + unsigned k; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter > 0); + + /* fold signed to unsigned */ + if(val < 0) + uval = (unsigned)(((-(++val)) << 1) + 1); + else + uval = (unsigned)(val << 1); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + total_bits = 1 + k + msbs; + pattern = 1 << k; /* the unary end bit */ + pattern |= (uval & ((1u<= d) { + if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) + return false; + } + else { + if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) + return false; + } + } + return true; +} + +FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned uval, unsigned parameter) +{ + unsigned total_bits, msbs; + unsigned k; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter > 0); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + total_bits = 1 + k + msbs; + pattern = 1 << k; /* the unary end bit */ + pattern |= (uval & ((1u<= d) { + if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) + return false; + } + else { + if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) + return false; + } + } + return true; +} +#endif /* UNUSED */ + +FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val) +{ + FLAC__bool ok = 1; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */ + + if(val < 0x80) { + return FLAC__bitwriter_write_raw_uint32(bw, val, 8); + } + else if(val < 0x800) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (val>>6), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else if(val < 0x10000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (val>>12), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else if(val < 0x200000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (val>>18), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else if(val < 0x4000000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (val>>24), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (val>>30), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>24)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + + return ok; +} + +FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val) +{ + FLAC__bool ok = 1; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */ + + if(val < 0x80) { + return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 8); + } + else if(val < 0x800) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (FLAC__uint32)(val>>6), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x10000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (FLAC__uint32)(val>>12), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x200000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (FLAC__uint32)(val>>18), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x4000000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (FLAC__uint32)(val>>24), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x80000000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (FLAC__uint32)(val>>30), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFE, 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + + return ok; +} + +FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) +{ + /* 0-pad to byte boundary */ + if(bw->bits & 7u) + return FLAC__bitwriter_write_zeroes(bw, 8 - (bw->bits & 7u)); + else + return true; +} + +/* These functions a declared inline in this file but are also callable as + * externs from elsewhere. + * According to the C99 sepc, section 6.7.4, simply providing a function + * prototype in a header file without 'inline' and making the function inline + * in this file should be sufficient. + * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To + * fix that we add extern declarations here. + */ +extern FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); +extern FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); +extern FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); +extern FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); +extern FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c new file mode 100644 index 0000000000..e352c95355 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c @@ -0,0 +1,419 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "include/private/cpu.h" +#include +#include + +#if defined FLAC__CPU_IA32 +# include +#elif defined FLAC__CPU_PPC +# if !defined FLAC__NO_ASM +# if defined FLAC__SYS_DARWIN +# include +# include +# include +# include +# include +# ifndef CPU_SUBTYPE_POWERPC_970 +# define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) +# endif +# else /* FLAC__SYS_DARWIN */ + +# include +# include + +static sigjmp_buf jmpbuf; +static volatile sig_atomic_t canjump = 0; + +static void sigill_handler (int sig) +{ + if (!canjump) { + signal (sig, SIG_DFL); + raise (sig); + } + canjump = 0; + siglongjmp (jmpbuf, 1); +} +# endif /* FLAC__SYS_DARWIN */ +# endif /* FLAC__NO_ASM */ +#endif /* FLAC__CPU_PPC */ + +#if defined (__NetBSD__) || defined(__OpenBSD__) +#include +#include +#include +#endif + +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#include +#include +#endif + +#if defined(__APPLE__) +/* how to get sysctlbyname()? */ +#endif + +/* these are flags in EDX of CPUID AX=00000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_CMOV = 0x00008000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_MMX = 0x00800000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_FXSR = 0x01000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE = 0x02000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE2 = 0x04000000; +/* these are flags in ECX of CPUID AX=00000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE3 = 0x00000001; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSSE3 = 0x00000200; +/* these are flags in EDX of CPUID AX=80000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW = 0x80000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW = 0x40000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX = 0x00400000; + + +/* + * Extra stuff needed for detection of OS support for SSE on IA-32 + */ +#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM && !defined FLAC__NO_SSE_OS && !defined FLAC__SSE_OS +# if defined(__linux__) +/* + * If the OS doesn't support SSE, we will get here with a SIGILL. We + * modify the return address to jump over the offending SSE instruction + * and also the operation following it that indicates the instruction + * executed successfully. In this way we use no global variables and + * stay thread-safe. + * + * 3 + 3 + 6: + * 3 bytes for "xorps xmm0,xmm0" + * 3 bytes for estimate of how long the follwing "inc var" instruction is + * 6 bytes extra in case our estimate is wrong + * 12 bytes puts us in the NOP "landing zone" + */ +# undef USE_OBSOLETE_SIGCONTEXT_FLAVOR /* #define this to use the older signal handler method */ +# ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR + static void sigill_handler_sse_os(int signal, struct sigcontext sc) + { + (void)signal; + sc.eip += 3 + 3 + 6; + } +# else +# include + static void sigill_handler_sse_os(int signal, siginfo_t *si, void *uc) + { + (void)signal, (void)si; + ((ucontext_t*)uc)->uc_mcontext.gregs[14/*REG_EIP*/] += 3 + 3 + 6; + } +# endif +# elif defined(_MSC_VER) +# include +# define USE_TRY_CATCH_FLAVOR /* sigill_handler flavor resulted in several crash reports on win32 */ +# ifdef USE_TRY_CATCH_FLAVOR +# else + LONG CALLBACK sigill_handler_sse_os(EXCEPTION_POINTERS *ep) + { + if(ep->ExceptionRecord->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION) { + ep->ContextRecord->Eip += 3 + 3 + 6; + return EXCEPTION_CONTINUE_EXECUTION; + } + return EXCEPTION_CONTINUE_SEARCH; + } +# endif +# endif +#endif + + +void FLAC__cpu_info(FLAC__CPUInfo *info) +{ +/* + * IA32-specific + */ +#ifdef FLAC__CPU_IA32 + info->type = FLAC__CPUINFO_TYPE_IA32; +#if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM + info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */ + info->data.ia32.cpuid = FLAC__cpu_have_cpuid_asm_ia32()? true : false; + info->data.ia32.bswap = info->data.ia32.cpuid; /* CPUID => BSWAP since it came after */ + info->data.ia32.cmov = false; + info->data.ia32.mmx = false; + info->data.ia32.fxsr = false; + info->data.ia32.sse = false; + info->data.ia32.sse2 = false; + info->data.ia32.sse3 = false; + info->data.ia32.ssse3 = false; + info->data.ia32._3dnow = false; + info->data.ia32.ext3dnow = false; + info->data.ia32.extmmx = false; + if(info->data.ia32.cpuid) { + /* http://www.sandpile.org/ia32/cpuid.htm */ + FLAC__uint32 flags_edx, flags_ecx; + FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); + info->data.ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; + info->data.ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; + info->data.ia32.fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; + info->data.ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; + info->data.ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; + info->data.ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; + info->data.ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; + +#ifdef FLAC__USE_3DNOW + flags_edx = FLAC__cpu_info_extended_amd_asm_ia32(); + info->data.ia32._3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW )? true : false; + info->data.ia32.ext3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW)? true : false; + info->data.ia32.extmmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX )? true : false; +#else + info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = false; +#endif + +#ifdef DEBUG + fprintf(stderr, "CPU info (IA-32):\n"); + fprintf(stderr, " CPUID ...... %c\n", info->data.ia32.cpuid ? 'Y' : 'n'); + fprintf(stderr, " BSWAP ...... %c\n", info->data.ia32.bswap ? 'Y' : 'n'); + fprintf(stderr, " CMOV ....... %c\n", info->data.ia32.cmov ? 'Y' : 'n'); + fprintf(stderr, " MMX ........ %c\n", info->data.ia32.mmx ? 'Y' : 'n'); + fprintf(stderr, " FXSR ....... %c\n", info->data.ia32.fxsr ? 'Y' : 'n'); + fprintf(stderr, " SSE ........ %c\n", info->data.ia32.sse ? 'Y' : 'n'); + fprintf(stderr, " SSE2 ....... %c\n", info->data.ia32.sse2 ? 'Y' : 'n'); + fprintf(stderr, " SSE3 ....... %c\n", info->data.ia32.sse3 ? 'Y' : 'n'); + fprintf(stderr, " SSSE3 ...... %c\n", info->data.ia32.ssse3 ? 'Y' : 'n'); + fprintf(stderr, " 3DNow! ..... %c\n", info->data.ia32._3dnow ? 'Y' : 'n'); + fprintf(stderr, " 3DNow!-ext . %c\n", info->data.ia32.ext3dnow? 'Y' : 'n'); + fprintf(stderr, " 3DNow!-MMX . %c\n", info->data.ia32.extmmx ? 'Y' : 'n'); +#endif + + /* + * now have to check for OS support of SSE/SSE2 + */ + if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { +#if defined FLAC__NO_SSE_OS + /* assume user knows better than us; turn it off */ + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#elif defined FLAC__SSE_OS + /* assume user knows better than us; leave as detected above */ +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) + int sse = 0; + size_t len; + /* at least one of these must work: */ + len = sizeof(sse); sse = sse || (sysctlbyname("hw.instruction_sse", &sse, &len, NULL, 0) == 0 && sse); + len = sizeof(sse); sse = sse || (sysctlbyname("hw.optional.sse" , &sse, &len, NULL, 0) == 0 && sse); /* __APPLE__ ? */ + if(!sse) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#elif defined(__NetBSD__) || defined (__OpenBSD__) +# if __NetBSD_Version__ >= 105250000 || (defined __OpenBSD__) + int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; + size_t len = sizeof(val); + if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + else { /* double-check SSE2 */ + mib[1] = CPU_SSE2; + len = sizeof(val); + if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) + info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + } +# else + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +# endif +#elif defined(__linux__) + int sse = 0; + struct sigaction sigill_save; +#ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR + if(0 == sigaction(SIGILL, NULL, &sigill_save) && signal(SIGILL, (void (*)(int))sigill_handler_sse_os) != SIG_ERR) +#else + struct sigaction sigill_sse; + sigill_sse.sa_sigaction = sigill_handler_sse_os; + __sigemptyset(&sigill_sse.sa_mask); + sigill_sse.sa_flags = SA_SIGINFO | SA_RESETHAND; /* SA_RESETHAND just in case our SIGILL return jump breaks, so we don't get stuck in a loop */ + if(0 == sigaction(SIGILL, &sigill_sse, &sigill_save)) +#endif + { + /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ + /* see sigill_handler_sse_os() for an explanation of the following: */ + asm volatile ( + "xorl %0,%0\n\t" /* for some reason, still need to do this to clear 'sse' var */ + "xorps %%xmm0,%%xmm0\n\t" /* will cause SIGILL if unsupported by OS */ + "incl %0\n\t" /* SIGILL handler will jump over this */ + /* landing zone */ + "nop\n\t" /* SIGILL jump lands here if "inc" is 9 bytes */ + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" /* SIGILL jump lands here if "inc" is 3 bytes (expected) */ + "nop\n\t" + "nop" /* SIGILL jump lands here if "inc" is 1 byte */ + : "=r"(sse) + : "r"(sse) + ); + + sigaction(SIGILL, &sigill_save, NULL); + } + + if(!sse) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#elif defined(_MSC_VER) +# ifdef USE_TRY_CATCH_FLAVOR + _try { + __asm { +# if _MSC_VER <= 1200 + /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ + _emit 0x0F + _emit 0x57 + _emit 0xC0 +# else + xorps xmm0,xmm0 +# endif + } + } + _except(EXCEPTION_EXECUTE_HANDLER) { + if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + } +# else + int sse = 0; + LPTOP_LEVEL_EXCEPTION_FILTER save = SetUnhandledExceptionFilter(sigill_handler_sse_os); + /* see GCC version above for explanation */ + /* http://msdn2.microsoft.com/en-us/library/4ks26t93.aspx */ + /* http://www.codeproject.com/cpp/gccasm.asp */ + /* http://www.hick.org/~mmiller/msvc_inline_asm.html */ + __asm { +# if _MSC_VER <= 1200 + /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ + _emit 0x0F + _emit 0x57 + _emit 0xC0 +# else + xorps xmm0,xmm0 +# endif + inc sse + nop + nop + nop + nop + nop + nop + nop + nop + nop + } + SetUnhandledExceptionFilter(save); + if(!sse) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +# endif +#else + /* no way to test, disable to be safe */ + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#endif +#ifdef DEBUG + fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); +#endif + + } + } +#else + info->use_asm = false; +#endif + +/* + * PPC-specific + */ +#elif defined FLAC__CPU_PPC + info->type = FLAC__CPUINFO_TYPE_PPC; +# if !defined FLAC__NO_ASM + info->use_asm = true; +# ifdef FLAC__USE_ALTIVEC +# if defined FLAC__SYS_DARWIN + { + int val = 0, mib[2] = { CTL_HW, HW_VECTORUNIT }; + size_t len = sizeof(val); + info->data.ppc.altivec = !(sysctl(mib, 2, &val, &len, NULL, 0) || !val); + } + { + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount; + + infoCount = HOST_BASIC_INFO_COUNT; + host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); + + info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); + } +# else /* FLAC__USE_ALTIVEC && !FLAC__SYS_DARWIN */ + { + /* no Darwin, do it the brute-force way */ + /* @@@@@@ this is not thread-safe; replace with SSE OS method above or remove */ + info->data.ppc.altivec = 0; + info->data.ppc.ppc64 = 0; + + signal (SIGILL, sigill_handler); + canjump = 0; + if (!sigsetjmp (jmpbuf, 1)) { + canjump = 1; + + asm volatile ( + "mtspr 256, %0\n\t" + "vand %%v0, %%v0, %%v0" + : + : "r" (-1) + ); + + info->data.ppc.altivec = 1; + } + canjump = 0; + if (!sigsetjmp (jmpbuf, 1)) { + int x = 0; + canjump = 1; + + /* PPC64 hardware implements the cntlzd instruction */ + asm volatile ("cntlzd %0, %1" : "=r" (x) : "r" (x) ); + + info->data.ppc.ppc64 = 1; + } + signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ + } +# endif +# else /* !FLAC__USE_ALTIVEC */ + info->data.ppc.altivec = 0; + info->data.ppc.ppc64 = 0; +# endif +# else + info->use_asm = false; +# endif + +/* + * unknown CPI + */ +#else + info->type = FLAC__CPUINFO_TYPE_UNKNOWN; + info->use_asm = false; +#endif +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c new file mode 100644 index 0000000000..225b26d10c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c @@ -0,0 +1,143 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "include/private/crc.h" + +/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ + +FLAC__byte const FLAC__crc8_table[256] = { + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, + 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, + 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, + 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, + 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, + 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, + 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, + 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, + 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, + 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, + 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, + 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, + 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, + 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, + 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, + 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, + 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, + 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, + 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, + 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, + 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, + 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, + 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, + 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, + 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, + 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, + 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 +}; + +/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ + +unsigned const FLAC__crc16_table[256] = { + 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, + 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, + 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, + 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, + 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, + 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, + 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, + 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, + 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, + 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, + 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, + 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, + 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, + 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, + 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, + 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, + 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, + 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, + 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, + 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, + 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, + 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, + 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, + 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, + 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, + 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, + 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, + 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, + 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 +}; + + +void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) +{ + *crc = FLAC__crc8_table[*crc ^ data]; +} + +void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) +{ + while(len--) + *crc = FLAC__crc8_table[*crc ^ *data++]; +} + +FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) +{ + FLAC__uint8 crc = 0; + + while(len--) + crc = FLAC__crc8_table[crc ^ *data++]; + + return crc; +} + +unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) +{ + unsigned crc = 0; + + while(len--) + crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; + + return crc; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c new file mode 100644 index 0000000000..f8ebeda948 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c @@ -0,0 +1,431 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "include/private/bitmath.h" +#include "include/private/fixed.h" +#include "../assert.h" + +#ifndef M_LN2 +/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ +#define M_LN2 0.69314718055994530942 +#endif + +#ifdef local_abs +#undef local_abs +#endif +#define local_abs(x) ((unsigned)((x)<0? -(x) : (x))) + +#ifdef FLAC__INTEGER_ONLY_LIBRARY +/* rbps stands for residual bits per sample + * + * (ln(2) * err) + * rbps = log (-----------) + * 2 ( n ) + */ +static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) +{ + FLAC__uint32 rbps; + unsigned bits; /* the number of bits required to represent a number */ + int fracbits; /* the number of bits of rbps that comprise the fractional part */ + + FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); + FLAC__ASSERT(err > 0); + FLAC__ASSERT(n > 0); + + FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); + if(err <= n) + return 0; + /* + * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. + * These allow us later to know we won't lose too much precision in the + * fixed-point division (err< 0); + bits = FLAC__bitmath_ilog2(err)+1; + if(bits > 16) { + err >>= (bits-16); + fracbits -= (bits-16); + } + rbps = (FLAC__uint32)err; + + /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ + rbps *= FLAC__FP_LN2; + fracbits += 16; + FLAC__ASSERT(fracbits >= 0); + + /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ + { + const int f = fracbits & 3; + if(f) { + rbps >>= f; + fracbits -= f; + } + } + + rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); + + if(rbps == 0) + return 0; + + /* + * The return value must have 16 fractional bits. Since the whole part + * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits + * must be >= -3, these assertion allows us to be able to shift rbps + * left if necessary to get 16 fracbits without losing any bits of the + * whole part of rbps. + * + * There is a slight chance due to accumulated error that the whole part + * will require 6 bits, so we use 6 in the assertion. Really though as + * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. + */ + FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); + FLAC__ASSERT(fracbits >= -3); + + /* now shift the decimal point into place */ + if(fracbits < 16) + return rbps << (16-fracbits); + else if(fracbits > 16) + return rbps >> (fracbits-16); + else + return rbps; +} + +static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) +{ + FLAC__uint32 rbps; + unsigned bits; /* the number of bits required to represent a number */ + int fracbits; /* the number of bits of rbps that comprise the fractional part */ + + FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); + FLAC__ASSERT(err > 0); + FLAC__ASSERT(n > 0); + + FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); + if(err <= n) + return 0; + /* + * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. + * These allow us later to know we won't lose too much precision in the + * fixed-point division (err< 0); + bits = FLAC__bitmath_ilog2_wide(err)+1; + if(bits > 16) { + err >>= (bits-16); + fracbits -= (bits-16); + } + rbps = (FLAC__uint32)err; + + /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ + rbps *= FLAC__FP_LN2; + fracbits += 16; + FLAC__ASSERT(fracbits >= 0); + + /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ + { + const int f = fracbits & 3; + if(f) { + rbps >>= f; + fracbits -= f; + } + } + + rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); + + if(rbps == 0) + return 0; + + /* + * The return value must have 16 fractional bits. Since the whole part + * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits + * must be >= -3, these assertion allows us to be able to shift rbps + * left if necessary to get 16 fracbits without losing any bits of the + * whole part of rbps. + * + * There is a slight chance due to accumulated error that the whole part + * will require 6 bits, so we use 6 in the assertion. Really though as + * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. + */ + FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); + FLAC__ASSERT(fracbits >= -3); + + /* now shift the decimal point into place */ + if(fracbits < 16) + return rbps << (16-fracbits); + else if(fracbits > 16) + return rbps >> (fracbits-16); + else + return rbps; +} +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#else +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#endif +{ + FLAC__int32 last_error_0 = data[-1]; + FLAC__int32 last_error_1 = data[-1] - data[-2]; + FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); + FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); + FLAC__int32 error, save; + FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; + unsigned i, order; + + for(i = 0; i < data_len; i++) { + error = data[i] ; total_error_0 += local_abs(error); save = error; + error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; + error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; + error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; + error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; + } + + if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) + order = 0; + else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) + order = 1; + else if(total_error_2 < flac_min(total_error_3, total_error_4)) + order = 2; + else if(total_error_3 < total_error_4) + order = 3; + else + order = 4; + + /* Estimate the expected number of bits per residual signal sample. */ + /* 'total_error*' is linearly related to the variance of the residual */ + /* signal, so we use it directly to compute E(|x|) */ + FLAC__ASSERT(data_len > 0 || total_error_0 == 0); + FLAC__ASSERT(data_len > 0 || total_error_1 == 0); + FLAC__ASSERT(data_len > 0 || total_error_2 == 0); + FLAC__ASSERT(data_len > 0 || total_error_3 == 0); + FLAC__ASSERT(data_len > 0 || total_error_4 == 0); +#ifndef FLAC__INTEGER_ONLY_LIBRARY + residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); +#else + residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; + residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; + residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; + residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; + residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; +#endif + + return order; +} + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#else +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#endif +{ + FLAC__int32 last_error_0 = data[-1]; + FLAC__int32 last_error_1 = data[-1] - data[-2]; + FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); + FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); + FLAC__int32 error, save; + /* total_error_* are 64-bits to avoid overflow when encoding + * erratic signals when the bits-per-sample and blocksize are + * large. + */ + FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; + unsigned i, order; + + for(i = 0; i < data_len; i++) { + error = data[i] ; total_error_0 += local_abs(error); save = error; + error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; + error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; + error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; + error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; + } + + if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) + order = 0; + else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) + order = 1; + else if(total_error_2 < flac_min(total_error_3, total_error_4)) + order = 2; + else if(total_error_3 < total_error_4) + order = 3; + else + order = 4; + + /* Estimate the expected number of bits per residual signal sample. */ + /* 'total_error*' is linearly related to the variance of the residual */ + /* signal, so we use it directly to compute E(|x|) */ + FLAC__ASSERT(data_len > 0 || total_error_0 == 0); + FLAC__ASSERT(data_len > 0 || total_error_1 == 0); + FLAC__ASSERT(data_len > 0 || total_error_2 == 0); + FLAC__ASSERT(data_len > 0 || total_error_3 == 0); + FLAC__ASSERT(data_len > 0 || total_error_4 == 0); +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if defined _MSC_VER || defined __MINGW32__ + /* with MSVC you have to spoon feed it the casting */ + residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); +#else + residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); +#endif +#else + residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; + residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; + residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; + residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; + residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; +#endif + + return order; +} + +void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]) +{ + const int idata_len = (int)data_len; + int i; + + switch(order) { + case 0: + FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); + memcpy(residual, data, sizeof(residual[0])*data_len); + break; + case 1: + for(i = 0; i < idata_len; i++) + residual[i] = data[i] - data[i-1]; + break; + case 2: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + residual[i] = data[i] - (data[i-1] << 1) + data[i-2]; +#else + residual[i] = data[i] - 2*data[i-1] + data[i-2]; +#endif + break; + case 3: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3]; +#else + residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; +#endif + break; + case 4: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4]; +#else + residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; +#endif + break; + default: + FLAC__ASSERT(0); + } +} + +void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]) +{ + int i, idata_len = (int)data_len; + + switch(order) { + case 0: + FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); + memcpy(data, residual, sizeof(residual[0])*data_len); + break; + case 1: + for(i = 0; i < idata_len; i++) + data[i] = residual[i] + data[i-1]; + break; + case 2: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + data[i] = residual[i] + (data[i-1]<<1) - data[i-2]; +#else + data[i] = residual[i] + 2*data[i-1] - data[i-2]; +#endif + break; + case 3: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3]; +#else + data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; +#endif + break; + case 4: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4]; +#else + data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; +#endif + break; + default: + FLAC__ASSERT(0); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c new file mode 100644 index 0000000000..ae1040712a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c @@ -0,0 +1,302 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2004-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "../assert.h" +#include "../compat.h" +#include "include/private/float.h" + +#ifdef FLAC__INTEGER_ONLY_LIBRARY + +const FLAC__fixedpoint FLAC__FP_ZERO = 0; +const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000; +const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000; +const FLAC__fixedpoint FLAC__FP_LN2 = 45426; +const FLAC__fixedpoint FLAC__FP_E = 178145; + +/* Lookup tables for Knuth's logarithm algorithm */ +#define LOG2_LOOKUP_PRECISION 16 +static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = { + { + /* + * 0 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000001, + /* lg(4/3) = */ 0x00000000, + /* lg(8/7) = */ 0x00000000, + /* lg(16/15) = */ 0x00000000, + /* lg(32/31) = */ 0x00000000, + /* lg(64/63) = */ 0x00000000, + /* lg(128/127) = */ 0x00000000, + /* lg(256/255) = */ 0x00000000, + /* lg(512/511) = */ 0x00000000, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 4 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000010, + /* lg(4/3) = */ 0x00000007, + /* lg(8/7) = */ 0x00000003, + /* lg(16/15) = */ 0x00000001, + /* lg(32/31) = */ 0x00000001, + /* lg(64/63) = */ 0x00000000, + /* lg(128/127) = */ 0x00000000, + /* lg(256/255) = */ 0x00000000, + /* lg(512/511) = */ 0x00000000, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 8 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000100, + /* lg(4/3) = */ 0x0000006a, + /* lg(8/7) = */ 0x00000031, + /* lg(16/15) = */ 0x00000018, + /* lg(32/31) = */ 0x0000000c, + /* lg(64/63) = */ 0x00000006, + /* lg(128/127) = */ 0x00000003, + /* lg(256/255) = */ 0x00000001, + /* lg(512/511) = */ 0x00000001, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 12 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00001000, + /* lg(4/3) = */ 0x000006a4, + /* lg(8/7) = */ 0x00000315, + /* lg(16/15) = */ 0x0000017d, + /* lg(32/31) = */ 0x000000bc, + /* lg(64/63) = */ 0x0000005d, + /* lg(128/127) = */ 0x0000002e, + /* lg(256/255) = */ 0x00000017, + /* lg(512/511) = */ 0x0000000c, + /* lg(1024/1023) = */ 0x00000006, + /* lg(2048/2047) = */ 0x00000003, + /* lg(4096/4095) = */ 0x00000001, + /* lg(8192/8191) = */ 0x00000001, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 16 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00010000, + /* lg(4/3) = */ 0x00006a40, + /* lg(8/7) = */ 0x00003151, + /* lg(16/15) = */ 0x000017d6, + /* lg(32/31) = */ 0x00000bba, + /* lg(64/63) = */ 0x000005d1, + /* lg(128/127) = */ 0x000002e6, + /* lg(256/255) = */ 0x00000172, + /* lg(512/511) = */ 0x000000b9, + /* lg(1024/1023) = */ 0x0000005c, + /* lg(2048/2047) = */ 0x0000002e, + /* lg(4096/4095) = */ 0x00000017, + /* lg(8192/8191) = */ 0x0000000c, + /* lg(16384/16383) = */ 0x00000006, + /* lg(32768/32767) = */ 0x00000003 + }, + { + /* + * 20 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00100000, + /* lg(4/3) = */ 0x0006a3fe, + /* lg(8/7) = */ 0x00031513, + /* lg(16/15) = */ 0x00017d60, + /* lg(32/31) = */ 0x0000bb9d, + /* lg(64/63) = */ 0x00005d10, + /* lg(128/127) = */ 0x00002e59, + /* lg(256/255) = */ 0x00001721, + /* lg(512/511) = */ 0x00000b8e, + /* lg(1024/1023) = */ 0x000005c6, + /* lg(2048/2047) = */ 0x000002e3, + /* lg(4096/4095) = */ 0x00000171, + /* lg(8192/8191) = */ 0x000000b9, + /* lg(16384/16383) = */ 0x0000005c, + /* lg(32768/32767) = */ 0x0000002e + }, + { + /* + * 24 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x01000000, + /* lg(4/3) = */ 0x006a3fe6, + /* lg(8/7) = */ 0x00315130, + /* lg(16/15) = */ 0x0017d605, + /* lg(32/31) = */ 0x000bb9ca, + /* lg(64/63) = */ 0x0005d0fc, + /* lg(128/127) = */ 0x0002e58f, + /* lg(256/255) = */ 0x0001720e, + /* lg(512/511) = */ 0x0000b8d8, + /* lg(1024/1023) = */ 0x00005c61, + /* lg(2048/2047) = */ 0x00002e2d, + /* lg(4096/4095) = */ 0x00001716, + /* lg(8192/8191) = */ 0x00000b8b, + /* lg(16384/16383) = */ 0x000005c5, + /* lg(32768/32767) = */ 0x000002e3 + }, + { + /* + * 28 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x10000000, + /* lg(4/3) = */ 0x06a3fe5c, + /* lg(8/7) = */ 0x03151301, + /* lg(16/15) = */ 0x017d6049, + /* lg(32/31) = */ 0x00bb9ca6, + /* lg(64/63) = */ 0x005d0fba, + /* lg(128/127) = */ 0x002e58f7, + /* lg(256/255) = */ 0x001720da, + /* lg(512/511) = */ 0x000b8d87, + /* lg(1024/1023) = */ 0x0005c60b, + /* lg(2048/2047) = */ 0x0002e2d7, + /* lg(4096/4095) = */ 0x00017160, + /* lg(8192/8191) = */ 0x0000b8ad, + /* lg(16384/16383) = */ 0x00005c56, + /* lg(32768/32767) = */ 0x00002e2b + } +}; + +#if 0 +static const FLAC__uint64 log2_lookup_wide[] = { + { + /* + * 32 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ FLAC__U64L(0x100000000), + /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), + /* lg(8/7) = */ FLAC__U64L(0x31513015), + /* lg(16/15) = */ FLAC__U64L(0x17d60497), + /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), + /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), + /* lg(128/127) = */ FLAC__U64L(0x02e58f74), + /* lg(256/255) = */ FLAC__U64L(0x01720d9c), + /* lg(512/511) = */ FLAC__U64L(0x00b8d875), + /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), + /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), + /* lg(4096/4095) = */ FLAC__U64L(0x00171600), + /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), + /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), + /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) + }, + { + /* + * 48 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ FLAC__U64L(0x1000000000000), + /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), + /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), + /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), + /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), + /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), + /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), + /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), + /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), + /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), + /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), + /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), + /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), + /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), + /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) + } +}; +#endif + +FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision) +{ + const FLAC__uint32 ONE = (1u << fracbits); + const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; + + FLAC__ASSERT(fracbits < 32); + FLAC__ASSERT((fracbits & 0x3) == 0); + + if(x < ONE) + return 0; + + if(precision > LOG2_LOOKUP_PRECISION) + precision = LOG2_LOOKUP_PRECISION; + + /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ + { + FLAC__uint32 y = 0; + FLAC__uint32 z = x >> 1, k = 1; + while (x > ONE && k < precision) { + if (x - z >= ONE) { + x -= z; + z = x >> k; + y += table[k]; + } + else { + z >>= 1; + k++; + } + } + return y; + } +} + +#endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c new file mode 100644 index 0000000000..1f37de9f87 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c @@ -0,0 +1,589 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include /* for qsort() */ +#include /* for memset() */ +#include "../assert.h" +#include "../format.h" +#include "../compat.h" +#include "include/private/format.h" + +/* VERSION should come from configure */ +FLAC_API const char *FLAC__VERSION_STRING = VERSION; + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINW32__ +/* yet one more hack because of MSVC6: */ +FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC 1.3.0 20130526"; +#else +FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20130526"; +#endif + +FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; +FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; +FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN = 3; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN = 5; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN = 36; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN = 128; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN = 16; /* bits */ + +FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER = FLAC__U64L(0xffffffffffffffff); + +FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN = 8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3*8; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN = 8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN = 1; /* bit */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN = 1; /* bit */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6+13*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN = 8; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN = 1; /* bit */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7+258*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN = 8; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN = 7; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN = 24; /* bits */ + +FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC = 0x3ffe; +FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN = 14; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN = 3; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN = 8; /* bits */ + +FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN = 16; /* bits */ + +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN = 2; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN = 5; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN = 5; /* bits */ + +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER = 15; /* == (1< FLAC__MAX_SAMPLE_RATE) { + return false; + } + else + return true; +} + +FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate) +{ + if(blocksize > 16384) + return false; + else if(sample_rate <= 48000 && blocksize > 4608) + return false; + else + return true; +} + +FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate) +{ + if( + !FLAC__format_sample_rate_is_valid(sample_rate) || + ( + sample_rate >= (1u << 16) && + !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) + ) + ) { + return false; + } + else + return true; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table) +{ + unsigned i; + FLAC__uint64 prev_sample_number = 0; + FLAC__bool got_prev = false; + + FLAC__ASSERT(0 != seek_table); + + for(i = 0; i < seek_table->num_points; i++) { + if(got_prev) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].sample_number <= prev_sample_number + ) + return false; + } + prev_sample_number = seek_table->points[i].sample_number; + got_prev = true; + } + + return true; +} + +/* used as the sort predicate for qsort() */ +static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r) +{ + /* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */ + if(l->sample_number == r->sample_number) + return 0; + else if(l->sample_number < r->sample_number) + return -1; + else + return 1; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table) +{ + unsigned i, j; + FLAC__bool first; + + FLAC__ASSERT(0 != seek_table); + + /* sort the seekpoints */ + qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_); + + /* uniquify the seekpoints */ + first = true; + for(i = j = 0; i < seek_table->num_points; i++) { + if(seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) { + if(!first) { + if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number) + continue; + } + } + first = false; + seek_table->points[j++] = seek_table->points[i]; + } + + for(i = j; i < seek_table->num_points; i++) { + seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + seek_table->points[i].stream_offset = 0; + seek_table->points[i].frame_samples = 0; + } + + return j; +} + +/* + * also disallows non-shortest-form encodings, c.f. + * http://www.unicode.org/versions/corrigendum1.html + * and a more clear explanation at the end of this section: + * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + */ +static unsigned utf8len_(const FLAC__byte *utf8) +{ + FLAC__ASSERT(0 != utf8); + if ((utf8[0] & 0x80) == 0) { + return 1; + } + else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { + if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ + return 0; + return 2; + } + else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) { + if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) /* overlong sequence check */ + return 0; + /* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */ + if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) /* D800-DFFF */ + return 0; + if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) /* FFFE-FFFF */ + return 0; + return 3; + } + else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) { + if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) /* overlong sequence check */ + return 0; + return 4; + } + else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) { + if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) /* overlong sequence check */ + return 0; + return 5; + } + else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) { + if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) /* overlong sequence check */ + return 0; + return 6; + } + else { + return 0; + } +} + +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name) +{ + char c; + for(c = *name; c; c = *(++name)) + if(c < 0x20 || c == 0x3d || c > 0x7d) + return false; + return true; +} + +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length) +{ + if(length == (unsigned)(-1)) { + while(*value) { + unsigned n = utf8len_(value); + if(n == 0) + return false; + value += n; + } + } + else { + const FLAC__byte *end = value + length; + while(value < end) { + unsigned n = utf8len_(value); + if(n == 0) + return false; + value += n; + } + if(value != end) + return false; + } + return true; +} + +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length) +{ + const FLAC__byte *s, *end; + + for(s = entry, end = s + length; s < end && *s != '='; s++) { + if(*s < 0x20 || *s > 0x7D) + return false; + } + if(s == end) + return false; + + s++; /* skip '=' */ + + while(s < end) { + unsigned n = utf8len_(s); + if(n == 0) + return false; + s += n; + } + if(s != end) + return false; + + return true; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation) +{ + unsigned i, j; + + if(check_cd_da_subset) { + if(cue_sheet->lead_in < 2 * 44100) { + if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; + return false; + } + if(cue_sheet->lead_in % 588 != 0) { + if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; + return false; + } + } + + if(cue_sheet->num_tracks == 0) { + if(violation) *violation = "cue sheet must have at least one track (the lead-out)"; + return false; + } + + if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) { + if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; + return false; + } + + for(i = 0; i < cue_sheet->num_tracks; i++) { + if(cue_sheet->tracks[i].number == 0) { + if(violation) *violation = "cue sheet may not have a track number 0"; + return false; + } + + if(check_cd_da_subset) { + if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { + if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170"; + return false; + } + } + + if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { + if(violation) { + if(i == cue_sheet->num_tracks-1) /* the lead-out track... */ + *violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples"; + else + *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; + } + return false; + } + + if(i < cue_sheet->num_tracks - 1) { + if(cue_sheet->tracks[i].num_indices == 0) { + if(violation) *violation = "cue sheet track must have at least one index point"; + return false; + } + + if(cue_sheet->tracks[i].indices[0].number > 1) { + if(violation) *violation = "cue sheet track's first index number must be 0 or 1"; + return false; + } + } + + for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) { + if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { + if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; + return false; + } + + if(j > 0) { + if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) { + if(violation) *violation = "cue sheet track index numbers must increase by 1"; + return false; + } + } + } + } + + return true; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation) +{ + char *p; + FLAC__byte *b; + + for(p = picture->mime_type; *p; p++) { + if(*p < 0x20 || *p > 0x7e) { + if(violation) *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)"; + return false; + } + } + + for(b = picture->description; *b; ) { + unsigned n = utf8len_(b); + if(n == 0) { + if(violation) *violation = "description string must be valid UTF-8"; + return false; + } + b += n; + } + + return true; +} + +/* + * These routines are private to libFLAC + */ +unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order) +{ + return + FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( + FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), + blocksize, + predictor_order + ); +} + +unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize) +{ + unsigned max_rice_partition_order = 0; + while(!(blocksize & 1)) { + max_rice_partition_order++; + blocksize >>= 1; + } + return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); +} + +unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order) +{ + unsigned max_rice_partition_order = limit; + + while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) + max_rice_partition_order--; + + FLAC__ASSERT( + (max_rice_partition_order == 0 && blocksize >= predictor_order) || + (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) + ); + + return max_rice_partition_order; +} + +void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) +{ + FLAC__ASSERT(0 != object); + + object->parameters = 0; + object->raw_bits = 0; + object->capacity_by_order = 0; +} + +void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) +{ + FLAC__ASSERT(0 != object); + + if(0 != object->parameters) + free(object->parameters); + if(0 != object->raw_bits) + free(object->raw_bits); + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object); +} + +FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order) +{ + FLAC__ASSERT(0 != object); + + FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); + + if(object->capacity_by_order < max_partition_order) { + if(0 == (object->parameters = (unsigned int*) realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order)))) + return false; + if(0 == (object->raw_bits = (unsigned int*) realloc(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order)))) + return false; + memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition_order)); + object->capacity_by_order = max_partition_order; + } + + return true; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h new file mode 100644 index 0000000000..29253097e6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h @@ -0,0 +1,50 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__ALL_H +#define FLAC__PRIVATE__ALL_H + +#include "bitmath.h" +#include "bitreader.h" +#include "bitwriter.h" +#include "cpu.h" +#include "crc.h" +#include "fixed.h" +#include "float.h" +#include "format.h" +#include "lpc.h" +#include "md5.h" +#include "memory.h" +#include "metadata.h" +#include "stream_encoder_framing.h" + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h new file mode 100644 index 0000000000..371bd488ee --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h @@ -0,0 +1,171 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__BITMATH_H +#define FLAC__PRIVATE__BITMATH_H + +#include "../../../ordinals.h" + +/* for CHAR_BIT */ +#include +#include "../../../compat.h" + +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#include /* for _BitScanReverse* */ +#endif + +/* Will never be emitted for MSVC, GCC, Intel compilers */ +static inline unsigned int FLAC__clz_soft_uint32(unsigned int word) +{ + static const unsigned char byte_to_unary_table[] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + return (word) > 0xffffff ? byte_to_unary_table[(word) >> 24] : + (word) > 0xffff ? byte_to_unary_table[(word) >> 16] + 8 : + (word) > 0xff ? byte_to_unary_table[(word) >> 8] + 16 : + byte_to_unary_table[(word)] + 24; +} + +static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v) +{ +/* Never used with input 0 */ +#if defined(__INTEL_COMPILER) + return _bit_scan_reverse(v) ^ 31U; +#elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +/* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on + * -march= setting or to a software rutine in exotic machines. */ + return __builtin_clz(v); +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + FLAC__uint32 idx; + _BitScanReverse((DWORD*) &idx, v); + return idx ^ 31U; +#else + return FLAC__clz_soft_uint32(v); +#endif +} + +/* This one works with input 0 */ +static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) +{ + if (!v) + return 32; + return FLAC__clz_uint32(v); +} + +/* An example of what FLAC__bitmath_ilog2() computes: + * + * ilog2( 0) = undefined + * ilog2( 1) = 0 + * ilog2( 2) = 1 + * ilog2( 3) = 1 + * ilog2( 4) = 2 + * ilog2( 5) = 2 + * ilog2( 6) = 2 + * ilog2( 7) = 2 + * ilog2( 8) = 3 + * ilog2( 9) = 3 + * ilog2(10) = 3 + * ilog2(11) = 3 + * ilog2(12) = 3 + * ilog2(13) = 3 + * ilog2(14) = 3 + * ilog2(15) = 3 + * ilog2(16) = 4 + * ilog2(17) = 4 + * ilog2(18) = 4 + */ + +static inline unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) +{ + return sizeof(FLAC__uint32) * CHAR_BIT - 1 - FLAC__clz_uint32(v); +} + + +#ifdef FLAC__INTEGER_ONLY_LIBRARY /*Unused otherwise */ + +static inline unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) +{ + if (v == 0) + return 0; +#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) + return sizeof(FLAC__uint64) * CHAR_BIT - 1 - __builtin_clzll(v); +/* Sorry, only supported in win64/Itanium.. */ +#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_WIN64)) + FLAC__uint64 idx; + _BitScanReverse64(&idx, v); + return idx ^ 63U; +#else +/* Brain-damaged compilers will use the fastest possible way that is, + de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf) + (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 LGPL (v2 or later). +*/ + static const unsigned char DEBRUIJN_IDX64[64]={ + 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40, + 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57, + 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56, + 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58 + }; + int ret; + ret= v>0; + v|= v>>1; + v|= v>>2; + v|= v>>4; + v|= v>>8; + v|= v>>16; + v|= v>>32; + v= (v>>1)+1; + ret+=DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F]; + return ret; +#endif +} +#endif + +unsigned FLAC__bitmath_silog2(int v); +unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h new file mode 100644 index 0000000000..4d9668fff7 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h @@ -0,0 +1,100 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__BITREADER_H +#define FLAC__PRIVATE__BITREADER_H + +#include /* for FILE */ +#include "../../../ordinals.h" +#include "cpu.h" + +/* + * opaque structure definition + */ +struct FLAC__BitReader; +typedef struct FLAC__BitReader FLAC__BitReader; + +typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); + +/* + * construction, deletion, initialization, etc functions + */ +FLAC__BitReader *FLAC__bitreader_new(void); +void FLAC__bitreader_delete(FLAC__BitReader *br); +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd); +void FLAC__bitreader_free(FLAC__BitReader *br); /* does not 'free(br)' */ +FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br); +void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out); + +/* + * CRC functions + */ +void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); +FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); + +/* + * info functions + */ +FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); +unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); +unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); + +/* + * read functions + */ + +FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits); +FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits); +FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits); +FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/ +FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */ +FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ +FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ +FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val); +FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter); +FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +FLAC__bool FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); +# endif +# endif +#endif +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter); +FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter); +#endif +FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen); +FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen); + +FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br); +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h new file mode 100644 index 0000000000..b1ff5e6eec --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h @@ -0,0 +1,104 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__BITWRITER_H +#define FLAC__PRIVATE__BITWRITER_H + +#include /* for FILE */ +#include "../../../ordinals.h" + +/* + * opaque structure definition + */ +struct FLAC__BitWriter; +typedef struct FLAC__BitWriter FLAC__BitWriter; + +/* + * construction, deletion, initialization, etc functions + */ +FLAC__BitWriter *FLAC__bitwriter_new(void); +void FLAC__bitwriter_delete(FLAC__BitWriter *bw); +FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw); +void FLAC__bitwriter_free(FLAC__BitWriter *bw); /* does not 'free(buffer)' */ +void FLAC__bitwriter_clear(FLAC__BitWriter *bw); +void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out); + +/* + * CRC functions + * + * non-const *bw because they have to cal FLAC__bitwriter_get_buffer() + */ +FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc); +FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc); + +/* + * info functions + */ +FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw); +unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw); /* can be called anytime, returns total # of bits unconsumed */ + +/* + * direct buffer access + * + * there may be no calls on the bitwriter between get and release. + * the bitwriter continues to own the returned buffer. + * before get, bitwriter MUST be byte aligned: check with FLAC__bitwriter_is_byte_aligned() + */ +FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes); +void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw); + +/* + * write functions + */ +FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); /*only for bits=32*/ +FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); +FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val); +unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter); +#if 0 /* UNUSED */ +unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter); +unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned val, unsigned parameter); +#endif +FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter); +FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter); +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter); +FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned val, unsigned parameter); +#endif +FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val); +FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val); +FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h new file mode 100644 index 0000000000..930d678072 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h @@ -0,0 +1,89 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__CPU_H +#define FLAC__PRIVATE__CPU_H + +#include "../../../ordinals.h" + +#ifdef HAVE_CONFIG_H +#include +#endif + +typedef enum { + FLAC__CPUINFO_TYPE_IA32, + FLAC__CPUINFO_TYPE_PPC, + FLAC__CPUINFO_TYPE_UNKNOWN +} FLAC__CPUInfo_Type; + +typedef struct { + FLAC__bool cpuid; + FLAC__bool bswap; + FLAC__bool cmov; + FLAC__bool mmx; + FLAC__bool fxsr; + FLAC__bool sse; + FLAC__bool sse2; + FLAC__bool sse3; + FLAC__bool ssse3; + FLAC__bool _3dnow; + FLAC__bool ext3dnow; + FLAC__bool extmmx; +} FLAC__CPUInfo_IA32; + +typedef struct { + FLAC__bool altivec; + FLAC__bool ppc64; +} FLAC__CPUInfo_PPC; + +typedef struct { + FLAC__bool use_asm; + FLAC__CPUInfo_Type type; + union { + FLAC__CPUInfo_IA32 ia32; + FLAC__CPUInfo_PPC ppc; + } data; +} FLAC__CPUInfo; + +void FLAC__cpu_info(FLAC__CPUInfo *info); + +#ifndef FLAC__NO_ASM +#ifdef FLAC__CPU_IA32 +#ifdef FLAC__HAS_NASM +FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void); +void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx); +FLAC__uint32 FLAC__cpu_info_extended_amd_asm_ia32(void); +#endif +#endif +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h new file mode 100644 index 0000000000..62847831de --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h @@ -0,0 +1,62 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__CRC_H +#define FLAC__PRIVATE__CRC_H + +#include "../../../ordinals.h" + +/* 8 bit CRC generator, MSB shifted first +** polynomial = x^8 + x^2 + x^1 + x^0 +** init = 0 +*/ +extern FLAC__byte const FLAC__crc8_table[256]; +#define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)]; +void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); +void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); +FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); + +/* 16 bit CRC generator, MSB shifted first +** polynomial = x^16 + x^15 + x^2 + x^0 +** init = 0 +*/ +extern unsigned const FLAC__crc16_table[256]; + +#define FLAC__CRC16_UPDATE(data, crc) (((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)])) +/* this alternate may be faster on some systems/compilers */ +#if 0 +#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) & 0xffff) +#endif + +unsigned FLAC__crc16(const FLAC__byte *data, unsigned len); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h new file mode 100644 index 0000000000..0123bed347 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h @@ -0,0 +1,98 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__FIXED_H +#define FLAC__PRIVATE__FIXED_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "float.h" +#include "../../../format.h" + +/* + * FLAC__fixed_compute_best_predictor() + * -------------------------------------------------------------------- + * Compute the best fixed predictor and the expected bits-per-sample + * of the residual signal for each order. The _wide() version uses + * 64-bit integers which is statistically necessary when bits-per- + * sample + log2(blocksize) > 30 + * + * IN data[0,data_len-1] + * IN data_len + * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] + */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +# ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +# endif +# endif +# endif +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#else +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#endif + +/* + * FLAC__fixed_compute_residual() + * -------------------------------------------------------------------- + * Compute the residual signal obtained from sutracting the predicted + * signal from the original. + * + * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) + * IN data_len length of original signal + * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order + * OUT residual[0,data_len-1] residual signal + */ +void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]); + +/* + * FLAC__fixed_restore_signal() + * -------------------------------------------------------------------- + * Restore the original signal by summing the residual and the + * predictor. + * + * IN residual[0,data_len-1] residual signal + * IN data_len length of original signal + * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order + * *** IMPORTANT: the caller must pass in the historical samples: + * IN data[-order,-1] previously-reconstructed historical samples + * OUT data[0,data_len-1] original signal + */ +void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h new file mode 100644 index 0000000000..74d17ed221 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h @@ -0,0 +1,98 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2004-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__FLOAT_H +#define FLAC__PRIVATE__FLOAT_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "../../../ordinals.h" + +/* + * These typedefs make it easier to ensure that integer versions of + * the library really only contain integer operations. All the code + * in libFLAC should use FLAC__float and FLAC__double in place of + * float and double, and be protected by checks of the macro + * FLAC__INTEGER_ONLY_LIBRARY. + * + * FLAC__real is the basic floating point type used in LPC analysis. + */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY +typedef double FLAC__double; +typedef float FLAC__float; +/* + * WATCHOUT: changing FLAC__real will change the signatures of many + * functions that have assembly language equivalents and break them. + */ +typedef float FLAC__real; +#else +/* + * The convention for FLAC__fixedpoint is to use the upper 16 bits + * for the integer part and lower 16 bits for the fractional part. + */ +typedef FLAC__int32 FLAC__fixedpoint; +extern const FLAC__fixedpoint FLAC__FP_ZERO; +extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; +extern const FLAC__fixedpoint FLAC__FP_ONE; +extern const FLAC__fixedpoint FLAC__FP_LN2; +extern const FLAC__fixedpoint FLAC__FP_E; + +#define FLAC__fixedpoint_trunc(x) ((x)>>16) + +#define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) ) + +#define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) + +/* + * FLAC__fixedpoint_log2() + * -------------------------------------------------------------------- + * Returns the base-2 logarithm of the fixed-point number 'x' using an + * algorithm by Knuth for x >= 1.0 + * + * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must + * be < 32 and evenly divisible by 4 (0 is OK but not very precise). + * + * 'precision' roughly limits the number of iterations that are done; + * use (unsigned)(-1) for maximum precision. + * + * If 'x' is less than one -- that is, x < (1< +#endif + +#include "float.h" +#include "../../../format.h" + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +/* + * FLAC__lpc_window_data() + * -------------------------------------------------------------------- + * Applies the given window to the data. + * OPT: asm implementation + * + * IN in[0,data_len-1] + * IN window[0,data_len-1] + * OUT out[0,lag-1] + * IN data_len + */ +void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len); + +/* + * FLAC__lpc_compute_autocorrelation() + * -------------------------------------------------------------------- + * Compute the autocorrelation for lags between 0 and lag-1. + * Assumes data[] outside of [0,data_len-1] == 0. + * Asserts that lag > 0. + * + * IN data[0,data_len-1] + * IN data_len + * IN 0 < lag <= data_len + * OUT autoc[0,lag-1] + */ +void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +# endif +# endif +#endif + +/* + * FLAC__lpc_compute_lp_coefficients() + * -------------------------------------------------------------------- + * Computes LP coefficients for orders 1..max_order. + * Do not call if autoc[0] == 0.0. This means the signal is zero + * and there is no point in calculating a predictor. + * + * IN autoc[0,max_order] autocorrelation values + * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute + * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order + * *** IMPORTANT: + * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched + * OUT error[0,max_order-1] error for each order (more + * specifically, the variance of + * the error signal times # of + * samples in the signal) + * + * Example: if max_order is 9, the LP coefficients for order 9 will be + * in lp_coeff[8][0,8], the LP coefficients for order 8 will be + * in lp_coeff[7][0,7], etc. + */ +void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]); + +/* + * FLAC__lpc_quantize_coefficients() + * -------------------------------------------------------------------- + * Quantizes the LP coefficients. NOTE: precision + bits_per_sample + * must be less than 32 (sizeof(FLAC__int32)*8). + * + * IN lp_coeff[0,order-1] LP coefficients + * IN order LP order + * IN FLAC__MIN_QLP_COEFF_PRECISION < precision + * desired precision (in bits, including sign + * bit) of largest coefficient + * OUT qlp_coeff[0,order-1] quantized coefficients + * OUT shift # of bits to shift right to get approximated + * LP coefficients. NOTE: could be negative. + * RETURN 0 => quantization OK + * 1 => coefficients require too much shifting for *shift to + * fit in the LPC subframe header. 'shift' is unset. + * 2 => coefficients are all zero, which is bad. 'shift' is + * unset. + */ +int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift); + +/* + * FLAC__lpc_compute_residual_from_qlp_coefficients() + * -------------------------------------------------------------------- + * Compute the residual signal obtained from sutracting the predicted + * signal from the original. + * + * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) + * IN data_len length of original signal + * IN qlp_coeff[0,order-1] quantized LP coefficients + * IN order > 0 LP order + * IN lp_quantization quantization of LP coefficients in bits + * OUT residual[0,data_len-1] residual signal + */ +void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +# endif +# endif +#endif + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +/* + * FLAC__lpc_restore_signal() + * -------------------------------------------------------------------- + * Restore the original signal by summing the residual and the + * predictor. + * + * IN residual[0,data_len-1] residual signal + * IN data_len length of original signal + * IN qlp_coeff[0,order-1] quantized LP coefficients + * IN order > 0 LP order + * IN lp_quantization quantization of LP coefficients in bits + * *** IMPORTANT: the caller must pass in the historical samples: + * IN data[-order,-1] previously-reconstructed historical samples + * OUT data[0,data_len-1] original signal + */ +void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +void FLAC__lpc_restore_signal_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +void FLAC__lpc_restore_signal_asm_ia32_mmx(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +# endif /* FLAC__HAS_NASM */ +# elif defined FLAC__CPU_PPC +void FLAC__lpc_restore_signal_asm_ppc_altivec_16(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +void FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +# endif/* FLAC__CPU_IA32 || FLAC__CPU_PPC */ +#endif /* FLAC__NO_ASM */ + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +/* + * FLAC__lpc_compute_expected_bits_per_residual_sample() + * -------------------------------------------------------------------- + * Compute the expected number of bits per residual signal sample + * based on the LP error (which is related to the residual variance). + * + * IN lpc_error >= 0.0 error returned from calculating LP coefficients + * IN total_samples > 0 # of samples in residual signal + * RETURN expected bits per sample + */ +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples); +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale); + +/* + * FLAC__lpc_compute_best_order() + * -------------------------------------------------------------------- + * Compute the best order from the array of signal errors returned + * during coefficient computation. + * + * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients + * IN max_order > 0 max LP order + * IN total_samples > 0 # of samples in residual signal + * IN overhead_bits_per_order # of bits overhead for each increased LP order + * (includes warmup sample size and quantized LP coefficient) + * RETURN [1,max_order] best order + */ +unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order); + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h new file mode 100644 index 0000000000..2cf5c5dad0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h @@ -0,0 +1,44 @@ +#ifndef FLAC__PRIVATE__MD5_H +#define FLAC__PRIVATE__MD5_H + +/* + * This is the header file for the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * Changed so as no longer to depend on Colin Plumb's `usual.h' + * header definitions; now uses stuff from dpkg's config.h + * - Ian Jackson . + * Still in the public domain. + * + * Josh Coalson: made some changes to integrate with libFLAC. + * Still in the public domain, with no warranty. + */ + +#include "../../../ordinals.h" + +typedef struct { + FLAC__uint32 in[16]; + FLAC__uint32 buf[4]; + FLAC__uint32 bytes[2]; + FLAC__byte *internal_buf; + size_t capacity; +} FLAC__MD5Context; + +void FLAC__MD5Init(FLAC__MD5Context *context); +void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context); + +FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h new file mode 100644 index 0000000000..d6651c6094 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h @@ -0,0 +1,58 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__MEMORY_H +#define FLAC__PRIVATE__MEMORY_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include /* for size_t */ + +#include "float.h" +#include "../../../ordinals.h" /* for FLAC__bool */ + +/* Returns the unaligned address returned by malloc. + * Use free() on this address to deallocate. + */ +void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); +FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); +FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); +FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); +FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); +#ifndef FLAC__INTEGER_ONLY_LIBRARY +FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); +#endif +void *safe_malloc_mul_2op_p(size_t size1, size_t size2); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h new file mode 100644 index 0000000000..a29050edad --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h @@ -0,0 +1,46 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2002-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__METADATA_H +#define FLAC__PRIVATE__METADATA_H + +#include "FLAC/metadata.h" + +/* WATCHOUT: all malloc()ed data in the block is free()ed; this may not + * be a consistent state (e.g. PICTURE) or equivalent to the initial + * state after FLAC__metadata_object_new() + */ +void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); + +void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h new file mode 100644 index 0000000000..51bf8c357b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h @@ -0,0 +1,46 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H +#define FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H + +#include "../../../format.h" +#include "bitwriter.h" + +FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw); +FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h new file mode 100644 index 0000000000..8acec39ee4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h @@ -0,0 +1,72 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2006-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PRIVATE__WINDOW_H +#define FLAC__PRIVATE__WINDOW_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "float.h" +#include "../../../format.h" + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +/* + * FLAC__window_*() + * -------------------------------------------------------------------- + * Calculates window coefficients according to different apodization + * functions. + * + * OUT window[0,L-1] + * IN L (number of points in window) + */ +void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev); /* 0.0 < stddev <= 0.5 */ +void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p); +void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L); + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h new file mode 100644 index 0000000000..057cd73fa2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h @@ -0,0 +1,39 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PROTECTED__ALL_H +#define FLAC__PROTECTED__ALL_H + +#include "stream_decoder.h" +#include "stream_encoder.h" + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h new file mode 100644 index 0000000000..0d5813fc61 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h @@ -0,0 +1,59 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PROTECTED__STREAM_DECODER_H +#define FLAC__PROTECTED__STREAM_DECODER_H + +#include "../../../stream_decoder.h" +#if FLAC__HAS_OGG +#include "../private/ogg_decoder_aspect.h" +#endif + +typedef struct FLAC__StreamDecoderProtected { + FLAC__StreamDecoderState state; + unsigned channels; + FLAC__ChannelAssignment channel_assignment; + unsigned bits_per_sample; + unsigned sample_rate; /* in Hz */ + unsigned blocksize; /* in samples (per channel) */ + FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ +#if FLAC__HAS_OGG + FLAC__OggDecoderAspect ogg_decoder_aspect; +#endif +} FLAC__StreamDecoderProtected; + +/* + * return the number of input bytes consumed + */ +unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h new file mode 100644 index 0000000000..2c632f955b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h @@ -0,0 +1,111 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__PROTECTED__STREAM_ENCODER_H +#define FLAC__PROTECTED__STREAM_ENCODER_H + +#include "../../../stream_encoder.h" +#if FLAC__HAS_OGG +#include "../private/ogg_encoder_aspect.h" +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#include "../private/float.h" + +#define FLAC__MAX_APODIZATION_FUNCTIONS 32 + +typedef enum { + FLAC__APODIZATION_BARTLETT, + FLAC__APODIZATION_BARTLETT_HANN, + FLAC__APODIZATION_BLACKMAN, + FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, + FLAC__APODIZATION_CONNES, + FLAC__APODIZATION_FLATTOP, + FLAC__APODIZATION_GAUSS, + FLAC__APODIZATION_HAMMING, + FLAC__APODIZATION_HANN, + FLAC__APODIZATION_KAISER_BESSEL, + FLAC__APODIZATION_NUTTALL, + FLAC__APODIZATION_RECTANGLE, + FLAC__APODIZATION_TRIANGLE, + FLAC__APODIZATION_TUKEY, + FLAC__APODIZATION_WELCH +} FLAC__ApodizationFunction; + +typedef struct { + FLAC__ApodizationFunction type; + union { + struct { + FLAC__real stddev; + } gauss; + struct { + FLAC__real p; + } tukey; + } parameters; +} FLAC__ApodizationSpecification; + +#endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY + +typedef struct FLAC__StreamEncoderProtected { + FLAC__StreamEncoderState state; + FLAC__bool verify; + FLAC__bool streamable_subset; + FLAC__bool do_md5; + FLAC__bool do_mid_side_stereo; + FLAC__bool loose_mid_side_stereo; + unsigned channels; + unsigned bits_per_sample; + unsigned sample_rate; + unsigned blocksize; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + unsigned num_apodizations; + FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; +#endif + unsigned max_lpc_order; + unsigned qlp_coeff_precision; + FLAC__bool do_qlp_coeff_prec_search; + FLAC__bool do_exhaustive_model_search; + FLAC__bool do_escape_coding; + unsigned min_residual_partition_order; + unsigned max_residual_partition_order; + unsigned rice_parameter_search_dist; + FLAC__uint64 total_samples_estimate; + FLAC__StreamMetadata **metadata; + unsigned num_metadata_blocks; + FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; +#if FLAC__HAS_OGG + FLAC__OggEncoderAspect ogg_encoder_aspect; +#endif +} FLAC__StreamEncoderProtected; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c new file mode 100644 index 0000000000..5741e7c2b3 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c @@ -0,0 +1,1352 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include + +#include "../assert.h" +#include "../format.h" +#include "../compat.h" +#include "include/private/bitmath.h" +#include "include/private/lpc.h" +#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE +#include +#endif + +/* OPT: #undef'ing this may improve the speed on some architectures */ +#define FLAC__LPC_UNROLLED_FILTER_LOOPS + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#ifndef M_LN2 +/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ +#define M_LN2 0.69314718055994530942 +#endif + +#if !defined(HAVE_LROUND) +#if defined(_MSC_VER) +#include +#define copysign _copysign +#elif defined(__GNUC__) +#define copysign __builtin_copysign +#endif +static inline long int lround(double x) { + return (long)(x + copysign (0.5, x)); +} +//If this fails, we are in the precence of a mid 90's compiler..move along... +#endif + +void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) +{ + unsigned i; + for(i = 0; i < data_len; i++) + out[i] = in[i] * window[i]; +} + +void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) +{ + /* a readable, but slower, version */ +#if 0 + FLAC__real d; + unsigned i; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + /* + * Technically we should subtract the mean first like so: + * for(i = 0; i < data_len; i++) + * data[i] -= mean; + * but it appears not to make enough of a difference to matter, and + * most signals are already closely centered around zero + */ + while(lag--) { + for(i = lag, d = 0.0; i < data_len; i++) + d += data[i] * data[i - lag]; + autoc[lag] = d; + } +#endif + + /* + * this version tends to run faster because of better data locality + * ('data_len' is usually much larger than 'lag') + */ + FLAC__real d; + unsigned sample, coeff; + const unsigned limit = data_len - lag; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] = 0.0; + for(sample = 0; sample <= limit; sample++) { + d = data[sample]; + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } + for(; sample < data_len; sample++) { + d = data[sample]; + for(coeff = 0; coeff < data_len - sample; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } +} + +void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]) +{ + unsigned i, j; + FLAC__double r, err, lpc[FLAC__MAX_LPC_ORDER]; + + FLAC__ASSERT(0 != max_order); + FLAC__ASSERT(0 < *max_order); + FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); + FLAC__ASSERT(autoc[0] != 0.0); + + err = autoc[0]; + + for(i = 0; i < *max_order; i++) { + /* Sum up this iteration's reflection coefficient. */ + r = -autoc[i+1]; + for(j = 0; j < i; j++) + r -= lpc[j] * autoc[i-j]; + r /= err; + + /* Update LPC coefficients and total error. */ + lpc[i]=r; + for(j = 0; j < (i>>1); j++) { + FLAC__double tmp = lpc[j]; + lpc[j] += r * lpc[i-1-j]; + lpc[i-1-j] += r * tmp; + } + if(i & 1) + lpc[j] += lpc[j] * r; + + err *= (1.0 - r * r); + + /* save this order */ + for(j = 0; j <= i; j++) + lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ + error[i] = err; + + /* see SF bug #1601812 http://sourceforge.net/tracker/index.php?func=detail&aid=1601812&group_id=13478&atid=113478 */ + if(err == 0.0) { + *max_order = i+1; + return; + } + } +} + +int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift) +{ + unsigned i; + FLAC__double cmax; + FLAC__int32 qmax, qmin; + + FLAC__ASSERT(precision > 0); + FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); + + /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ + precision--; + qmax = 1 << precision; + qmin = -qmax; + qmax--; + + /* calc cmax = max( |lp_coeff[i]| ) */ + cmax = 0.0; + for(i = 0; i < order; i++) { + const FLAC__double d = fabs(lp_coeff[i]); + if(d > cmax) + cmax = d; + } + + if(cmax <= 0.0) { + /* => coefficients are all 0, which means our constant-detect didn't work */ + return 2; + } + else { + const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; + const int min_shiftlimit = -max_shiftlimit - 1; + int log2cmax; + + (void)frexp(cmax, &log2cmax); + log2cmax--; + *shift = (int)precision - log2cmax - 1; + + if(*shift > max_shiftlimit) + *shift = max_shiftlimit; + else if(*shift < min_shiftlimit) + return 1; + } + + if(*shift >= 0) { + FLAC__double error = 0.0; + FLAC__int32 q; + for(i = 0; i < order; i++) { + error += lp_coeff[i] * (1 << *shift); + q = lround(error); + +#ifdef FLAC__OVERFLOW_DETECT + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); + else if(q < qmin) + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) + q = qmax; + else if(q < qmin) + q = qmin; + error -= q; + qlp_coeff[i] = q; + } + } + /* negative shift is very rare but due to design flaw, negative shift is + * a NOP in the decoder, so it must be handled specially by scaling down + * coeffs + */ + else { + const int nshift = -(*shift); + FLAC__double error = 0.0; + FLAC__int32 q; +#ifdef DEBUG + fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); +#endif + for(i = 0; i < order; i++) { + error += lp_coeff[i] / (1 << nshift); + q = lround(error); +#ifdef FLAC__OVERFLOW_DETECT + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); + else if(q < qmin) + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) + q = qmax; + else if(q < qmin) + q = qmin; + error -= q; + qlp_coeff[i] = q; + } + *shift = 0; + } + + return 0; +} + +void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + FLAC__int64 sumo; + unsigned i, j; + FLAC__int32 sum; + const FLAC__int32 *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for(j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); + } + *(residual++) = *(data++) - (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + */ +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } +} +#endif + +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + unsigned i, j; + FLAC__int64 sum; + const FLAC__int32 *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sum = 0; + history = data; + for(j = 0; j < order; j++) + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); + break; + } + if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (long long)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); + break; + } + *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); + } +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } +} +#endif + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + FLAC__int64 sumo; + unsigned i, j; + FLAC__int32 sum; + const FLAC__int32 *r = residual, *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for(j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); + if(sumo > 2147483647ll || sumo < -2147483648ll) + fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); + } + *(data++) = *(r++) + (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + */ +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + data[i] = residual[i] + (sum >> lp_quantization); + } + } +} +#endif + +void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + unsigned i, j; + FLAC__int64 sum; + const FLAC__int32 *r = residual, *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sum = 0; + history = data; + for(j = 0; j < order; j++) + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); + break; + } + if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); + break; + } + *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); + } +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } +} +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) +{ + FLAC__double error_scale; + + FLAC__ASSERT(total_samples > 0); + + error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; + + return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); +} + +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale) +{ + if(lpc_error > 0.0) { + FLAC__double bps = (FLAC__double)0.5 * log(error_scale * lpc_error) / M_LN2; + if(bps >= 0.0) + return bps; + else + return 0.0; + } + else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ + return 1e32; + } + else { + return 0.0; + } +} + +unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) +{ + unsigned order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ + FLAC__double bits, best_bits, error_scale; + + FLAC__ASSERT(max_order > 0); + FLAC__ASSERT(total_samples > 0); + + error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; + + best_index = 0; + best_bits = (unsigned)(-1); + + for(indx = 0, order = 1; indx < max_order; indx++, order++) { + bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); + if(bits < best_bits) { + best_index = indx; + best_bits = bits; + } + } + + return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ +} + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c new file mode 100644 index 0000000000..c448b87d34 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c @@ -0,0 +1,421 @@ +#if HAVE_CONFIG_H +# include +#endif + +#include /* for malloc() */ +#include /* for memcpy() */ + +#include "include/private/md5.h" +#include "../alloc.h" + +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * Changed so as no longer to depend on Colin Plumb's `usual.h' header + * definitions; now uses stuff from dpkg's config.h. + * - Ian Jackson . + * Still in the public domain. + * + * Josh Coalson: made some changes to integrate with libFLAC. + * Still in the public domain. + */ + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f,w,x,y,z,in,s) \ + (w += f(x,y,z) + in, w = (w<>(32-s)) + x) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) +{ + register FLAC__uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +#if WORDS_BIGENDIAN +//@@@@@@ OPT: use bswap/intrinsics +static void byteSwap(FLAC__uint32 *buf, unsigned words) +{ + register FLAC__uint32 x; + do { + x = *buf; + x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); + *buf++ = (x >> 16) | (x << 16); + } while (--words); +} +static void byteSwapX16(FLAC__uint32 *buf) +{ + register FLAC__uint32 x; + + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); +} +#else +#define byteSwap(buf, words) +#define byteSwapX16(buf) +#endif + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len) +{ + FLAC__uint32 t; + + /* Update byte count */ + + t = ctx->bytes[0]; + if ((ctx->bytes[0] = t + len) < t) + ctx->bytes[1]++; /* Carry from low to high */ + + t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ + if (t > len) { + memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); + return; + } + /* First chunk is an odd size */ + memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + buf += t; + len -= t; + + /* Process data in 64-byte chunks */ + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + memcpy(ctx->in, buf, len); +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void FLAC__MD5Init(FLAC__MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bytes[0] = 0; + ctx->bytes[1] = 0; + + ctx->internal_buf = 0; + ctx->capacity = 0; +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) +{ + int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ + FLAC__byte *p = (FLAC__byte *)ctx->in + count; + + /* Set the first char of padding to 0x80. There is always room. */ + *p++ = 0x80; + + /* Bytes of padding needed to make 56 bytes (-8..55) */ + count = 56 - 1 - count; + + if (count < 0) { /* Padding forces an extra block */ + memset(p, 0, count + 8); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + p = (FLAC__byte *)ctx->in; + count = 56; + } + memset(p, 0, count); + byteSwap(ctx->in, 14); + + /* Append length in bits and transform */ + ctx->in[14] = ctx->bytes[0] << 3; + ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; + FLAC__MD5Transform(ctx->buf, ctx->in); + + byteSwap(ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + if(0 != ctx->internal_buf) { + free(ctx->internal_buf); + ctx->internal_buf = 0; + ctx->capacity = 0; + } + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ +} + +/* + * Convert the incoming audio signal to a byte stream + */ +static void format_input_(FLAC__byte *buf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) +{ + unsigned channel, sample; + register FLAC__int32 a_word; + register FLAC__byte *buf_ = buf; + +#if WORDS_BIGENDIAN +#else + if(channels == 2 && bytes_per_sample == 2) { + FLAC__int16 *buf1_ = ((FLAC__int16*)buf_) + 1; + memcpy(buf_, signal[0], sizeof(FLAC__int32) * samples); + for(sample = 0; sample < samples; sample++, buf1_+=2) + *buf1_ = (FLAC__int16)signal[1][sample]; + } + else if(channels == 1 && bytes_per_sample == 2) { + FLAC__int16 *buf1_ = (FLAC__int16*)buf_; + for(sample = 0; sample < samples; sample++) + *buf1_++ = (FLAC__int16)signal[0][sample]; + } + else +#endif + if(bytes_per_sample == 2) { + if(channels == 2) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else if(channels == 1) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else { + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + } + } + else if(bytes_per_sample == 3) { + if(channels == 2) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else if(channels == 1) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else { + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + } + } + else if(bytes_per_sample == 1) { + if(channels == 2) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; + } + } + else if(channels == 1) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; + } + } + else { + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; + } + } + } + } + else { /* bytes_per_sample == 4, maybe optimize more later */ + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + } +} + +/* + * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. + */ +FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) +{ + const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; + + /* overflow check */ + if((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) + return false; + if((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) + return false; + + if(ctx->capacity < bytes_needed) { + FLAC__byte *tmp = (FLAC__byte*) realloc(ctx->internal_buf, bytes_needed); + if(0 == tmp) { + free(ctx->internal_buf); + if(0 == (ctx->internal_buf = (FLAC__byte*) safe_malloc_(bytes_needed))) + return false; + } + else + ctx->internal_buf = tmp; + ctx->capacity = bytes_needed; + } + + format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); + + FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); + + return true; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c new file mode 100644 index 0000000000..dd972e0718 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c @@ -0,0 +1,231 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "include/private/memory.h" +#include "../assert.h" +#include "../alloc.h" + +void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) +{ + void *x; + + FLAC__ASSERT(0 != aligned_address); + +#ifdef FLAC__ALIGN_MALLOC_DATA + /* align on 32-byte (256-bit) boundary */ + x = safe_malloc_add_2op_(bytes, /*+*/31); +#ifdef SIZEOF_VOIDP +#if SIZEOF_VOIDP == 4 + /* could do *aligned_address = x + ((unsigned) (32 - (((unsigned)x) & 31))) & 31; */ + *aligned_address = (void*)(((unsigned)x + 31) & -32); +#elif SIZEOF_VOIDP == 8 + *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); +#else +# error Unsupported sizeof(void*) +#endif +#else + /* there's got to be a better way to do this right for all archs */ + if(sizeof(void*) == sizeof(unsigned)) + *aligned_address = (void*)(((unsigned)x + 31) & -32); + else if(sizeof(void*) == sizeof(FLAC__uint64)) + *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); + else + return 0; +#endif +#else + x = safe_malloc_(bytes); + *aligned_address = x; +#endif + return x; +} + +FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) +{ + FLAC__int32 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__int32 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__int32*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) +{ + FLAC__uint32 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__uint32 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__uint32*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) +{ + FLAC__uint64 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__uint64 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__uint64*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) +{ + unsigned *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + unsigned *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (unsigned int*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) +{ + FLAC__real *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__real *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__real*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +#endif + +void *safe_malloc_mul_2op_p(size_t size1, size_t size2) +{ + if(!size1 || !size2) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if(size1 > SIZE_MAX / size2) + return 0; + return malloc(size1*size2); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c new file mode 100644 index 0000000000..04e1766ed1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c @@ -0,0 +1,3372 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include /* for malloc() */ +#include /* for memset/memcpy() */ +#include /* for stat() */ +#include /* for off_t */ +#include "../compat.h" +#include "../assert.h" +#include "../alloc.h" +#include "include/protected/stream_decoder.h" +#include "include/private/bitreader.h" +#include "include/private/bitmath.h" +#include "include/private/cpu.h" +#include "include/private/crc.h" +#include "include/private/fixed.h" +#include "include/private/format.h" +#include "include/private/lpc.h" +#include "include/private/md5.h" +#include "include/private/memory.h" + + +/* technically this should be in an "export.c" but this is convenient enough */ +FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = +#if FLAC__HAS_OGG + 1 +#else + 0 +#endif +; + + +/*********************************************************************** + * + * Private static data + * + ***********************************************************************/ + +static FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; + +/*********************************************************************** + * + * Private class method prototypes + * + ***********************************************************************/ + +static void set_defaults_(FLAC__StreamDecoder *decoder); +//static FILE *get_binary_stdin_(void); +static FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels); +static FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id); +static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); +static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); +static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj); +static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj); +static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj); +static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder); +static FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode); +static FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended); +static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data); +#if FLAC__HAS_OGG +static FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes); +static FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +#endif +static FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); +static void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status); +static FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); +#if FLAC__HAS_OGG +static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); +#endif +//static FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +//static FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); +//static FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +//static FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); +//static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data); + +/*********************************************************************** + * + * Private class data + * + ***********************************************************************/ + +typedef struct FLAC__StreamDecoderPrivate { +#if FLAC__HAS_OGG + FLAC__bool is_ogg; +#endif + FLAC__StreamDecoderReadCallback read_callback; + FLAC__StreamDecoderSeekCallback seek_callback; + FLAC__StreamDecoderTellCallback tell_callback; + FLAC__StreamDecoderLengthCallback length_callback; + FLAC__StreamDecoderEofCallback eof_callback; + FLAC__StreamDecoderWriteCallback write_callback; + FLAC__StreamDecoderMetadataCallback metadata_callback; + FLAC__StreamDecoderErrorCallback error_callback; + /* generic 32-bit datapath: */ + void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* generic 64-bit datapath: */ + void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ + void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit), AND order <= 8: */ + void (*local_lpc_restore_signal_16bit_order8)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + FLAC__bool (*local_bitreader_read_rice_signed_block)(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); + void *client_data; + FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ + FLAC__BitReader *input; + FLAC__int32 *output[FLAC__MAX_CHANNELS]; + FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; + unsigned output_capacity, output_channels; + FLAC__uint32 fixed_block_size, next_fixed_block_size; + FLAC__uint64 samples_decoded; + FLAC__bool has_stream_info, has_seek_table; + FLAC__StreamMetadata stream_info; + FLAC__StreamMetadata seek_table; + FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ + FLAC__byte *metadata_filter_ids; + size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ + FLAC__Frame frame; + FLAC__bool cached; /* true if there is a byte in lookahead */ + FLAC__CPUInfo cpuinfo; + FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ + FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ + /* unaligned (original) pointers to allocated data */ + FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; + FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ + FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ + FLAC__bool is_seeking; + FLAC__MD5Context md5context; + FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ + /* (the rest of these are only used for seeking) */ + FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ + FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ + FLAC__uint64 target_sample; + unsigned unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ +#if FLAC__HAS_OGG + FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ +#endif +} FLAC__StreamDecoderPrivate; + +/*********************************************************************** + * + * Public static class data + * + ***********************************************************************/ + +FLAC_API const char * const FLAC__StreamDecoderStateString[] = { + "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA", + "FLAC__STREAM_DECODER_READ_METADATA", + "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC", + "FLAC__STREAM_DECODER_READ_FRAME", + "FLAC__STREAM_DECODER_END_OF_STREAM", + "FLAC__STREAM_DECODER_OGG_ERROR", + "FLAC__STREAM_DECODER_SEEK_ERROR", + "FLAC__STREAM_DECODER_ABORTED", + "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR", + "FLAC__STREAM_DECODER_UNINITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { + "FLAC__STREAM_DECODER_INIT_STATUS_OK", + "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER", + "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS", + "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR", + "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE", + "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { + "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE", + "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM", + "FLAC__STREAM_DECODER_READ_STATUS_ABORT" +}; + +FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { + "FLAC__STREAM_DECODER_SEEK_STATUS_OK", + "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR", + "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { + "FLAC__STREAM_DECODER_TELL_STATUS_OK", + "FLAC__STREAM_DECODER_TELL_STATUS_ERROR", + "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { + "FLAC__STREAM_DECODER_LENGTH_STATUS_OK", + "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR", + "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { + "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE", + "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT" +}; + +FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = { + "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", + "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", + "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", + "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" +}; + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) +{ + FLAC__StreamDecoder *decoder; + unsigned i; + + FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ + + decoder = (FLAC__StreamDecoder*) calloc(1, sizeof(FLAC__StreamDecoder)); + if(decoder == 0) { + return 0; + } + + decoder->protected_ = (FLAC__StreamDecoderProtected*) calloc(1, sizeof(FLAC__StreamDecoderProtected)); + if(decoder->protected_ == 0) { + free(decoder); + return 0; + } + + decoder->private_ = (FLAC__StreamDecoderPrivate*) calloc(1, sizeof(FLAC__StreamDecoderPrivate)); + if(decoder->private_ == 0) { + free(decoder->protected_); + free(decoder); + return 0; + } + + decoder->private_->input = FLAC__bitreader_new(); + if(decoder->private_->input == 0) { + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } + + decoder->private_->metadata_filter_ids_capacity = 16; + if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*) malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) { + FLAC__bitreader_delete(decoder->private_->input); + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + decoder->private_->output[i] = 0; + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + decoder->private_->has_seek_table = false; + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); + + decoder->private_->file = 0; + + set_defaults_(decoder); + + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + + return decoder; +} + +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) +{ + unsigned i; + + if (decoder == NULL) + return ; + + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->private_->input); + + (void)FLAC__stream_decoder_finish(decoder); + + if(0 != decoder->private_->metadata_filter_ids) + free(decoder->private_->metadata_filter_ids); + + FLAC__bitreader_delete(decoder->private_->input); + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); + + free(decoder->private_); + free(decoder->protected_); + free(decoder); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +static FLAC__StreamDecoderInitStatus init_stream_internal_( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__ASSERT(0 != decoder); + + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + +#if !FLAC__HAS_OGG + if(is_ogg) + return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; +#endif + + if( + 0 == read_callback || + 0 == write_callback || + 0 == error_callback || + (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) + ) + return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + +#if FLAC__HAS_OGG + decoder->private_->is_ogg = is_ogg; + if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) + return decoder->protected_->state = FLAC__STREAM_DECODER_OGG_ERROR; +#endif + + /* + * get the CPU info and set the function pointers + */ + FLAC__cpu_info(&decoder->private_->cpuinfo); + /* first default to the non-asm routines */ + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal; + decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block; + /* now override with asm where appropriate */ +#ifndef FLAC__NO_ASM + if(decoder->private_->cpuinfo.use_asm) { +#ifdef FLAC__CPU_IA32 + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); +#ifdef FLAC__HAS_NASM +#if 1 /*@@@@@@ OPT: not clearly faster, needs more testing */ + if(decoder->private_->cpuinfo.data.ia32.bswap) + decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap; +#endif + if(decoder->private_->cpuinfo.data.ia32.mmx) { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32_mmx; + } + else { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32; + } +#endif +#elif defined FLAC__CPU_PPC + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_PPC); + if(decoder->private_->cpuinfo.data.ppc.altivec) { + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ppc_altivec_16; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8; + } +#endif + } +#endif + + /* from here on, errors are fatal */ + + if(!FLAC__bitreader_init(decoder->private_->input, decoder->private_->cpuinfo, read_callback_, decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } + + decoder->private_->read_callback = read_callback; + decoder->private_->seek_callback = seek_callback; + decoder->private_->tell_callback = tell_callback; + decoder->private_->length_callback = length_callback; + decoder->private_->eof_callback = eof_callback; + decoder->private_->write_callback = write_callback; + decoder->private_->metadata_callback = metadata_callback; + decoder->private_->error_callback = error_callback; + decoder->private_->client_data = client_data; + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + decoder->private_->samples_decoded = 0; + decoder->private_->has_stream_info = false; + decoder->private_->cached = false; + + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + decoder->private_->is_seeking = false; + + decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ + if(!FLAC__stream_decoder_reset(decoder)) { + /* above call sets the state for us */ + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } + + return FLAC__STREAM_DECODER_INIT_STATUS_OK; +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/false + ); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/true + ); +} + +#if 0 +static FLAC__StreamDecoderInitStatus init_FILE_internal_( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != file); + + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED); + + if(0 == write_callback || 0 == error_callback) + return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS); + + /* + * To make sure that our file does not go unclosed after an error, we + * must assign the FILE pointer before any further error can occur in + * this routine. + */ + if(file == stdin) + file = get_binary_stdin_(); /* just to be safe */ + + decoder->private_->file = file; + + return init_stream_internal_( + decoder, + file_read_callback_, + decoder->private_->file == stdin? 0: file_seek_callback_, + decoder->private_->file == stdin? 0: file_tell_callback_, + decoder->private_->file == stdin? 0: file_length_callback_, + file_eof_callback_, + write_callback, + metadata_callback, + error_callback, + client_data, + is_ogg + ); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); +} + +static FLAC__StreamDecoderInitStatus init_file_internal_( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FILE *file; + + FLAC__ASSERT(0 != decoder); + + /* + * To make sure that our file does not go unclosed after an error, we + * have to do the same entrance checks here that are later performed + * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. + */ + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED); + + if(0 == write_callback || 0 == error_callback) + return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS); + + file = filename? flac_fopen(filename, "rb") : stdin; + + if(0 == file) + return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); +} +#endif + +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) +{ + FLAC__bool md5_failed = false; + unsigned i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) + return true; + + /* see the comment in FLAC__seekable_stream_decoder_reset() as to why we + * always call FLAC__MD5Final() + */ + FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); + + if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + } + FLAC__bitreader_free(decoder->private_->input); + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + /* WATCHOUT: + * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the + * output arrays have a buffer of up to 3 zeroes in front + * (at negative indices) for alignment purposes; we use 4 + * to keep the data well-aligned. + */ + if(0 != decoder->private_->output[i]) { + free(decoder->private_->output[i]-4); + decoder->private_->output[i] = 0; + } + if(0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); +#endif + + if(0 != decoder->private_->file) { + if(decoder->private_->file != stdin) + fclose(decoder->private_->file); + decoder->private_->file = 0; + } + + if(decoder->private_->do_md5_checking) { + if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) + md5_failed = true; + } + decoder->private_->is_seeking = false; + + set_defaults_(decoder); + + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + + return !md5_failed; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; +#if FLAC__HAS_OGG + /* can't check decoder->private_->is_ogg since that's not set until init time */ + FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); + return true; +#else + (void)value; + return false; +#endif +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->protected_->md5_checking = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) + return false; + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->private_->metadata_filter[type] = true; + if(type == FLAC__METADATA_TYPE_APPLICATION) + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) + return true; + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*) safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) +{ + unsigned i; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) + decoder->private_->metadata_filter[i] = true; + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) + return false; + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->private_->metadata_filter[type] = false; + if(type == FLAC__METADATA_TYPE_APPLICATION) + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) + return true; + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*) safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->state; +} + +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) +{ + return FLAC__StreamDecoderStateString[decoder->protected_->state]; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->md5_checking; +} + +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0; +} + +FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channels; +} + +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channel_assignment; +} + +FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->bits_per_sample; +} + +FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->sample_rate; +} + +FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->blocksize; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != position); + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + return false; +#endif + if(0 == decoder->private_->tell_callback) + return false; + if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) + return false; + /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) + return false; + FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); + *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + decoder->private_->samples_decoded = 0; + decoder->private_->do_md5_checking = false; + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); +#endif + + if(!FLAC__bitreader_clear(decoder->private_->input)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + +#if FLAC__HAS_OGG + /*@@@ could go in !internal_reset_hack block below */ + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); +#endif + + /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, + * (internal_reset_hack) don't try to rewind since we are already at + * the beginning of the stream and don't want to fail if the input is + * not seekable. + */ + if(!decoder->private_->internal_reset_hack) { + if(decoder->private_->file == stdin) + return false; /* can't rewind stdin, reset fails */ + if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) + return false; /* seekable and seek fails, reset fails */ + } + else + decoder->private_->internal_reset_hack = false; + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; + + decoder->private_->has_stream_info = false; + if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + } + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + /* + * This goes in reset() and not flush() because according to the spec, a + * fixed-blocksize stream must stay that way through the whole stream. + */ + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + + /* We initialize the FLAC__MD5Context even though we may never use it. This + * is because md5 checking may be turned on to start and then turned off if + * a seek occurs. So we init the context here and finalize it in + * FLAC__stream_decoder_finish() to make sure things are always cleaned up + * properly. + */ + FLAC__MD5Init(&decoder->private_->md5context); + + decoder->private_->first_frame_offset = 0; + decoder->private_->unparseable_frame_count = 0; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) +{ + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + else + return true; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) + return false; /* above function sets the status for us */ + if(got_a_frame) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + case FLAC__STREAM_DECODER_READ_FRAME: + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) +{ + FLAC__bool dummy; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) +{ + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + case FLAC__STREAM_DECODER_READ_METADATA: + return false; /* above function sets the status for us */ + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) + return false; /* above function sets the status for us */ + if(got_a_frame) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) +{ + FLAC__uint64 length; + + FLAC__ASSERT(0 != decoder); + + if( + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && + decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM + ) + return false; + + if(0 == decoder->private_->seek_callback) + return false; + + FLAC__ASSERT(decoder->private_->seek_callback); + FLAC__ASSERT(decoder->private_->tell_callback); + FLAC__ASSERT(decoder->private_->length_callback); + FLAC__ASSERT(decoder->private_->eof_callback); + + if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) + return false; + + decoder->private_->is_seeking = true; + + /* turn off md5 checking if a seek is attempted */ + decoder->private_->do_md5_checking = false; + + /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ + if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { + decoder->private_->is_seeking = false; + return false; + } + + /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ + if( + decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || + decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA + ) { + if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { + /* above call sets the state for us */ + decoder->private_->is_seeking = false; + return false; + } + /* check this again in case we didn't know total_samples the first time */ + if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->private_->is_seeking = false; + return false; + } + } + + { + const FLAC__bool ok = +#if FLAC__HAS_OGG + decoder->private_->is_ogg? + seek_to_absolute_sample_ogg_(decoder, length, sample) : +#endif + seek_to_absolute_sample_(decoder, length, sample) + ; + decoder->private_->is_seeking = false; + return ok; + } +} + +/*********************************************************************** + * + * Protected class methods + * + ***********************************************************************/ + +unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); + return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; +} + +/*********************************************************************** + * + * Private class methods + * + ***********************************************************************/ + +void set_defaults_(FLAC__StreamDecoder *decoder) +{ +#if FLAC__HAS_OGG + decoder->private_->is_ogg = false; +#endif + decoder->private_->read_callback = 0; + decoder->private_->seek_callback = 0; + decoder->private_->tell_callback = 0; + decoder->private_->length_callback = 0; + decoder->private_->eof_callback = 0; + decoder->private_->write_callback = 0; + decoder->private_->metadata_callback = 0; + decoder->private_->error_callback = 0; + decoder->private_->client_data = 0; + + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; + decoder->private_->metadata_filter_ids_count = 0; + + decoder->protected_->md5_checking = false; + +#if FLAC__HAS_OGG + FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); +#endif +} + +#if 0 +/* + * This will forcibly set stdin to binary mode (for OSes that require it) + */ +FILE *get_binary_stdin_(void) +{ + /* if something breaks here it is probably due to the presence or + * absence of an underscore before the identifiers 'setmode', + * 'fileno', and/or 'O_BINARY'; check your system header files. + */ +#if defined _MSC_VER || defined __MINGW32__ + _setmode(_fileno(stdin), _O_BINARY); +#elif defined __CYGWIN__ + /* almost certainly not needed for any modern Cygwin, but let's be safe... */ + setmode(_fileno(stdin), _O_BINARY); +#elif defined __EMX__ + setmode(fileno(stdin), O_BINARY); +#endif + + return stdin; +} +#endif + +FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels) +{ + unsigned i; + FLAC__int32 *tmp; + + if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) + return true; + + /* simply using realloc() is not practical because the number of channels may change mid-stream */ + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + if(0 != decoder->private_->output[i]) { + free(decoder->private_->output[i]-4); + decoder->private_->output[i] = 0; + } + if(0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + + for(i = 0; i < channels; i++) { + /* WATCHOUT: + * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the + * output arrays have a buffer of up to 3 zeroes in front + * (at negative indices) for alignment purposes; we use 4 + * to keep the data well-aligned. + */ + tmp = (FLAC__int32*) safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); + if(tmp == 0) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + memset(tmp, 0, sizeof(FLAC__int32)*4); + decoder->private_->output[i] = tmp + 4; + + /* WATCHOUT: + * minimum of quadword alignment for PPC vector optimizations is REQUIRED: + */ + if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + } + + decoder->private_->output_capacity = size; + decoder->private_->output_channels = channels; + + return true; +} + +FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) +{ + size_t i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + + for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++) + if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))) + return true; + + return false; +} + +FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + unsigned i, id_; + FLAC__bool first = true; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + for(i = id_ = 0; i < 4; ) { + if(decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + } + if(x == FLAC__STREAM_SYNC_STRING[i]) { + first = true; + i++; + id_ = 0; + continue; + } + if(x == ID3V2_TAG_[id_]) { + id_++; + i = 0; + if(id_ == 3) { + if(!skip_id3v2_tag_(decoder)) + return false; /* skip_id3v2_tag_ sets the state for us */ + } + continue; + } + id_ = 0; + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } + else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + i = 0; + if(first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; + return true; +} + +FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) +{ + FLAC__bool is_last; + FLAC__uint32 i, x, type, length; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) + return false; /* read_callback_ sets the state for us */ + is_last = x? true : false; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(type == FLAC__METADATA_TYPE_STREAMINFO) { + if(!read_metadata_streaminfo_(decoder, is_last, length)) + return false; + + decoder->private_->has_stream_info = true; + if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) + decoder->private_->do_md5_checking = false; + if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); + } + else if(type == FLAC__METADATA_TYPE_SEEKTABLE) { + if(!read_metadata_seektable_(decoder, is_last, length)) + return false; + + decoder->private_->has_seek_table = true; + if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); + } + else { + FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; + unsigned real_length = length; + FLAC__StreamMetadata block; + + block.is_last = is_last; + block.type = (FLAC__MetadataType)type; + block.length = length; + + if(type == FLAC__METADATA_TYPE_APPLICATION) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */ + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ + return false; + } + + real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8; + + if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) + skip_it = !skip_it; + } + + if(skip_it) { + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else { + switch(type) { + case FLAC__METADATA_TYPE_PADDING: + /* skip the padding bytes */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) + return false; /* read_callback_ sets the state for us */ + break; + case FLAC__METADATA_TYPE_APPLICATION: + /* remember, we read the ID already */ + if(real_length > 0) { + if(0 == (block.data.application.data = (FLAC__byte*) malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else + block.data.application.data = 0; + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment)) + return false; + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) + return false; + break; + case FLAC__METADATA_TYPE_PICTURE: + if(!read_metadata_picture_(decoder, &block.data.picture)) + return false; + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + break; + default: + if(real_length > 0) { + if(0 == (block.data.unknown.data = (FLAC__byte*) malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else + block.data.unknown.data = 0; + break; + } + if(!decoder->private_->is_seeking && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); + + /* now we have to free any malloc()ed data in the block */ + switch(type) { + case FLAC__METADATA_TYPE_PADDING: + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(0 != block.data.application.data) + free(block.data.application.data); + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(0 != block.data.vorbis_comment.vendor_string.entry) + free(block.data.vorbis_comment.vendor_string.entry); + if(block.data.vorbis_comment.num_comments > 0) + for(i = 0; i < block.data.vorbis_comment.num_comments; i++) + if(0 != block.data.vorbis_comment.comments[i].entry) + free(block.data.vorbis_comment.comments[i].entry); + if(0 != block.data.vorbis_comment.comments) + free(block.data.vorbis_comment.comments); + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(block.data.cue_sheet.num_tracks > 0) + for(i = 0; i < block.data.cue_sheet.num_tracks; i++) + if(0 != block.data.cue_sheet.tracks[i].indices) + free(block.data.cue_sheet.tracks[i].indices); + if(0 != block.data.cue_sheet.tracks) + free(block.data.cue_sheet.tracks); + break; + case FLAC__METADATA_TYPE_PICTURE: + if(0 != block.data.picture.mime_type) + free(block.data.picture.mime_type); + if(0 != block.data.picture.description) + free(block.data.picture.description); + if(0 != block.data.picture.data) + free(block.data.picture.data); + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + default: + if(0 != block.data.unknown.data) + free(block.data.unknown.data); + break; + } + } + } + + if(is_last) { + /* if this fails, it's OK, it's just a hint for the seek routine */ + if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) + decoder->private_->first_frame_offset = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + + return true; +} + +FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) +{ + FLAC__uint32 x; + unsigned bits, used_bits = 0; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; + decoder->private_->stream_info.is_last = is_last; + decoder->private_->stream_info.length = length; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.min_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.max_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.min_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.max_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.sample_rate = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.channels = x+1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) + return false; /* read_callback_ sets the state for us */ + used_bits += bits; + + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) + return false; /* read_callback_ sets the state for us */ + used_bits += 16*8; + + /* skip the rest of the block */ + FLAC__ASSERT(used_bits % 8 == 0); + length -= (used_bits / 8); + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + + return true; +} + +FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) +{ + FLAC__uint32 i, x; + FLAC__uint64 xx; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; + decoder->private_->seek_table.is_last = is_last; + decoder->private_->seek_table.length = length; + + decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; + + /* use realloc since we may pass through here several times (e.g. after seeking) */ + if(0 == (decoder->private_->seek_table.data.seek_table.points = (FLAC__StreamMetadata_SeekPoint*) safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; + + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; + } + length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); + /* if there is a partial point left, skip over it */ + if(length > 0) { + /*@@@ do a send_error_to_client_() here? there's an argument for either way */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj) +{ + FLAC__uint32 i; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read vendor string */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) + return false; /* read_callback_ sets the state for us */ + if(obj->vendor_string.length > 0) { + if(0 == (obj->vendor_string.entry = (FLAC__byte*) safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) + return false; /* read_callback_ sets the state for us */ + obj->vendor_string.entry[obj->vendor_string.length] = '\0'; + } + else + obj->vendor_string.entry = 0; + + /* read num comments */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); + if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) + return false; /* read_callback_ sets the state for us */ + + /* read comments */ + if(obj->num_comments > 0) { + if(0 == (obj->comments = (FLAC__StreamMetadata_VorbisComment_Entry*) safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < obj->num_comments; i++) { + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) + return false; /* read_callback_ sets the state for us */ + if(obj->comments[i].length > 0) { + if(0 == (obj->comments[i].entry = (FLAC__byte*) safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) + return false; /* read_callback_ sets the state for us */ + obj->comments[i].entry[obj->comments[i].length] = '\0'; + } + else + obj->comments[i].entry = 0; + } + } + else { + obj->comments = 0; + } + + return true; +} + +FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) +{ + FLAC__uint32 i, j, x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->is_cd = x? true : false; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->num_tracks = x; + + if(obj->num_tracks > 0) { + if(0 == (obj->tracks = (FLAC__StreamMetadata_CueSheet_Track*) safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < obj->num_tracks; i++) { + FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + track->number = (FLAC__byte)x; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + track->type = x; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) + return false; /* read_callback_ sets the state for us */ + track->pre_emphasis = x; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) + return false; /* read_callback_ sets the state for us */ + track->num_indices = (FLAC__byte)x; + + if(track->num_indices > 0) { + if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*) safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(j = 0; j < track->num_indices; j++) { + FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j]; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + indx->number = (FLAC__byte)x; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + } + } + } + } + + return true; +} + +FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) +{ + FLAC__uint32 x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read type */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->type = (FLAC__StreamMetadata_Picture_Type) x; + + /* read MIME type */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->mime_type = (char*) safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(x > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) + return false; /* read_callback_ sets the state for us */ + } + obj->mime_type[x] = '\0'; + + /* read description */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->description = (FLAC__byte*) safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(x > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) + return false; /* read_callback_ sets the state for us */ + } + obj->description[x] = '\0'; + + /* read width */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read height */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read depth */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read colors */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read data */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->data = (FLAC__byte*) safe_malloc_(obj->data_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(obj->data_length > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + unsigned i, skip; + + /* skip the version and flags bytes */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) + return false; /* read_callback_ sets the state for us */ + /* get the size (in bytes) to skip */ + skip = 0; + for(i = 0; i < 4; i++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + skip <<= 7; + skip |= (x & 0x7f); + } + /* skip the rest of the tag */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) + return false; /* read_callback_ sets the state for us */ + return true; +} + +FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + FLAC__bool first = true; + + /* If we know the total number of samples in the stream, stop if we've read that many. */ + /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ + if(FLAC__stream_decoder_get_total_samples(decoder) > 0) { + if(decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return true; + } + } + + /* make sure we're byte aligned */ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) + return false; /* read_callback_ sets the state for us */ + } + + while(1) { + if(decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + } + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } + else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + if(first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + return true; +} + +FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) +{ + unsigned channel; + unsigned i; + FLAC__int32 mid, side; + unsigned frame_crc; /* the one we calculate from the input stream */ + FLAC__uint32 x; + + *got_a_frame = false; + + /* init the CRC */ + frame_crc = 0; + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); + FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); + + if(!read_frame_header_(decoder)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */ + return true; + if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) + return false; + for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + /* + * first figure the correct bits-per-sample of the subframe + */ + unsigned bps = decoder->private_->frame.header.bits_per_sample; + switch(decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* no adjustment needed */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 1) + bps++; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 0) + bps++; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 1) + bps++; + break; + default: + FLAC__ASSERT(0); + } + /* + * now read it + */ + if(!read_subframe_(decoder, channel, bps, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + if(!read_zero_padding_(decoder)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ + return true; + + /* + * Read the frame CRC-16 from the footer and check + */ + frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) + return false; /* read_callback_ sets the state for us */ + if(frame_crc == x) { + if(do_full_decode) { + /* Undo any special channel coding */ + switch(decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* do nothing */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[0][i] += decoder->private_->output[1][i]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { +#if 1 + mid = decoder->private_->output[0][i]; + side = decoder->private_->output[1][i]; + mid <<= 1; + mid |= (side & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + side) >> 1; + decoder->private_->output[1][i] = (mid - side) >> 1; +#else + /* OPT: without 'side' temp variable */ + mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; + decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; +#endif + } + break; + default: + FLAC__ASSERT(0); + break; + } + } + } + else { + /* Bad frame, emit error and zero the output signal */ + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); + if(do_full_decode) { + for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + } + } + } + + *got_a_frame = true; + + /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ + if(decoder->private_->next_fixed_block_size) + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; + + /* put the latest values into the public section of the decoder instance */ + decoder->protected_->channels = decoder->private_->frame.header.channels; + decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; + decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; + decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; + decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; + + FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; + + /* write it */ + if(do_full_decode) { + if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) + return false; + } + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; +} + +FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + FLAC__uint64 xx; + unsigned i, blocksize_hint = 0, sample_rate_hint = 0; + FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ + unsigned raw_header_len; + FLAC__bool is_unparseable = false; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* init the raw header with the saved bits from synchronization */ + raw_header[0] = decoder->private_->header_warmup[0]; + raw_header[1] = decoder->private_->header_warmup[1]; + raw_header_len = 2; + + /* check to make sure that reserved bit is 0 */ + if(raw_header[1] & 0x02) /* MAGIC NUMBER */ + is_unparseable = true; + + /* + * Note that along the way as we read the header, we look for a sync + * code inside. If we find one it would indicate that our original + * sync was bad since there cannot be a sync code in a valid header. + * + * Three kinds of things can go wrong when reading the frame header: + * 1) We may have sync'ed incorrectly and not landed on a frame header. + * If we don't find a sync code, it can end up looking like we read + * a valid but unparseable header, until getting to the frame header + * CRC. Even then we could get a false positive on the CRC. + * 2) We may have sync'ed correctly but on an unparseable frame (from a + * future encoder). + * 3) We may be on a damaged frame which appears valid but unparseable. + * + * For all these reasons, we try and read a complete frame header as + * long as it seems valid, even if unparseable, up until the frame + * header CRC. + */ + + /* + * read in the raw header as bytes so we can CRC it, and parse it on the way + */ + for(i = 0; i < 2; i++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + raw_header[raw_header_len++] = (FLAC__byte)x; + } + + switch(x = raw_header[2] >> 4) { + case 0: + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.blocksize = 192; + break; + case 2: + case 3: + case 4: + case 5: + decoder->private_->frame.header.blocksize = 576 << (x-2); + break; + case 6: + case 7: + blocksize_hint = x; + break; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + decoder->private_->frame.header.blocksize = 256 << (x-8); + break; + default: + FLAC__ASSERT(0); + break; + } + + switch(x = raw_header[2] & 0x0f) { + case 0: + if(decoder->private_->has_stream_info) + decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; + else + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.sample_rate = 88200; + break; + case 2: + decoder->private_->frame.header.sample_rate = 176400; + break; + case 3: + decoder->private_->frame.header.sample_rate = 192000; + break; + case 4: + decoder->private_->frame.header.sample_rate = 8000; + break; + case 5: + decoder->private_->frame.header.sample_rate = 16000; + break; + case 6: + decoder->private_->frame.header.sample_rate = 22050; + break; + case 7: + decoder->private_->frame.header.sample_rate = 24000; + break; + case 8: + decoder->private_->frame.header.sample_rate = 32000; + break; + case 9: + decoder->private_->frame.header.sample_rate = 44100; + break; + case 10: + decoder->private_->frame.header.sample_rate = 48000; + break; + case 11: + decoder->private_->frame.header.sample_rate = 96000; + break; + case 12: + case 13: + case 14: + sample_rate_hint = x; + break; + case 15: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + default: + FLAC__ASSERT(0); + } + + x = (unsigned)(raw_header[3] >> 4); + if(x & 8) { + decoder->private_->frame.header.channels = 2; + switch(x & 7) { + case 0: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; + break; + case 1: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; + break; + case 2: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; + break; + default: + is_unparseable = true; + break; + } + } + else { + decoder->private_->frame.header.channels = (unsigned)x + 1; + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; + } + + switch(x = (unsigned)(raw_header[3] & 0x0e) >> 1) { + case 0: + if(decoder->private_->has_stream_info) + decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; + else + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.bits_per_sample = 8; + break; + case 2: + decoder->private_->frame.header.bits_per_sample = 12; + break; + case 4: + decoder->private_->frame.header.bits_per_sample = 16; + break; + case 5: + decoder->private_->frame.header.bits_per_sample = 20; + break; + case 6: + decoder->private_->frame.header.bits_per_sample = 24; + break; + case 3: + case 7: + is_unparseable = true; + break; + default: + FLAC__ASSERT(0); + break; + } + + /* check to make sure that reserved bit is 0 */ + if(raw_header[3] & 0x01) /* MAGIC NUMBER */ + is_unparseable = true; + + /* read the frame's starting sample number (or frame number as the case may be) */ + if( + raw_header[1] & 0x01 || + /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ + (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) + ) { /* variable blocksize */ + if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) + return false; /* read_callback_ sets the state for us */ + if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + decoder->private_->frame.header.number.sample_number = xx; + } + else { /* fixed blocksize */ + if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) + return false; /* read_callback_ sets the state for us */ + if(x == 0xffffffff) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; + decoder->private_->frame.header.number.frame_number = x; + } + + if(blocksize_hint) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)x; + if(blocksize_hint == 7) { + FLAC__uint32 _x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + decoder->private_->frame.header.blocksize = x+1; + } + + if(sample_rate_hint) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)x; + if(sample_rate_hint != 12) { + FLAC__uint32 _x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + if(sample_rate_hint == 12) + decoder->private_->frame.header.sample_rate = x*1000; + else if(sample_rate_hint == 13) + decoder->private_->frame.header.sample_rate = x; + else + decoder->private_->frame.header.sample_rate = x*10; + } + + /* read the CRC-8 byte */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + crc8 = (FLAC__byte)x; + + if(FLAC__crc8(raw_header, raw_header_len) != crc8) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* calculate the sample number from the frame number if needed */ + decoder->private_->next_fixed_block_size = 0; + if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { + x = decoder->private_->frame.header.number.frame_number; + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + if(decoder->private_->fixed_block_size) + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; + else if(decoder->private_->has_stream_info) { + if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; + decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; + } + else + is_unparseable = true; + } + else if(x == 0) { + decoder->private_->frame.header.number.sample_number = 0; + decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; + } + else { + /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; + } + } + + if(is_unparseable) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + return true; +} + +FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__uint32 x; + FLAC__bool wasted_bits; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */ + return false; /* read_callback_ sets the state for us */ + + wasted_bits = (x & 1); + x &= 0xfe; + + if(wasted_bits) { + unsigned u; + if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->frame.subframes[channel].wasted_bits = u+1; + bps -= decoder->private_->frame.subframes[channel].wasted_bits; + } + else + decoder->private_->frame.subframes[channel].wasted_bits = 0; + + /* + * Lots of magic numbers here + */ + if(x & 0x80) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else if(x == 0) { + if(!read_subframe_constant_(decoder, channel, bps, do_full_decode)) + return false; + } + else if(x == 2) { + if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) + return false; + } + else if(x < 16) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else if(x <= 24) { + if(!read_subframe_fixed_(decoder, channel, bps, (x>>1)&7, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + else if(x < 64) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else { + if(!read_subframe_lpc_(decoder, channel, bps, ((x>>1)&31)+1, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + + if(wasted_bits && do_full_decode) { + x = decoder->private_->frame.subframes[channel].wasted_bits; + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[channel][i] <<= x; + } + + return true; +} + +FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; + FLAC__int32 x; + unsigned i; + FLAC__int32 *output = decoder->private_->output[channel]; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; + + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) + return false; /* read_callback_ sets the state for us */ + + subframe->value = x; + + /* decode the subframe */ + if(do_full_decode) { + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + output[i] = x; + } + + return true; +} + +FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; + FLAC__int32 i32; + FLAC__uint32 u32; + unsigned u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) + return false; /* read_callback_ sets the state for us */ + subframe->warmup[u] = i32; + } + + /* read entropy coding method info */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) + return false; + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if(do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order); + } + + return true; +} + +FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) +{ + FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; + FLAC__int32 i32; + FLAC__uint32 u32; + unsigned u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) + return false; /* read_callback_ sets the state for us */ + subframe->warmup[u] = i32; + } + + /* read qlp coeff precision */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) + return false; /* read_callback_ sets the state for us */ + if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->qlp_coeff_precision = u32+1; + + /* read qlp shift */ + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->quantization_level = i32; + + /* read quantized lp coefficiencts */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) + return false; /* read_callback_ sets the state for us */ + subframe->qlp_coeff[u] = i32; + } + + /* read entropy coding method info */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) + return false; + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if(do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + /*@@@@@@ technically not pessimistic enough, should be more like + if( (FLAC__uint64)order * ((((FLAC__uint64)1)<qlp_coeff_precision)-1) < (((FLAC__uint64)-1) << 32) ) + */ + if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) + if(bps <= 16 && subframe->qlp_coeff_precision <= 16) { + if(order <= 8) + decoder->private_->local_lpc_restore_signal_16bit_order8(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + else + decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + } + else + decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + else + decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + } + + return true; +} + +FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; + FLAC__int32 x, *residual = decoder->private_->residual[channel]; + unsigned i; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; + + subframe->data = residual; + + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) + return false; /* read_callback_ sets the state for us */ + residual[i] = x; + } + + /* decode the subframe */ + if(do_full_decode) + memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + + return true; +} + +FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) +{ + FLAC__uint32 rice_parameter; + int i; + unsigned partition, sample, u; + const unsigned partitions = 1u << partition_order; + const unsigned partition_samples = partition_order > 0? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; + const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; + const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + /* sanity checks */ + if(partition_order == 0) { + if(decoder->private_->frame.header.blocksize < predictor_order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + } + else { + if(partition_samples < predictor_order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + } + + if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + sample = 0; + for(partition = 0; partition < partitions; partition++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) + return false; /* read_callback_ sets the state for us */ + partitioned_rice_contents->parameters[partition] = rice_parameter; + if(rice_parameter < pesc) { + partitioned_rice_contents->raw_bits[partition] = 0; + u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; + if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) + return false; /* read_callback_ sets the state for us */ + sample += u; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) + return false; /* read_callback_ sets the state for us */ + partitioned_rice_contents->raw_bits[partition] = rice_parameter; + for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter)) + return false; /* read_callback_ sets the state for us */ + residual[sample] = i; + } + } + } + + return true; +} + +FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) +{ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + FLAC__uint32 zero = 0; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) + return false; /* read_callback_ sets the state for us */ + if(zero != 0) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + } + return true; +} + +FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; + + if( +#if FLAC__HAS_OGG + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && +#endif + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) { + *bytes = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } + else if(*bytes > 0) { + /* While seeking, it is possible for our seek to land in the + * middle of audio data that looks exactly like a frame header + * from a future version of an encoder. When that happens, our + * error callback will get an + * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its + * unparseable_frame_count. But there is a remote possibility + * that it is properly synced at such a "future-codec frame", + * so to make sure, we wait to see many "unparseable" errors in + * a row before bailing out. + */ + if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + else { + const FLAC__StreamDecoderReadStatus status = +#if FLAC__HAS_OGG + decoder->private_->is_ogg? + read_callback_ogg_aspect_(decoder, buffer, bytes) : +#endif + decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) + ; + if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + else if(*bytes == 0) { + if( + status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || + ( +#if FLAC__HAS_OGG + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && +#endif + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) + ) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } + else + return true; + } + else + return true; + } + } + else { + /* abort to avoid a deadlock */ + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around + * for Ogg FLAC. This is because the ogg decoder aspect can lose sync + * and at the same time hit the end of the stream (for example, seeking + * to a point that is after the beginning of the last Ogg page). There + * is no way to report an Ogg sync loss through the callbacks (see note + * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. + * So to keep the decoder from stopping at this point we gate the call + * to the eof_callback and let the Ogg decoder aspect set the + * end-of-stream state when it is needed. + */ +} + +#if FLAC__HAS_OGG +FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) +{ + switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + /* we don't really have a way to handle lost sync via read + * callback so we'll let it pass and let the underlying + * FLAC decoder catch the error + */ + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + default: + FLAC__ASSERT(0); + /* double protection */ + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } +} + +FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; + + switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { + case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; + case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; + case FLAC__STREAM_DECODER_READ_STATUS_ABORT: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + default: + /* double protection: */ + FLAC__ASSERT(0); + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + } +} +#endif + +FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) +{ + if(decoder->private_->is_seeking) { + FLAC__uint64 this_frame_sample = frame->header.number.sample_number; + FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; + FLAC__uint64 target_sample = decoder->private_->target_sample; + + FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + +#if FLAC__HAS_OGG + decoder->private_->got_a_frame = true; +#endif + decoder->private_->last_frame = *frame; /* save the frame */ + if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ + unsigned delta = (unsigned)(target_sample - this_frame_sample); + /* kick out of seek mode */ + decoder->private_->is_seeking = false; + /* shift out the samples before target_sample */ + if(delta > 0) { + unsigned channel; + const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; + for(channel = 0; channel < frame->header.channels; channel++) + newbuffer[channel] = buffer[channel] + delta; + decoder->private_->last_frame.header.blocksize -= delta; + decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); + } + else { + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } + } + else { + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } + } + else { + /* + * If we never got STREAMINFO, turn off MD5 checking to save + * cycles since we don't have a sum to compare to anyway + */ + if(!decoder->private_->has_stream_info) + decoder->private_->do_md5_checking = false; + if(decoder->private_->do_md5_checking) { + if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8)) + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } +} + +void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) +{ + if(!decoder->private_->is_seeking) + decoder->private_->error_callback(decoder, status, decoder->private_->client_data); + else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) + decoder->private_->unparseable_frame_count++; +} + +FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) +{ + FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; + FLAC__int64 pos = -1; + int i; + unsigned approx_bytes_per_frame; + FLAC__bool first_seek = true; + const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); + const unsigned min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; + const unsigned max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; + const unsigned max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; + const unsigned min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; + /* take these from the current frame in case they've changed mid-stream */ + unsigned channels = FLAC__stream_decoder_get_channels(decoder); + unsigned bps = FLAC__stream_decoder_get_bits_per_sample(decoder); + const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0; + + /* use values from stream info if we didn't decode a frame */ + if(channels == 0) + channels = decoder->private_->stream_info.data.stream_info.channels; + if(bps == 0) + bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; + + /* we are just guessing here */ + if(max_framesize > 0) + approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; + /* + * Check if it's a known fixed-blocksize stream. Note that though + * the spec doesn't allow zeroes in the STREAMINFO block, we may + * never get a STREAMINFO block when decoding so the value of + * min_blocksize might be zero. + */ + else if(min_blocksize == max_blocksize && min_blocksize > 0) { + /* note there are no () around 'bps/8' to keep precision up since it's an integer calulation */ + approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64; + } + else + approx_bytes_per_frame = 4096 * channels * bps/8 + 64; + + /* + * First, we set an upper and lower bound on where in the + * stream we will search. For now we assume the worst case + * scenario, which is our best guess at the beginning of + * the first frame and end of the stream. + */ + lower_bound = first_frame_offset; + lower_bound_sample = 0; + upper_bound = stream_length; + upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; + + /* + * Now we refine the bounds if we have a seektable with + * suitable points. Note that according to the spec they + * must be ordered by ascending sample number. + * + * Note: to protect against invalid seek tables we will ignore points + * that have frame_samples==0 or sample_number>=total_samples + */ + if(seek_table) { + FLAC__uint64 new_lower_bound = lower_bound; + FLAC__uint64 new_upper_bound = upper_bound; + FLAC__uint64 new_lower_bound_sample = lower_bound_sample; + FLAC__uint64 new_upper_bound_sample = upper_bound_sample; + + /* find the closest seek point <= target_sample, if it exists */ + for(i = (int)seek_table->num_points - 1; i >= 0; i--) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number <= target_sample + ) + break; + } + if(i >= 0) { /* i.e. we found a suitable seek point... */ + new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_lower_bound_sample = seek_table->points[i].sample_number; + } + + /* find the closest seek point > target_sample, if it exists */ + for(i = 0; i < (int)seek_table->num_points; i++) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number > target_sample + ) + break; + } + if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ + new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_upper_bound_sample = seek_table->points[i].sample_number; + } + /* final protection against unsorted seek tables; keep original values if bogus */ + if(new_upper_bound >= new_lower_bound) { + lower_bound = new_lower_bound; + upper_bound = new_upper_bound; + lower_bound_sample = new_lower_bound_sample; + upper_bound_sample = new_upper_bound_sample; + } + } + + FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); + /* there are 2 insidious ways that the following equality occurs, which + * we need to fix: + * 1) total_samples is 0 (unknown) and target_sample is 0 + * 2) total_samples is 0 (unknown) and target_sample happens to be + * exactly equal to the last seek point in the seek table; this + * means there is no seek point above it, and upper_bound_samples + * remains equal to the estimate (of target_samples) we made above + * in either case it does not hurt to move upper_bound_sample up by 1 + */ + if(upper_bound_sample == lower_bound_sample) + upper_bound_sample++; + + decoder->private_->target_sample = target_sample; + while(1) { + /* check if the bounds are still ok */ + if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if defined _MSC_VER || defined __MINGW32__ + /* with VC++ you have to spoon feed it the casting */ + pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(FLAC__int64)(target_sample - lower_bound_sample) / (FLAC__double)(FLAC__int64)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(FLAC__int64)(upper_bound - lower_bound)) - approx_bytes_per_frame; +#else + pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(target_sample - lower_bound_sample) / (FLAC__double)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(upper_bound - lower_bound)) - approx_bytes_per_frame; +#endif +#else + /* a little less accurate: */ + if(upper_bound - lower_bound < 0xffffffff) + pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; + else /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8)) / ((upper_bound_sample - lower_bound_sample)>>16)) - approx_bytes_per_frame; +#endif + if(pos >= (FLAC__int64)upper_bound) + pos = (FLAC__int64)upper_bound - 1; + if(pos < (FLAC__int64)lower_bound) + pos = (FLAC__int64)lower_bound; + if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + /* Now we need to get a frame. First we need to reset our + * unparseable_frame_count; if we get too many unparseable + * frames in a row, the read callback will return + * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing + * FLAC__stream_decoder_process_single() to return false. + */ + decoder->private_->unparseable_frame_count = 0; + if(!FLAC__stream_decoder_process_single(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our write callback will change the state when it gets to the target frame */ + /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ +#if 0 + /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ + if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) + break; +#endif + if(!decoder->private_->is_seeking) + break; + + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + + if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { + if (pos == (FLAC__int64)lower_bound) { + /* can't move back any more than the first frame, something is fatally wrong */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our last move backwards wasn't big enough, try again */ + approx_bytes_per_frame = approx_bytes_per_frame? approx_bytes_per_frame * 2 : 16; + continue; + } + /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ + first_seek = false; + + /* make sure we are not seeking in corrupted stream */ + if (this_frame_sample < lower_bound_sample) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + + /* we need to narrow the search */ + if(target_sample < this_frame_sample) { + upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; +/*@@@@@@ what will decode position be if at end of stream? */ + if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (unsigned)(2 * (upper_bound - pos) / 3 + 16); + } + else { /* target_sample >= this_frame_sample + this frame's blocksize */ + lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; + if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (unsigned)(2 * (lower_bound - pos) / 3 + 16); + } + } + + return true; +} + +#if FLAC__HAS_OGG +FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) +{ + FLAC__uint64 left_pos = 0, right_pos = stream_length; + FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); + FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; + FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ + FLAC__bool did_a_seek; + unsigned iteration = 0; + + /* In the first iterations, we will calculate the target byte position + * by the distance from the target sample to left_sample and + * right_sample (let's call it "proportional search"). After that, we + * will switch to binary search. + */ + unsigned BINARY_SEARCH_AFTER_ITERATION = 2; + + /* We will switch to a linear search once our current sample is less + * than this number of samples ahead of the target sample + */ + static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; + + /* If the total number of samples is unknown, use a large value, and + * force binary search immediately. + */ + if(right_sample == 0) { + right_sample = (FLAC__uint64)(-1); + BINARY_SEARCH_AFTER_ITERATION = 0; + } + + decoder->private_->target_sample = target_sample; + for( ; ; iteration++) { + if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { + if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { + pos = (right_pos + left_pos) / 2; + } + else { +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if defined _MSC_VER || defined __MINGW32__ + /* with MSVC you have to spoon feed it the casting */ + pos = (FLAC__uint64)((FLAC__double)(FLAC__int64)(target_sample - left_sample) / (FLAC__double)(FLAC__int64)(right_sample - left_sample) * (FLAC__double)(FLAC__int64)(right_pos - left_pos)); +#else + pos = (FLAC__uint64)((FLAC__double)(target_sample - left_sample) / (FLAC__double)(right_sample - left_sample) * (FLAC__double)(right_pos - left_pos)); +#endif +#else + /* a little less accurate: */ + if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) + pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample)); + else /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16)); +#endif + /* @@@ TODO: might want to limit pos to some distance + * before EOF, to make sure we land before the last frame, + * thereby getting a this_frame_sample and so having a better + * estimate. + */ + } + + /* physical seek */ + if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + did_a_seek = true; + } + else + did_a_seek = false; + + decoder->private_->got_a_frame = false; + if(!FLAC__stream_decoder_process_single(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!decoder->private_->got_a_frame) { + if(did_a_seek) { + /* this can happen if we seek to a point after the last frame; we drop + * to binary search right away in this case to avoid any wasted + * iterations of proportional search. + */ + right_pos = pos; + BINARY_SEARCH_AFTER_ITERATION = 0; + } + else { + /* this can probably only happen if total_samples is unknown and the + * target_sample is past the end of the stream + */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + } + /* our write callback will change the state when it gets to the target frame */ + else if(!decoder->private_->is_seeking) { + break; + } + else { + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + + if (did_a_seek) { + if (this_frame_sample <= target_sample) { + /* The 'equal' case should not happen, since + * FLAC__stream_decoder_process_single() + * should recognize that it has hit the + * target sample and we would exit through + * the 'break' above. + */ + FLAC__ASSERT(this_frame_sample != target_sample); + + left_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (left_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + left_pos = pos; + } + else if(this_frame_sample > target_sample) { + right_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (right_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + right_pos = pos; + } + } + } + } + + return true; +} +#endif + +#if 0 +FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + (void)client_data; + + if(*bytes > 0) { + *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); + if(ferror(decoder->private_->file)) + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + else if(*bytes == 0) + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ +} + +FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + else + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + FLAC__off_t pos; + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + else if((pos = ftello(decoder->private_->file)) < 0) + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + else { + *absolute_byte_offset = (FLAC__uint64)pos; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; + } +} + +FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) +{ + struct flac_stat_s filestats; + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + else if(flac_fstat(fileno(decoder->private_->file), &filestats) != 0) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + else { + *stream_length = (FLAC__uint64)filestats.st_size; + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + } +} + +FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) +{ + (void)client_data; + + return feof(decoder->private_->file)? true : false; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c new file mode 100644 index 0000000000..20e98dacf8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c @@ -0,0 +1,4336 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include /* for malloc() */ +#include /* for memcpy() */ +#include /* for off_t */ +#include "../assert.h" +#include "../stream_decoder.h" +#include "include/protected/stream_encoder.h" +#include "include/private/bitwriter.h" +#include "include/private/bitmath.h" +#include "include/private/crc.h" +#include "include/private/cpu.h" +#include "include/private/fixed.h" +#include "include/private/format.h" +#include "include/private/lpc.h" +#include "include/private/md5.h" +#include "include/private/memory.h" +#if FLAC__HAS_OGG +#include "include/private/ogg_helper.h" +#include "include/private/ogg_mapping.h" +#endif +#include "include/private/stream_encoder_framing.h" +#include "include/private/window.h" +#include "../alloc.h" +#include "../compat.h" + + +/* Exact Rice codeword length calculation is off by default. The simple + * (and fast) estimation (of how many bits a residual value will be + * encoded with) in this encoder is very good, almost always yielding + * compression within 0.1% of exact calculation. + */ +#undef EXACT_RICE_BITS_CALCULATION +/* Rice parameter searching is off by default. The simple (and fast) + * parameter estimation in this encoder is very good, almost always + * yielding compression within 0.1% of the optimal parameters. + */ +#undef ENABLE_RICE_PARAMETER_SEARCH + + +typedef struct { + FLAC__int32 *data[FLAC__MAX_CHANNELS]; + unsigned size; /* of each data[] in samples */ + unsigned tail; +} verify_input_fifo; + +typedef struct { + const FLAC__byte *data; + unsigned capacity; + unsigned bytes; +} verify_output; + +typedef enum { + ENCODER_IN_MAGIC = 0, + ENCODER_IN_METADATA = 1, + ENCODER_IN_AUDIO = 2 +} EncoderStateHint; + +static struct CompressionLevels { + FLAC__bool do_mid_side_stereo; + FLAC__bool loose_mid_side_stereo; + unsigned max_lpc_order; + unsigned qlp_coeff_precision; + FLAC__bool do_qlp_coeff_prec_search; + FLAC__bool do_escape_coding; + FLAC__bool do_exhaustive_model_search; + unsigned min_residual_partition_order; + unsigned max_residual_partition_order; + unsigned rice_parameter_search_dist; +} compression_levels_[] = { + { false, false, 0, 0, false, false, false, 0, 3, 0 }, + { true , true , 0, 0, false, false, false, 0, 3, 0 }, + { true , false, 0, 0, false, false, false, 0, 3, 0 }, + { false, false, 6, 0, false, false, false, 0, 4, 0 }, + { true , true , 8, 0, false, false, false, 0, 4, 0 }, + { true , false, 8, 0, false, false, false, 0, 5, 0 }, + { true , false, 8, 0, false, false, false, 0, 6, 0 }, + { true , false, 8, 0, false, false, true , 0, 6, 0 }, + { true , false, 12, 0, false, false, true , 0, 6, 0 } +}; + + +/*********************************************************************** + * + * Private class method prototypes + * + ***********************************************************************/ + +static void set_defaults_(FLAC__StreamEncoder *encoder); +static void free_(FLAC__StreamEncoder *encoder); +static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize); +static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block); +static FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block); +static void update_metadata_(const FLAC__StreamEncoder *encoder); +#if FLAC__HAS_OGG +static void update_ogg_metadata_(FLAC__StreamEncoder *encoder); +#endif +static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block); +static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block); + +static FLAC__bool process_subframe_( + FLAC__StreamEncoder *encoder, + unsigned min_partition_order, + unsigned max_partition_order, + const FLAC__FrameHeader *frame_header, + unsigned subframe_bps, + const FLAC__int32 integer_signal[], + FLAC__Subframe *subframe[2], + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], + FLAC__int32 *residual[2], + unsigned *best_subframe, + unsigned *best_bits +); + +static FLAC__bool add_subframe_( + FLAC__StreamEncoder *encoder, + unsigned blocksize, + unsigned subframe_bps, + const FLAC__Subframe *subframe, + FLAC__BitWriter *frame +); + +static unsigned evaluate_constant_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal, + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +); + +static unsigned evaluate_fixed_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +); + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +static unsigned evaluate_lpc_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + const FLAC__real lp_coeff[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned qlp_coeff_precision, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +); +#endif + +static unsigned evaluate_verbatim_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +); + +static unsigned find_best_partition_order_( + struct FLAC__StreamEncoderPrivate *private_, + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__EntropyCodingMethod *best_ecm +); + +static void precompute_partition_info_sums_( + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps +); + +static void precompute_partition_info_escapes_( + const FLAC__int32 residual[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order +); + +static FLAC__bool set_partitioned_rice_( +#ifdef EXACT_RICE_BITS_CALCULATION + const FLAC__int32 residual[], +#endif + const FLAC__uint64 abs_residual_partition_sums[], + const unsigned raw_bits_per_partition[], + const unsigned residual_samples, + const unsigned predictor_order, + const unsigned suggested_rice_parameter, + const unsigned rice_parameter_limit, + const unsigned rice_parameter_search_dist, + const unsigned partition_order, + const FLAC__bool search_for_escapes, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, + unsigned *bits +); + +static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples); + +/* verify-related routines: */ +static void append_to_verify_fifo_( + verify_input_fifo *fifo, + const FLAC__int32 * const input[], + unsigned input_offset, + unsigned channels, + unsigned wide_samples +); + +static void append_to_verify_fifo_interleaved_( + verify_input_fifo *fifo, + const FLAC__int32 input[], + unsigned input_offset, + unsigned channels, + unsigned wide_samples +); + +static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); +static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); +static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +//static FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +//static FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); +//static FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +//static FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); +//static FILE *get_binary_stdout_(void); + + +/*********************************************************************** + * + * Private class data + * + ***********************************************************************/ + +typedef struct FLAC__StreamEncoderPrivate { + unsigned input_capacity; /* current size (in samples) of the signal and residual buffers */ + FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS]; /* the integer version of the input signal */ + FLAC__int32 *integer_signal_mid_side[2]; /* the integer version of the mid-side input signal (stereo only) */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__real *real_signal[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) the floating-point version of the input signal */ + FLAC__real *real_signal_mid_side[2]; /* (@@@ currently unused) the floating-point version of the mid-side input signal (stereo only) */ + FLAC__real *window[FLAC__MAX_APODIZATION_FUNCTIONS]; /* the pre-computed floating-point window for each apodization function */ + FLAC__real *windowed_signal; /* the integer_signal[] * current window[] */ +#endif + unsigned subframe_bps[FLAC__MAX_CHANNELS]; /* the effective bits per sample of the input signal (stream bps - wasted bits) */ + unsigned subframe_bps_mid_side[2]; /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */ + FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */ + FLAC__int32 *residual_workspace_mid_side[2][2]; + FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2]; + FLAC__Subframe subframe_workspace_mid_side[2][2]; + FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2]; + FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2]; + unsigned best_subframe[FLAC__MAX_CHANNELS]; /* index (0 or 1) into 2nd dimension of the above workspaces */ + unsigned best_subframe_mid_side[2]; + unsigned best_subframe_bits[FLAC__MAX_CHANNELS]; /* size in bits of the best subframe for each channel */ + unsigned best_subframe_bits_mid_side[2]; + FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */ + unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */ + FLAC__BitWriter *frame; /* the current frame being worked on */ + unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */ + unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */ + FLAC__ChannelAssignment last_channel_assignment; + FLAC__StreamMetadata streaminfo; /* scratchpad for STREAMINFO as it is built */ + FLAC__StreamMetadata_SeekTable *seek_table; /* pointer into encoder->protected_->metadata_ where the seek table is */ + unsigned current_sample_number; + unsigned current_frame_number; + FLAC__MD5Context md5context; + FLAC__CPUInfo cpuinfo; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#else + unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#endif +#ifndef FLAC__INTEGER_ONLY_LIBRARY + void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); + void (*local_lpc_compute_residual_from_qlp_coefficients)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); + void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); + void (*local_lpc_compute_residual_from_qlp_coefficients_16bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +#endif + FLAC__bool use_wide_by_block; /* use slow 64-bit versions of some functions because of the block size */ + FLAC__bool use_wide_by_partition; /* use slow 64-bit versions of some functions because of the min partition order and blocksize */ + FLAC__bool use_wide_by_order; /* use slow 64-bit versions of some functions because of the lpc order */ + FLAC__bool disable_constant_subframes; + FLAC__bool disable_fixed_subframes; + FLAC__bool disable_verbatim_subframes; +#if FLAC__HAS_OGG + FLAC__bool is_ogg; +#endif + FLAC__StreamEncoderReadCallback read_callback; /* currently only needed for Ogg FLAC */ + FLAC__StreamEncoderSeekCallback seek_callback; + FLAC__StreamEncoderTellCallback tell_callback; + FLAC__StreamEncoderWriteCallback write_callback; + FLAC__StreamEncoderMetadataCallback metadata_callback; + FLAC__StreamEncoderProgressCallback progress_callback; + void *client_data; + unsigned first_seekpoint_to_check; + FILE *file; /* only used when encoding to a file */ + FLAC__uint64 bytes_written; + FLAC__uint64 samples_written; + unsigned frames_written; + unsigned total_frames_estimate; + /* unaligned (original) pointers to allocated data */ + FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS]; + FLAC__int32 *integer_signal_mid_side_unaligned[2]; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) */ + FLAC__real *real_signal_mid_side_unaligned[2]; /* (@@@ currently unused) */ + FLAC__real *window_unaligned[FLAC__MAX_APODIZATION_FUNCTIONS]; + FLAC__real *windowed_signal_unaligned; +#endif + FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2]; + FLAC__int32 *residual_workspace_mid_side_unaligned[2][2]; + FLAC__uint64 *abs_residual_partition_sums_unaligned; + unsigned *raw_bits_per_partition_unaligned; + /* + * These fields have been moved here from private function local + * declarations merely to save stack space during encoding. + */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */ +#endif + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */ + /* + * The data for the verify section + */ + struct { + FLAC__StreamDecoder *decoder; + EncoderStateHint state_hint; + FLAC__bool needs_magic_hack; + verify_input_fifo input_fifo; + verify_output output; + struct { + FLAC__uint64 absolute_sample; + unsigned frame_number; + unsigned channel; + unsigned sample; + FLAC__int32 expected; + FLAC__int32 got; + } error_stats; + } verify; + FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */ +} FLAC__StreamEncoderPrivate; + +/*********************************************************************** + * + * Public static class data + * + ***********************************************************************/ + +FLAC_API const char * const FLAC__StreamEncoderStateString[] = { + "FLAC__STREAM_ENCODER_OK", + "FLAC__STREAM_ENCODER_UNINITIALIZED", + "FLAC__STREAM_ENCODER_OGG_ERROR", + "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR", + "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA", + "FLAC__STREAM_ENCODER_CLIENT_ERROR", + "FLAC__STREAM_ENCODER_IO_ERROR", + "FLAC__STREAM_ENCODER_FRAMING_ERROR", + "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR" +}; + +FLAC_API const char * const FLAC__StreamEncoderInitStatusString[] = { + "FLAC__STREAM_ENCODER_INIT_STATUS_OK", + "FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR", + "FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION", + "FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER", + "FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA", + "FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamEncoderReadStatusString[] = { + "FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE", + "FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM", + "FLAC__STREAM_ENCODER_READ_STATUS_ABORT", + "FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = { + "FLAC__STREAM_ENCODER_WRITE_STATUS_OK", + "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR" +}; + +FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[] = { + "FLAC__STREAM_ENCODER_SEEK_STATUS_OK", + "FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR", + "FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamEncoderTellStatusString[] = { + "FLAC__STREAM_ENCODER_TELL_STATUS_OK", + "FLAC__STREAM_ENCODER_TELL_STATUS_ERROR", + "FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED" +}; + +/* Number of samples that will be overread to watch for end of stream. By + * 'overread', we mean that the FLAC__stream_encoder_process*() calls will + * always try to read blocksize+1 samples before encoding a block, so that + * even if the stream has a total sample count that is an integral multiple + * of the blocksize, we will still notice when we are encoding the last + * block. This is needed, for example, to correctly set the end-of-stream + * marker in Ogg FLAC. + * + * WATCHOUT: some parts of the code assert that OVERREAD_ == 1 and there's + * not really any reason to change it. + */ +static const unsigned OVERREAD_ = 1; + +/*********************************************************************** + * + * Class constructor/destructor + * + */ +FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void) +{ + FLAC__StreamEncoder *encoder; + unsigned i; + + FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ + + encoder = (FLAC__StreamEncoder*) calloc(1, sizeof(FLAC__StreamEncoder)); + if(encoder == 0) { + return 0; + } + + encoder->protected_ = (FLAC__StreamEncoderProtected*) calloc(1, sizeof(FLAC__StreamEncoderProtected)); + if(encoder->protected_ == 0) { + free(encoder); + return 0; + } + + encoder->private_ = (FLAC__StreamEncoderPrivate*) calloc(1, sizeof(FLAC__StreamEncoderPrivate)); + if(encoder->private_ == 0) { + free(encoder->protected_); + free(encoder); + return 0; + } + + encoder->private_->frame = FLAC__bitwriter_new(); + if(encoder->private_->frame == 0) { + free(encoder->private_); + free(encoder->protected_); + free(encoder); + return 0; + } + + encoder->private_->file = 0; + + set_defaults_(encoder); + + encoder->private_->is_being_deleted = false; + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0]; + encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1]; + } + for(i = 0; i < 2; i++) { + encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0]; + encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1]; + } + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0]; + encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1]; + } + for(i = 0; i < 2; i++) { + encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]; + encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]; + } + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]); + } + for(i = 0; i < 2; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); + } + for(i = 0; i < 2; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]); + + encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; + + return encoder; +} + +FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder) +{ + unsigned i; + + if (encoder == NULL) + return ; + + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->private_->frame); + + encoder->private_->is_being_deleted = true; + + (void)FLAC__stream_encoder_finish(encoder); + + if(0 != encoder->private_->verify.decoder) + FLAC__stream_decoder_delete(encoder->private_->verify.decoder); + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]); + } + for(i = 0; i < 2; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); + } + for(i = 0; i < 2; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]); + + FLAC__bitwriter_delete(encoder->private_->frame); + free(encoder->private_); + free(encoder->protected_); + free(encoder); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +static FLAC__StreamEncoderInitStatus init_stream_internal_( + FLAC__StreamEncoder *encoder, + FLAC__StreamEncoderReadCallback read_callback, + FLAC__StreamEncoderWriteCallback write_callback, + FLAC__StreamEncoderSeekCallback seek_callback, + FLAC__StreamEncoderTellCallback tell_callback, + FLAC__StreamEncoderMetadataCallback metadata_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + unsigned i; + FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment, metadata_picture_has_type1, metadata_picture_has_type2; + + FLAC__ASSERT(0 != encoder); + + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; + +#if !FLAC__HAS_OGG + if(is_ogg) + return FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER; +#endif + + if(0 == write_callback || (seek_callback && 0 == tell_callback)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS; + + if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS; + + if(encoder->protected_->channels != 2) { + encoder->protected_->do_mid_side_stereo = false; + encoder->protected_->loose_mid_side_stereo = false; + } + else if(!encoder->protected_->do_mid_side_stereo) + encoder->protected_->loose_mid_side_stereo = false; + + if(encoder->protected_->bits_per_sample >= 32) + encoder->protected_->do_mid_side_stereo = false; /* since we currenty do 32-bit math, the side channel would have 33 bps and overflow */ + + if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE; + + if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE; + + if(encoder->protected_->blocksize == 0) { + if(encoder->protected_->max_lpc_order == 0) + encoder->protected_->blocksize = 1152; + else + encoder->protected_->blocksize = 4096; + } + + if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE; + + if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER; + + if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order) + return FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER; + + if(encoder->protected_->qlp_coeff_precision == 0) { + if(encoder->protected_->bits_per_sample < 16) { + /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */ + /* @@@ until then we'll make a guess */ + encoder->protected_->qlp_coeff_precision = flac_max(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2); + } + else if(encoder->protected_->bits_per_sample == 16) { + if(encoder->protected_->blocksize <= 192) + encoder->protected_->qlp_coeff_precision = 7; + else if(encoder->protected_->blocksize <= 384) + encoder->protected_->qlp_coeff_precision = 8; + else if(encoder->protected_->blocksize <= 576) + encoder->protected_->qlp_coeff_precision = 9; + else if(encoder->protected_->blocksize <= 1152) + encoder->protected_->qlp_coeff_precision = 10; + else if(encoder->protected_->blocksize <= 2304) + encoder->protected_->qlp_coeff_precision = 11; + else if(encoder->protected_->blocksize <= 4608) + encoder->protected_->qlp_coeff_precision = 12; + else + encoder->protected_->qlp_coeff_precision = 13; + } + else { + if(encoder->protected_->blocksize <= 384) + encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2; + else if(encoder->protected_->blocksize <= 1152) + encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1; + else + encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; + } + FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION); + } + else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION; + + if(encoder->protected_->streamable_subset) { + if(!FLAC__format_blocksize_is_subset(encoder->protected_->blocksize, encoder->protected_->sample_rate)) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if(!FLAC__format_sample_rate_is_subset(encoder->protected_->sample_rate)) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if( + encoder->protected_->bits_per_sample != 8 && + encoder->protected_->bits_per_sample != 12 && + encoder->protected_->bits_per_sample != 16 && + encoder->protected_->bits_per_sample != 20 && + encoder->protected_->bits_per_sample != 24 + ) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if( + encoder->protected_->sample_rate <= 48000 && + ( + encoder->protected_->blocksize > FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ || + encoder->protected_->max_lpc_order > FLAC__SUBSET_MAX_LPC_ORDER_48000HZ + ) + ) { + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + } + } + + if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1; + if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order) + encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order; + +#if FLAC__HAS_OGG + /* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */ + if(is_ogg && 0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 1) { + unsigned i1; + for(i1 = 1; i1 < encoder->protected_->num_metadata_blocks; i1++) { + if(0 != encoder->protected_->metadata[i1] && encoder->protected_->metadata[i1]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { + FLAC__StreamMetadata *vc = encoder->protected_->metadata[i1]; + for( ; i1 > 0; i1--) + encoder->protected_->metadata[i1] = encoder->protected_->metadata[i1-1]; + encoder->protected_->metadata[0] = vc; + break; + } + } + } +#endif + /* keep track of any SEEKTABLE block */ + if(0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) { + unsigned i2; + for(i2 = 0; i2 < encoder->protected_->num_metadata_blocks; i2++) { + if(0 != encoder->protected_->metadata[i2] && encoder->protected_->metadata[i2]->type == FLAC__METADATA_TYPE_SEEKTABLE) { + encoder->private_->seek_table = &encoder->protected_->metadata[i2]->data.seek_table; + break; /* take only the first one */ + } + } + } + + /* validate metadata */ + if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_has_seektable = false; + metadata_has_vorbis_comment = false; + metadata_picture_has_type1 = false; + metadata_picture_has_type2 = false; + for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { + const FLAC__StreamMetadata *m = encoder->protected_->metadata[i]; + if(m->type == FLAC__METADATA_TYPE_STREAMINFO) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + else if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) { + if(metadata_has_seektable) /* only one is allowed */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_has_seektable = true; + if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + } + else if(m->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { + if(metadata_has_vorbis_comment) /* only one is allowed */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_has_vorbis_comment = true; + } + else if(m->type == FLAC__METADATA_TYPE_CUESHEET) { + if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + } + else if(m->type == FLAC__METADATA_TYPE_PICTURE) { + if(!FLAC__format_picture_is_legal(&m->data.picture, /*violation=*/0)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) { + if(metadata_picture_has_type1) /* there should only be 1 per stream */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_picture_has_type1 = true; + /* standard icon must be 32x32 pixel PNG */ + if( + m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD && + ( + (strcmp(m->data.picture.mime_type, "image/png") && strcmp(m->data.picture.mime_type, "-->")) || + m->data.picture.width != 32 || + m->data.picture.height != 32 + ) + ) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + } + else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) { + if(metadata_picture_has_type2) /* there should only be 1 per stream */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_picture_has_type2 = true; + } + } + } + + encoder->private_->input_capacity = 0; + for(i = 0; i < encoder->protected_->channels; i++) { + encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0; +#endif + } + for(i = 0; i < 2; i++) { + encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0; +#endif + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + for(i = 0; i < encoder->protected_->num_apodizations; i++) + encoder->private_->window_unaligned[i] = encoder->private_->window[i] = 0; + encoder->private_->windowed_signal_unaligned = encoder->private_->windowed_signal = 0; +#endif + for(i = 0; i < encoder->protected_->channels; i++) { + encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0; + encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0; + encoder->private_->best_subframe[i] = 0; + } + for(i = 0; i < 2; i++) { + encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0; + encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0; + encoder->private_->best_subframe_mid_side[i] = 0; + } + encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0; + encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5); +#else + /* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */ + /* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply÷ by hand */ + FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350); + FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535); + FLAC__ASSERT(encoder->protected_->sample_rate <= 655350); + FLAC__ASSERT(encoder->protected_->blocksize <= 65535); + encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF); +#endif + if(encoder->private_->loose_mid_side_stereo_frames == 0) + encoder->private_->loose_mid_side_stereo_frames = 1; + encoder->private_->loose_mid_side_stereo_frame_count = 0; + encoder->private_->current_sample_number = 0; + encoder->private_->current_frame_number = 0; + + encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30); + encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(flac_max(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */ + encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */ + + /* + * get the CPU info and set the function pointers + */ + FLAC__cpu_info(&encoder->private_->cpuinfo); + /* first default to the non-asm routines */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; +#endif + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients; +#endif + /* now override with asm where appropriate */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY +# ifndef FLAC__NO_ASM + if(encoder->private_->cpuinfo.use_asm) { +# ifdef FLAC__CPU_IA32 + FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); +# ifdef FLAC__HAS_NASM + if(encoder->private_->cpuinfo.data.ia32.sse) { + if(encoder->protected_->max_lpc_order < 4) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4; + else if(encoder->protected_->max_lpc_order < 8) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8; + else if(encoder->protected_->max_lpc_order < 12) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12; + else + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; + } + else if(encoder->private_->cpuinfo.data.ia32._3dnow) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow; + else + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; + if(encoder->private_->cpuinfo.data.ia32.mmx) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx; + } + else { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; + } + if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov) + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; +# endif /* FLAC__HAS_NASM */ +# endif /* FLAC__CPU_IA32 */ + } +# endif /* !FLAC__NO_ASM */ +#endif /* !FLAC__INTEGER_ONLY_LIBRARY */ + /* finally override based on wide-ness if necessary */ + if(encoder->private_->use_wide_by_block) { + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide; + } + + /* set state to OK; from here on, errors are fatal and we'll override the state then */ + encoder->protected_->state = FLAC__STREAM_ENCODER_OK; + +#if FLAC__HAS_OGG + encoder->private_->is_ogg = is_ogg; + if(is_ogg && !FLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } +#endif + + encoder->private_->read_callback = read_callback; + encoder->private_->write_callback = write_callback; + encoder->private_->seek_callback = seek_callback; + encoder->private_->tell_callback = tell_callback; + encoder->private_->metadata_callback = metadata_callback; + encoder->private_->client_data = client_data; + + if(!resize_buffers_(encoder, encoder->protected_->blocksize)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + if(!FLAC__bitwriter_init(encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * Set up the verify stuff if necessary + */ + if(encoder->protected_->verify) { + /* + * First, set up the fifo which will hold the + * original signal to compare against + */ + encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize+OVERREAD_; + for(i = 0; i < encoder->protected_->channels; i++) { + if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*) safe_malloc_mul_2op_p(sizeof(FLAC__int32), /*times*/encoder->private_->verify.input_fifo.size))) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + encoder->private_->verify.input_fifo.tail = 0; + + /* + * Now set up a stream decoder for verification + */ + if(0 == encoder->private_->verify.decoder) { + encoder->private_->verify.decoder = FLAC__stream_decoder_new(); + if(0 == encoder->private_->verify.decoder) { + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + + if(FLAC__stream_decoder_init_stream(encoder->private_->verify.decoder, verify_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, verify_write_callback_, verify_metadata_callback_, verify_error_callback_, /*client_data=*/encoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + encoder->private_->verify.error_stats.absolute_sample = 0; + encoder->private_->verify.error_stats.frame_number = 0; + encoder->private_->verify.error_stats.channel = 0; + encoder->private_->verify.error_stats.sample = 0; + encoder->private_->verify.error_stats.expected = 0; + encoder->private_->verify.error_stats.got = 0; + + /* + * These must be done before we write any metadata, because that + * calls the write_callback, which uses these values. + */ + encoder->private_->first_seekpoint_to_check = 0; + encoder->private_->samples_written = 0; + encoder->protected_->streaminfo_offset = 0; + encoder->protected_->seektable_offset = 0; + encoder->protected_->audio_offset = 0; + + /* + * write the stream header + */ + if(encoder->protected_->verify) + encoder->private_->verify.state_hint = ENCODER_IN_MAGIC; + if(!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * write the STREAMINFO metadata block + */ + if(encoder->protected_->verify) + encoder->private_->verify.state_hint = ENCODER_IN_METADATA; + encoder->private_->streaminfo.type = FLAC__METADATA_TYPE_STREAMINFO; + encoder->private_->streaminfo.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */ + encoder->private_->streaminfo.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; + encoder->private_->streaminfo.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */ + encoder->private_->streaminfo.data.stream_info.max_blocksize = encoder->protected_->blocksize; + encoder->private_->streaminfo.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */ + encoder->private_->streaminfo.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */ + encoder->private_->streaminfo.data.stream_info.sample_rate = encoder->protected_->sample_rate; + encoder->private_->streaminfo.data.stream_info.channels = encoder->protected_->channels; + encoder->private_->streaminfo.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample; + encoder->private_->streaminfo.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */ + memset(encoder->private_->streaminfo.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */ + if(encoder->protected_->do_md5) + FLAC__MD5Init(&encoder->private_->md5context); + if(!FLAC__add_metadata_block(&encoder->private_->streaminfo, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * Now that the STREAMINFO block is written, we can init this to an + * absurdly-high value... + */ + encoder->private_->streaminfo.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1; + /* ... and clear this to 0 */ + encoder->private_->streaminfo.data.stream_info.total_samples = 0; + + /* + * Check to see if the supplied metadata contains a VORBIS_COMMENT; + * if not, we will write an empty one (FLAC__add_metadata_block() + * automatically supplies the vendor string). + * + * WATCHOUT: the Ogg FLAC mapping requires us to write this block after + * the STREAMINFO. (In the case that metadata_has_vorbis_comment is + * true it will have already insured that the metadata list is properly + * ordered.) + */ + if(!metadata_has_vorbis_comment) { + FLAC__StreamMetadata vorbis_comment; + vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT; + vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0); + vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */ + vorbis_comment.data.vorbis_comment.vendor_string.length = 0; + vorbis_comment.data.vorbis_comment.vendor_string.entry = 0; + vorbis_comment.data.vorbis_comment.num_comments = 0; + vorbis_comment.data.vorbis_comment.comments = 0; + if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + + /* + * write the user's metadata blocks + */ + for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { + encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1); + if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + + /* now that all the metadata is written, we save the stream offset */ + if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &encoder->protected_->audio_offset, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + if(encoder->protected_->verify) + encoder->private_->verify.state_hint = ENCODER_IN_AUDIO; + + return FLAC__STREAM_ENCODER_INIT_STATUS_OK; +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream( + FLAC__StreamEncoder *encoder, + FLAC__StreamEncoderWriteCallback write_callback, + FLAC__StreamEncoderSeekCallback seek_callback, + FLAC__StreamEncoderTellCallback tell_callback, + FLAC__StreamEncoderMetadataCallback metadata_callback, + void *client_data +) +{ + return init_stream_internal_( + encoder, + /*read_callback=*/0, + write_callback, + seek_callback, + tell_callback, + metadata_callback, + client_data, + /*is_ogg=*/false + ); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream( + FLAC__StreamEncoder *encoder, + FLAC__StreamEncoderReadCallback read_callback, + FLAC__StreamEncoderWriteCallback write_callback, + FLAC__StreamEncoderSeekCallback seek_callback, + FLAC__StreamEncoderTellCallback tell_callback, + FLAC__StreamEncoderMetadataCallback metadata_callback, + void *client_data +) +{ + return init_stream_internal_( + encoder, + read_callback, + write_callback, + seek_callback, + tell_callback, + metadata_callback, + client_data, + /*is_ogg=*/true + ); +} + +#if 0 +static FLAC__StreamEncoderInitStatus init_FILE_internal_( + FLAC__StreamEncoder *encoder, + FILE *file, + FLAC__StreamEncoderProgressCallback progress_callback, + void * /*client_data*/, + FLAC__bool is_ogg +) +{ + FLAC__StreamEncoderInitStatus init_status; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != file); + + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; + + /* double protection */ + if(file == 0) { + encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * To make sure that our file does not go unclosed after an error, we + * must assign the FILE pointer before any further error can occur in + * this routine. + */ + if(file == stdout) + file = get_binary_stdout_(); /* just to be safe */ + + encoder->private_->file = file; + + encoder->private_->progress_callback = progress_callback; + encoder->private_->bytes_written = 0; + encoder->private_->samples_written = 0; + encoder->private_->frames_written = 0; + + init_status = init_stream_internal_( + encoder, + encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_ : 0, + file_write_callback_, + encoder->private_->file == stdout? 0 : file_seek_callback_, + encoder->private_->file == stdout? 0 : file_tell_callback_, + /*metadata_callback=*/0, + client_data, + is_ogg + ); + if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { + /* the above function sets the state for us in case of an error */ + return init_status; + } + + { + unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); + + FLAC__ASSERT(blocksize != 0); + encoder->private_->total_frames_estimate = (unsigned)((FLAC__stream_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize); + } + + return init_status; +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE( + FLAC__StreamEncoder *encoder, + FILE *file, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE( + FLAC__StreamEncoder *encoder, + FILE *file, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/true); +} + +static FLAC__StreamEncoderInitStatus init_file_internal_( + FLAC__StreamEncoder *encoder, + const char *filename, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FILE *file; + + FLAC__ASSERT(0 != encoder); + + /* + * To make sure that our file does not go unclosed after an error, we + * have to do the same entrance checks here that are later performed + * in FLAC__stream_encoder_init_FILE() before the FILE* is assigned. + */ + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; + + file = filename? flac_fopen(filename, "w+b") : stdout; + + if(file == 0) { + encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + return init_FILE_internal_(encoder, file, progress_callback, client_data, is_ogg); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file( + FLAC__StreamEncoder *encoder, + const char *filename, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file( + FLAC__StreamEncoder *encoder, + const char *filename, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/true); +} +#endif + +FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder) +{ + FLAC__bool error = false; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + + if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED) + return true; + + if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) { + if(encoder->private_->current_sample_number != 0) { + const FLAC__bool is_fractional_block = encoder->protected_->blocksize != encoder->private_->current_sample_number; + encoder->protected_->blocksize = encoder->private_->current_sample_number; + if(!process_frame_(encoder, is_fractional_block, /*is_last_block=*/true)) + error = true; + } + } + + if(encoder->protected_->do_md5) + FLAC__MD5Final(encoder->private_->streaminfo.data.stream_info.md5sum, &encoder->private_->md5context); + + if(!encoder->private_->is_being_deleted) { + if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK) { + if(encoder->private_->seek_callback) { +#if FLAC__HAS_OGG + if(encoder->private_->is_ogg) + update_ogg_metadata_(encoder); + else +#endif + update_metadata_(encoder); + + /* check if an error occurred while updating metadata */ + if(encoder->protected_->state != FLAC__STREAM_ENCODER_OK) + error = true; + } + if(encoder->private_->metadata_callback) + encoder->private_->metadata_callback(encoder, &encoder->private_->streaminfo, encoder->private_->client_data); + } + + if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder && !FLAC__stream_decoder_finish(encoder->private_->verify.decoder)) { + if(!error) + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; + error = true; + } + } + + if(0 != encoder->private_->file) { + if(encoder->private_->file != stdout) + fclose(encoder->private_->file); + encoder->private_->file = 0; + } + +#if FLAC__HAS_OGG + if(encoder->private_->is_ogg) + FLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect); +#endif + + free_(encoder); + set_defaults_(encoder); + + if(!error) + encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; + + return !error; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#if FLAC__HAS_OGG + /* can't check encoder->private_->is_ogg since that's not set until init time */ + FLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value); + return true; +#else + (void)value; + return false; +#endif +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#ifndef FLAC__MANDATORY_VERIFY_WHILE_ENCODING + encoder->protected_->verify = value; +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->streamable_subset = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_md5 = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->channels = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->bits_per_sample = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->sample_rate = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__bool ok = true; + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + if(value >= sizeof(compression_levels_)/sizeof(compression_levels_[0])) + value = sizeof(compression_levels_)/sizeof(compression_levels_[0]) - 1; + ok &= FLAC__stream_encoder_set_do_mid_side_stereo (encoder, compression_levels_[value].do_mid_side_stereo); + ok &= FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, compression_levels_[value].loose_mid_side_stereo); +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if 0 + /* was: */ + ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); + /* but it's too hard to specify the string in a locale-specific way */ +#else + encoder->protected_->num_apodizations = 1; + encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; + encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; +#endif +#endif + ok &= FLAC__stream_encoder_set_max_lpc_order (encoder, compression_levels_[value].max_lpc_order); + ok &= FLAC__stream_encoder_set_qlp_coeff_precision (encoder, compression_levels_[value].qlp_coeff_precision); + ok &= FLAC__stream_encoder_set_do_qlp_coeff_prec_search (encoder, compression_levels_[value].do_qlp_coeff_prec_search); + ok &= FLAC__stream_encoder_set_do_escape_coding (encoder, compression_levels_[value].do_escape_coding); + ok &= FLAC__stream_encoder_set_do_exhaustive_model_search (encoder, compression_levels_[value].do_exhaustive_model_search); + ok &= FLAC__stream_encoder_set_min_residual_partition_order(encoder, compression_levels_[value].min_residual_partition_order); + ok &= FLAC__stream_encoder_set_max_residual_partition_order(encoder, compression_levels_[value].max_residual_partition_order); + ok &= FLAC__stream_encoder_set_rice_parameter_search_dist (encoder, compression_levels_[value].rice_parameter_search_dist); + return ok; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->blocksize = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_mid_side_stereo = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->loose_mid_side_stereo = value; + return true; +} + +/*@@@@add to tests*/ +FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(0 != specification); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#ifdef FLAC__INTEGER_ONLY_LIBRARY + (void)specification; /* silently ignore since we haven't integerized; will always use a rectangular window */ +#else + encoder->protected_->num_apodizations = 0; + while(1) { + const char *s = strchr(specification, ';'); + const size_t n = s? (size_t)(s - specification) : strlen(specification); + if (n==8 && 0 == strncmp("bartlett" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT; + else if(n==13 && 0 == strncmp("bartlett_hann", specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT_HANN; + else if(n==8 && 0 == strncmp("blackman" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN; + else if(n==26 && 0 == strncmp("blackman_harris_4term_92db", specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE; + else if(n==6 && 0 == strncmp("connes" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_CONNES; + else if(n==7 && 0 == strncmp("flattop" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_FLATTOP; + else if(n>7 && 0 == strncmp("gauss(" , specification, 6)) { + FLAC__real stddev = (FLAC__real)strtod(specification+6, 0); + if (stddev > 0.0 && stddev <= 0.5) { + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.gauss.stddev = stddev; + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_GAUSS; + } + } + else if(n==7 && 0 == strncmp("hamming" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HAMMING; + else if(n==4 && 0 == strncmp("hann" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HANN; + else if(n==13 && 0 == strncmp("kaiser_bessel", specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_KAISER_BESSEL; + else if(n==7 && 0 == strncmp("nuttall" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_NUTTALL; + else if(n==9 && 0 == strncmp("rectangle" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_RECTANGLE; + else if(n==8 && 0 == strncmp("triangle" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TRIANGLE; + else if(n>7 && 0 == strncmp("tukey(" , specification, 6)) { + FLAC__real p = (FLAC__real)strtod(specification+6, 0); + if (p >= 0.0 && p <= 1.0) { + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = p; + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; + } + } + else if(n==5 && 0 == strncmp("welch" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH; + if (encoder->protected_->num_apodizations == 32) + break; + if (s) + specification = s+1; + else + break; + } + if(encoder->protected_->num_apodizations == 0) { + encoder->protected_->num_apodizations = 1; + encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; + encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; + } +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->max_lpc_order = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->qlp_coeff_precision = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_qlp_coeff_prec_search = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#if 0 + /*@@@ deprecated: */ + encoder->protected_->do_escape_coding = value; +#else + (void)value; +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_exhaustive_model_search = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->min_residual_partition_order = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->max_residual_partition_order = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#if 0 + /*@@@ deprecated: */ + encoder->protected_->rice_parameter_search_dist = value; +#else + (void)value; +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->total_samples_estimate = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + if(0 == metadata) + num_blocks = 0; + if(0 == num_blocks) + metadata = 0; + /* realloc() does not do exactly what we want so... */ + if(encoder->protected_->metadata) { + free(encoder->protected_->metadata); + encoder->protected_->metadata = 0; + encoder->protected_->num_metadata_blocks = 0; + } + if(num_blocks) { + FLAC__StreamMetadata **m; + if(0 == (m = (FLAC__StreamMetadata**) safe_malloc_mul_2op_p(sizeof(m[0]), /*times*/num_blocks))) + return false; + memcpy(m, metadata, sizeof(m[0]) * num_blocks); + encoder->protected_->metadata = m; + encoder->protected_->num_metadata_blocks = num_blocks; + } +#if FLAC__HAS_OGG + if(!FLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks)) + return false; +#endif + return true; +} + +/* + * These three functions are not static, but not publically exposed in + * include/FLAC/ either. They are used by the test suite. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->private_->disable_constant_subframes = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->private_->disable_fixed_subframes = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->private_->disable_verbatim_subframes = value; + return true; +} + +FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->state; +} + +FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->verify) + return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder); + else + return FLAC__STREAM_DECODER_UNINITIALIZED; +} + +FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) + return FLAC__StreamEncoderStateString[encoder->protected_->state]; + else + return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder); +} + +FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(0 != absolute_sample) + *absolute_sample = encoder->private_->verify.error_stats.absolute_sample; + if(0 != frame_number) + *frame_number = encoder->private_->verify.error_stats.frame_number; + if(0 != channel) + *channel = encoder->private_->verify.error_stats.channel; + if(0 != sample) + *sample = encoder->private_->verify.error_stats.sample; + if(0 != expected) + *expected = encoder->private_->verify.error_stats.expected; + if(0 != got) + *got = encoder->private_->verify.error_stats.got; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->verify; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->streamable_subset; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_md5; +} + +FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->channels; +} + +FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->bits_per_sample; +} + +FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->sample_rate; +} + +FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->blocksize; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_mid_side_stereo; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->loose_mid_side_stereo; +} + +FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->max_lpc_order; +} + +FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->qlp_coeff_precision; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_qlp_coeff_prec_search; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_escape_coding; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_exhaustive_model_search; +} + +FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->min_residual_partition_order; +} + +FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->max_residual_partition_order; +} + +FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->rice_parameter_search_dist; +} + +FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->total_samples_estimate; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples) +{ + unsigned i, j = 0, channel; + const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + + do { + const unsigned n = flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j); + + if(encoder->protected_->verify) + append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n); + + for(channel = 0; channel < channels; channel++) + memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n); + + if(encoder->protected_->do_mid_side_stereo) { + FLAC__ASSERT(channels == 2); + /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ + for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { + encoder->private_->integer_signal_mid_side[1][i] = buffer[0][j] - buffer[1][j]; + encoder->private_->integer_signal_mid_side[0][i] = (buffer[0][j] + buffer[1][j]) >> 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */ + } + } + else + j += n; + + encoder->private_->current_sample_number += n; + + /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ + if(encoder->private_->current_sample_number > blocksize) { + FLAC__ASSERT(encoder->private_->current_sample_number == blocksize+OVERREAD_); + FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ + if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) + return false; + /* move unprocessed overread samples to beginnings of arrays */ + for(channel = 0; channel < channels; channel++) + encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; + if(encoder->protected_->do_mid_side_stereo) { + encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; + encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; + } + encoder->private_->current_sample_number = 1; + } + } while(j < samples); + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples) +{ + unsigned i, j, k, channel; + FLAC__int32 x, mid, side; + const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + + j = k = 0; + /* + * we have several flavors of the same basic loop, optimized for + * different conditions: + */ + if(encoder->protected_->do_mid_side_stereo && channels == 2) { + /* + * stereo coding: unroll channel loop + */ + do { + if(encoder->protected_->verify) + append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); + + /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ + for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { + encoder->private_->integer_signal[0][i] = mid = side = buffer[k++]; + x = buffer[k++]; + encoder->private_->integer_signal[1][i] = x; + mid += x; + side -= x; + mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */ + encoder->private_->integer_signal_mid_side[1][i] = side; + encoder->private_->integer_signal_mid_side[0][i] = mid; + } + encoder->private_->current_sample_number = i; + /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ + if(i > blocksize) { + if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) + return false; + /* move unprocessed overread samples to beginnings of arrays */ + FLAC__ASSERT(i == blocksize+OVERREAD_); + FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ + encoder->private_->integer_signal[0][0] = encoder->private_->integer_signal[0][blocksize]; + encoder->private_->integer_signal[1][0] = encoder->private_->integer_signal[1][blocksize]; + encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; + encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; + encoder->private_->current_sample_number = 1; + } + } while(j < samples); + } + else { + /* + * independent channel coding: buffer each channel in inner loop + */ + do { + if(encoder->protected_->verify) + append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); + + /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ + for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { + for(channel = 0; channel < channels; channel++) + encoder->private_->integer_signal[channel][i] = buffer[k++]; + } + encoder->private_->current_sample_number = i; + /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ + if(i > blocksize) { + if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) + return false; + /* move unprocessed overread samples to beginnings of arrays */ + FLAC__ASSERT(i == blocksize+OVERREAD_); + FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ + for(channel = 0; channel < channels; channel++) + encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; + encoder->private_->current_sample_number = 1; + } + } while(j < samples); + } + + return true; +} + +/*********************************************************************** + * + * Private class methods + * + ***********************************************************************/ + +void set_defaults_(FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + +#ifdef FLAC__MANDATORY_VERIFY_WHILE_ENCODING + encoder->protected_->verify = true; +#else + encoder->protected_->verify = false; +#endif + encoder->protected_->streamable_subset = true; + encoder->protected_->do_md5 = true; + encoder->protected_->do_mid_side_stereo = false; + encoder->protected_->loose_mid_side_stereo = false; + encoder->protected_->channels = 2; + encoder->protected_->bits_per_sample = 16; + encoder->protected_->sample_rate = 44100; + encoder->protected_->blocksize = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->protected_->num_apodizations = 1; + encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; + encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; +#endif + encoder->protected_->max_lpc_order = 0; + encoder->protected_->qlp_coeff_precision = 0; + encoder->protected_->do_qlp_coeff_prec_search = false; + encoder->protected_->do_exhaustive_model_search = false; + encoder->protected_->do_escape_coding = false; + encoder->protected_->min_residual_partition_order = 0; + encoder->protected_->max_residual_partition_order = 0; + encoder->protected_->rice_parameter_search_dist = 0; + encoder->protected_->total_samples_estimate = 0; + encoder->protected_->metadata = 0; + encoder->protected_->num_metadata_blocks = 0; + + encoder->private_->seek_table = 0; + encoder->private_->disable_constant_subframes = false; + encoder->private_->disable_fixed_subframes = false; + encoder->private_->disable_verbatim_subframes = false; +#if FLAC__HAS_OGG + encoder->private_->is_ogg = false; +#endif + encoder->private_->read_callback = 0; + encoder->private_->write_callback = 0; + encoder->private_->seek_callback = 0; + encoder->private_->tell_callback = 0; + encoder->private_->metadata_callback = 0; + encoder->private_->progress_callback = 0; + encoder->private_->client_data = 0; + +#if FLAC__HAS_OGG + FLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect); +#endif + + FLAC__stream_encoder_set_compression_level(encoder, 5); +} + +void free_(FLAC__StreamEncoder *encoder) +{ + unsigned i, channel; + + FLAC__ASSERT(0 != encoder); + if(encoder->protected_->metadata) { + free(encoder->protected_->metadata); + encoder->protected_->metadata = 0; + encoder->protected_->num_metadata_blocks = 0; + } + for(i = 0; i < encoder->protected_->channels; i++) { + if(0 != encoder->private_->integer_signal_unaligned[i]) { + free(encoder->private_->integer_signal_unaligned[i]); + encoder->private_->integer_signal_unaligned[i] = 0; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(0 != encoder->private_->real_signal_unaligned[i]) { + free(encoder->private_->real_signal_unaligned[i]); + encoder->private_->real_signal_unaligned[i] = 0; + } +#endif + } + for(i = 0; i < 2; i++) { + if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) { + free(encoder->private_->integer_signal_mid_side_unaligned[i]); + encoder->private_->integer_signal_mid_side_unaligned[i] = 0; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) { + free(encoder->private_->real_signal_mid_side_unaligned[i]); + encoder->private_->real_signal_mid_side_unaligned[i] = 0; + } +#endif + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + for(i = 0; i < encoder->protected_->num_apodizations; i++) { + if(0 != encoder->private_->window_unaligned[i]) { + free(encoder->private_->window_unaligned[i]); + encoder->private_->window_unaligned[i] = 0; + } + } + if(0 != encoder->private_->windowed_signal_unaligned) { + free(encoder->private_->windowed_signal_unaligned); + encoder->private_->windowed_signal_unaligned = 0; + } +#endif + for(channel = 0; channel < encoder->protected_->channels; channel++) { + for(i = 0; i < 2; i++) { + if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) { + free(encoder->private_->residual_workspace_unaligned[channel][i]); + encoder->private_->residual_workspace_unaligned[channel][i] = 0; + } + } + } + for(channel = 0; channel < 2; channel++) { + for(i = 0; i < 2; i++) { + if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) { + free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]); + encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0; + } + } + } + if(0 != encoder->private_->abs_residual_partition_sums_unaligned) { + free(encoder->private_->abs_residual_partition_sums_unaligned); + encoder->private_->abs_residual_partition_sums_unaligned = 0; + } + if(0 != encoder->private_->raw_bits_per_partition_unaligned) { + free(encoder->private_->raw_bits_per_partition_unaligned); + encoder->private_->raw_bits_per_partition_unaligned = 0; + } + if(encoder->protected_->verify) { + for(i = 0; i < encoder->protected_->channels; i++) { + if(0 != encoder->private_->verify.input_fifo.data[i]) { + free(encoder->private_->verify.input_fifo.data[i]); + encoder->private_->verify.input_fifo.data[i] = 0; + } + } + } + FLAC__bitwriter_free(encoder->private_->frame); +} + +FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) +{ + FLAC__bool ok; + unsigned i, channel; + + FLAC__ASSERT(new_blocksize > 0); + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + FLAC__ASSERT(encoder->private_->current_sample_number == 0); + + /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */ + if(new_blocksize <= encoder->private_->input_capacity) + return true; + + ok = true; + + /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() + * requires that the input arrays (in our case the integer signals) + * have a buffer of up to 3 zeroes in front (at negative indices) for + * alignment purposes; we use 4 in front to keep the data well-aligned. + */ + + for(i = 0; ok && i < encoder->protected_->channels; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]); + memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4); + encoder->private_->integer_signal[i] += 4; +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if 0 /* @@@ currently unused */ + if(encoder->protected_->max_lpc_order > 0) + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]); +#endif +#endif + } + for(i = 0; ok && i < 2; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]); + memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4); + encoder->private_->integer_signal_mid_side[i] += 4; +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if 0 /* @@@ currently unused */ + if(encoder->protected_->max_lpc_order > 0) + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]); +#endif +#endif + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(ok && encoder->protected_->max_lpc_order > 0) { + for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->window_unaligned[i], &encoder->private_->window[i]); + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->windowed_signal_unaligned, &encoder->private_->windowed_signal); + } +#endif + for(channel = 0; ok && channel < encoder->protected_->channels; channel++) { + for(i = 0; ok && i < 2; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]); + } + } + for(channel = 0; ok && channel < 2; channel++) { + for(i = 0; ok && i < 2; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]); + } + } + /* the *2 is an approximation to the series 1 + 1/2 + 1/4 + ... that sums tree occupies in a flat array */ + /*@@@ new_blocksize*2 is too pessimistic, but to fix, we need smarter logic because a smaller new_blocksize can actually increase the # of partitions; would require moving this out into a separate function, then checking its capacity against the need of the current blocksize&min/max_partition_order (and maybe predictor order) */ + ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_blocksize * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums); + if(encoder->protected_->do_escape_coding) + ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_blocksize * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition); + + /* now adjust the windows if the blocksize has changed */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(ok && new_blocksize != encoder->private_->input_capacity && encoder->protected_->max_lpc_order > 0) { + for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) { + switch(encoder->protected_->apodizations[i].type) { + case FLAC__APODIZATION_BARTLETT: + FLAC__window_bartlett(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_BARTLETT_HANN: + FLAC__window_bartlett_hann(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_BLACKMAN: + FLAC__window_blackman(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE: + FLAC__window_blackman_harris_4term_92db_sidelobe(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_CONNES: + FLAC__window_connes(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_FLATTOP: + FLAC__window_flattop(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_GAUSS: + FLAC__window_gauss(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.gauss.stddev); + break; + case FLAC__APODIZATION_HAMMING: + FLAC__window_hamming(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_HANN: + FLAC__window_hann(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_KAISER_BESSEL: + FLAC__window_kaiser_bessel(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_NUTTALL: + FLAC__window_nuttall(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_RECTANGLE: + FLAC__window_rectangle(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_TRIANGLE: + FLAC__window_triangle(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_TUKEY: + FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); + break; + case FLAC__APODIZATION_WELCH: + FLAC__window_welch(encoder->private_->window[i], new_blocksize); + break; + default: + FLAC__ASSERT(0); + /* double protection */ + FLAC__window_hann(encoder->private_->window[i], new_blocksize); + break; + } + } + } +#endif + + if(ok) + encoder->private_->input_capacity = new_blocksize; + else + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + + return ok; +} + +FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block) +{ + const FLAC__byte *buffer; + size_t bytes; + + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); + + if(!FLAC__bitwriter_get_buffer(encoder->private_->frame, &buffer, &bytes)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + if(encoder->protected_->verify) { + encoder->private_->verify.output.data = buffer; + encoder->private_->verify.output.bytes = bytes; + if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) { + encoder->private_->verify.needs_magic_hack = true; + } + else { + if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) { + FLAC__bitwriter_release_buffer(encoder->private_->frame); + FLAC__bitwriter_clear(encoder->private_->frame); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; + return false; + } + } + } + + if(write_frame_(encoder, buffer, bytes, samples, is_last_block) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + FLAC__bitwriter_release_buffer(encoder->private_->frame); + FLAC__bitwriter_clear(encoder->private_->frame); + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return false; + } + + FLAC__bitwriter_release_buffer(encoder->private_->frame); + FLAC__bitwriter_clear(encoder->private_->frame); + + if(samples > 0) { + encoder->private_->streaminfo.data.stream_info.min_framesize = flac_min(bytes, (size_t) encoder->private_->streaminfo.data.stream_info.min_framesize); + encoder->private_->streaminfo.data.stream_info.max_framesize = flac_max(bytes, (size_t) encoder->private_->streaminfo.data.stream_info.max_framesize); + } + + return true; +} + +FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block) +{ + FLAC__StreamEncoderWriteStatus status; + FLAC__uint64 output_position = 0; + +#if FLAC__HAS_OGG == 0 + (void)is_last_block; +#endif + + /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ + if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &output_position, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; + } + + /* + * Watch for the STREAMINFO block and first SEEKTABLE block to go by and store their offsets. + */ + if(samples == 0) { + FLAC__MetadataType type = (FLAC__MetadataType) (buffer[0] & 0x7f); + if(type == FLAC__METADATA_TYPE_STREAMINFO) + encoder->protected_->streaminfo_offset = output_position; + else if(type == FLAC__METADATA_TYPE_SEEKTABLE && encoder->protected_->seektable_offset == 0) + encoder->protected_->seektable_offset = output_position; + } + + /* + * Mark the current seek point if hit (if audio_offset == 0 that + * means we're still writing metadata and haven't hit the first + * frame yet) + */ + if(0 != encoder->private_->seek_table && encoder->protected_->audio_offset > 0 && encoder->private_->seek_table->num_points > 0) { + const unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); + const FLAC__uint64 frame_first_sample = encoder->private_->samples_written; + const FLAC__uint64 frame_last_sample = frame_first_sample + (FLAC__uint64)blocksize - 1; + FLAC__uint64 test_sample; + unsigned i; + for(i = encoder->private_->first_seekpoint_to_check; i < encoder->private_->seek_table->num_points; i++) { + test_sample = encoder->private_->seek_table->points[i].sample_number; + if(test_sample > frame_last_sample) { + break; + } + else if(test_sample >= frame_first_sample) { + encoder->private_->seek_table->points[i].sample_number = frame_first_sample; + encoder->private_->seek_table->points[i].stream_offset = output_position - encoder->protected_->audio_offset; + encoder->private_->seek_table->points[i].frame_samples = blocksize; + encoder->private_->first_seekpoint_to_check++; + /* DO NOT: "break;" and here's why: + * The seektable template may contain more than one target + * sample for any given frame; we will keep looping, generating + * duplicate seekpoints for them, and we'll clean it up later, + * just before writing the seektable back to the metadata. + */ + } + else { + encoder->private_->first_seekpoint_to_check++; + } + } + } + +#if FLAC__HAS_OGG + if(encoder->private_->is_ogg) { + status = FLAC__ogg_encoder_aspect_write_callback_wrapper( + &encoder->protected_->ogg_encoder_aspect, + buffer, + bytes, + samples, + encoder->private_->current_frame_number, + is_last_block, + (FLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback, + encoder, + encoder->private_->client_data + ); + } + else +#endif + status = encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data); + + if(status == FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->private_->bytes_written += bytes; + encoder->private_->samples_written += samples; + /* we keep a high watermark on the number of frames written because + * when the encoder goes back to write metadata, 'current_frame' + * will drop back to 0. + */ + encoder->private_->frames_written = flac_max(encoder->private_->frames_written, encoder->private_->current_frame_number+1); + } + else + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + + return status; +} + +/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ +void update_metadata_(const FLAC__StreamEncoder *encoder) +{ + FLAC__byte b[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; + const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; + const FLAC__uint64 samples = metadata->data.stream_info.total_samples; + const unsigned min_framesize = metadata->data.stream_info.min_framesize; + const unsigned max_framesize = metadata->data.stream_info.max_framesize; + const unsigned bps = metadata->data.stream_info.bits_per_sample; + FLAC__StreamEncoderSeekStatus seek_status; + + FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); + + /* All this is based on intimate knowledge of the stream header + * layout, but a change to the header format that would break this + * would also break all streams encoded in the previous format. + */ + + /* + * Write MD5 signature + */ + { + const unsigned md5_offset = + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN + ) / 8; + + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + md5_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + if(encoder->private_->write_callback(encoder, metadata->data.stream_info.md5sum, 16, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + + /* + * Write total samples + */ + { + const unsigned total_samples_byte_offset = + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - 4 + ) / 8; + + b[0] = ((FLAC__byte)(bps-1) << 4) | (FLAC__byte)((samples >> 32) & 0x0F); + b[1] = (FLAC__byte)((samples >> 24) & 0xFF); + b[2] = (FLAC__byte)((samples >> 16) & 0xFF); + b[3] = (FLAC__byte)((samples >> 8) & 0xFF); + b[4] = (FLAC__byte)(samples & 0xFF); + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + total_samples_byte_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + if(encoder->private_->write_callback(encoder, b, 5, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + + /* + * Write min/max framesize + */ + { + const unsigned min_framesize_offset = + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + ) / 8; + + b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); + b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); + b[2] = (FLAC__byte)(min_framesize & 0xFF); + b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); + b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); + b[5] = (FLAC__byte)(max_framesize & 0xFF); + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + min_framesize_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + if(encoder->private_->write_callback(encoder, b, 6, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + + /* + * Write seektable + */ + if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { + unsigned i; + + FLAC__format_seektable_sort(encoder->private_->seek_table); + + FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); + + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->seektable_offset + FLAC__STREAM_METADATA_HEADER_LENGTH, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + + for(i = 0; i < encoder->private_->seek_table->num_points; i++) { + FLAC__uint64 xx; + unsigned x; + xx = encoder->private_->seek_table->points[i].sample_number; + b[7] = (FLAC__byte)xx; xx >>= 8; + b[6] = (FLAC__byte)xx; xx >>= 8; + b[5] = (FLAC__byte)xx; xx >>= 8; + b[4] = (FLAC__byte)xx; xx >>= 8; + b[3] = (FLAC__byte)xx; xx >>= 8; + b[2] = (FLAC__byte)xx; xx >>= 8; + b[1] = (FLAC__byte)xx; xx >>= 8; + b[0] = (FLAC__byte)xx; //xx >>= 8; + xx = encoder->private_->seek_table->points[i].stream_offset; + b[15] = (FLAC__byte)xx; xx >>= 8; + b[14] = (FLAC__byte)xx; xx >>= 8; + b[13] = (FLAC__byte)xx; xx >>= 8; + b[12] = (FLAC__byte)xx; xx >>= 8; + b[11] = (FLAC__byte)xx; xx >>= 8; + b[10] = (FLAC__byte)xx; xx >>= 8; + b[9] = (FLAC__byte)xx; xx >>= 8; + b[8] = (FLAC__byte)xx; //xx >>= 8; + x = encoder->private_->seek_table->points[i].frame_samples; + b[17] = (FLAC__byte)x; x >>= 8; + b[16] = (FLAC__byte)x; //x >>= 8; + if(encoder->private_->write_callback(encoder, b, 18, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + } +} + +#if FLAC__HAS_OGG +/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ +void update_ogg_metadata_(FLAC__StreamEncoder *encoder) +{ + /* the # of bytes in the 1st packet that precede the STREAMINFO */ + static const unsigned FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH = + FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + + FLAC__OGG_MAPPING_MAGIC_LENGTH + + FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + + FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + + FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH + + FLAC__STREAM_SYNC_LENGTH + ; + FLAC__byte b[flac_max(6u, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; + const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; + const FLAC__uint64 samples = metadata->data.stream_info.total_samples; + const unsigned min_framesize = metadata->data.stream_info.min_framesize; + const unsigned max_framesize = metadata->data.stream_info.max_framesize; + ogg_page page; + + FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); + FLAC__ASSERT(0 != encoder->private_->seek_callback); + + /* Pre-check that client supports seeking, since we don't want the + * ogg_helper code to ever have to deal with this condition. + */ + if(encoder->private_->seek_callback(encoder, 0, encoder->private_->client_data) == FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED) + return; + + /* All this is based on intimate knowledge of the stream header + * layout, but a change to the header format that would break this + * would also break all streams encoded in the previous format. + */ + + /** + ** Write STREAMINFO stats + **/ + simple_ogg_page__init(&page); + if(!simple_ogg_page__get_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + + /* + * Write MD5 signature + */ + { + const unsigned md5_offset = + FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN + ) / 8; + + if(md5_offset + 16 > (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + memcpy(page.body + md5_offset, metadata->data.stream_info.md5sum, 16); + } + + /* + * Write total samples + */ + { + const unsigned total_samples_byte_offset = + FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - 4 + ) / 8; + + if(total_samples_byte_offset + 5 > (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + b[0] = (FLAC__byte)page.body[total_samples_byte_offset] & 0xF0; + b[0] |= (FLAC__byte)((samples >> 32) & 0x0F); + b[1] = (FLAC__byte)((samples >> 24) & 0xFF); + b[2] = (FLAC__byte)((samples >> 16) & 0xFF); + b[3] = (FLAC__byte)((samples >> 8) & 0xFF); + b[4] = (FLAC__byte)(samples & 0xFF); + memcpy(page.body + total_samples_byte_offset, b, 5); + } + + /* + * Write min/max framesize + */ + { + const unsigned min_framesize_offset = + FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + ) / 8; + + if(min_framesize_offset + 6 > (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); + b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); + b[2] = (FLAC__byte)(min_framesize & 0xFF); + b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); + b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); + b[5] = (FLAC__byte)(max_framesize & 0xFF); + memcpy(page.body + min_framesize_offset, b, 6); + } + if(!simple_ogg_page__set_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + simple_ogg_page__clear(&page); + + /* + * Write seektable + */ + if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { + unsigned i; + FLAC__byte *p; + + FLAC__format_seektable_sort(encoder->private_->seek_table); + + FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); + + simple_ogg_page__init(&page); + if(!simple_ogg_page__get_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + + if((FLAC__STREAM_METADATA_HEADER_LENGTH + 18*encoder->private_->seek_table->num_points) != (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + + for(i = 0, p = page.body + FLAC__STREAM_METADATA_HEADER_LENGTH; i < encoder->private_->seek_table->num_points; i++, p += 18) { + FLAC__uint64 xx; + unsigned x; + xx = encoder->private_->seek_table->points[i].sample_number; + b[7] = (FLAC__byte)xx; xx >>= 8; + b[6] = (FLAC__byte)xx; xx >>= 8; + b[5] = (FLAC__byte)xx; xx >>= 8; + b[4] = (FLAC__byte)xx; xx >>= 8; + b[3] = (FLAC__byte)xx; xx >>= 8; + b[2] = (FLAC__byte)xx; xx >>= 8; + b[1] = (FLAC__byte)xx; xx >>= 8; + b[0] = (FLAC__byte)xx; xx >>= 8; + xx = encoder->private_->seek_table->points[i].stream_offset; + b[15] = (FLAC__byte)xx; xx >>= 8; + b[14] = (FLAC__byte)xx; xx >>= 8; + b[13] = (FLAC__byte)xx; xx >>= 8; + b[12] = (FLAC__byte)xx; xx >>= 8; + b[11] = (FLAC__byte)xx; xx >>= 8; + b[10] = (FLAC__byte)xx; xx >>= 8; + b[9] = (FLAC__byte)xx; xx >>= 8; + b[8] = (FLAC__byte)xx; xx >>= 8; + x = encoder->private_->seek_table->points[i].frame_samples; + b[17] = (FLAC__byte)x; x >>= 8; + b[16] = (FLAC__byte)x; x >>= 8; + memcpy(p, b, 18); + } + + if(!simple_ogg_page__set_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + simple_ogg_page__clear(&page); + } +} +#endif + +FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block) +{ + FLAC__uint16 crc; + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + + /* + * Accumulate raw signal to the MD5 signature + */ + if(encoder->protected_->do_md5 && !FLAC__MD5Accumulate(&encoder->private_->md5context, (const FLAC__int32 * const *)encoder->private_->integer_signal, encoder->protected_->channels, encoder->protected_->blocksize, (encoder->protected_->bits_per_sample+7) / 8)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + /* + * Process the frame header and subframes into the frame bitbuffer + */ + if(!process_subframes_(encoder, is_fractional_block)) { + /* the above function sets the state for us in case of an error */ + return false; + } + + /* + * Zero-pad the frame to a byte_boundary + */ + if(!FLAC__bitwriter_zero_pad_to_byte_boundary(encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + /* + * CRC-16 the whole thing + */ + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); + if( + !FLAC__bitwriter_get_write_crc16(encoder->private_->frame, &crc) || + !FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, crc, FLAC__FRAME_FOOTER_CRC_LEN) + ) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + /* + * Write it + */ + if(!write_bitbuffer_(encoder, encoder->protected_->blocksize, is_last_block)) { + /* the above function sets the state for us in case of an error */ + return false; + } + + /* + * Get ready for the next frame + */ + encoder->private_->current_sample_number = 0; + encoder->private_->current_frame_number++; + encoder->private_->streaminfo.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize; + + return true; +} + +FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block) +{ + FLAC__FrameHeader frame_header; + unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order; + FLAC__bool do_independent, do_mid_side; + + /* + * Calculate the min,max Rice partition orders + */ + if(is_fractional_block) { + max_partition_order = 0; + } + else { + max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize); + max_partition_order = flac_min(max_partition_order, encoder->protected_->max_residual_partition_order); + } + min_partition_order = flac_min(min_partition_order, max_partition_order); + + /* + * Setup the frame + */ + frame_header.blocksize = encoder->protected_->blocksize; + frame_header.sample_rate = encoder->protected_->sample_rate; + frame_header.channels = encoder->protected_->channels; + frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */ + frame_header.bits_per_sample = encoder->protected_->bits_per_sample; + frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; + frame_header.number.frame_number = encoder->private_->current_frame_number; + + /* + * Figure out what channel assignments to try + */ + if(encoder->protected_->do_mid_side_stereo) { + if(encoder->protected_->loose_mid_side_stereo) { + if(encoder->private_->loose_mid_side_stereo_frame_count == 0) { + do_independent = true; + do_mid_side = true; + } + else { + do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT); + do_mid_side = !do_independent; + } + } + else { + do_independent = true; + do_mid_side = true; + } + } + else { + do_independent = true; + do_mid_side = false; + } + + FLAC__ASSERT(do_independent || do_mid_side); + + /* + * Check for wasted bits; set effective bps for each subframe + */ + if(do_independent) { + for(channel = 0; channel < encoder->protected_->channels; channel++) { + const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize); + encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w; + encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w; + } + } + if(do_mid_side) { + FLAC__ASSERT(encoder->protected_->channels == 2); + for(channel = 0; channel < 2; channel++) { + const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize); + encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w; + encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1); + } + } + + /* + * First do a normal encoding pass of each independent channel + */ + if(do_independent) { + for(channel = 0; channel < encoder->protected_->channels; channel++) { + if(! + process_subframe_( + encoder, + min_partition_order, + max_partition_order, + &frame_header, + encoder->private_->subframe_bps[channel], + encoder->private_->integer_signal[channel], + encoder->private_->subframe_workspace_ptr[channel], + encoder->private_->partitioned_rice_contents_workspace_ptr[channel], + encoder->private_->residual_workspace[channel], + encoder->private_->best_subframe+channel, + encoder->private_->best_subframe_bits+channel + ) + ) + return false; + } + } + + /* + * Now do mid and side channels if requested + */ + if(do_mid_side) { + FLAC__ASSERT(encoder->protected_->channels == 2); + + for(channel = 0; channel < 2; channel++) { + if(! + process_subframe_( + encoder, + min_partition_order, + max_partition_order, + &frame_header, + encoder->private_->subframe_bps_mid_side[channel], + encoder->private_->integer_signal_mid_side[channel], + encoder->private_->subframe_workspace_ptr_mid_side[channel], + encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel], + encoder->private_->residual_workspace_mid_side[channel], + encoder->private_->best_subframe_mid_side+channel, + encoder->private_->best_subframe_bits_mid_side+channel + ) + ) + return false; + } + } + + /* + * Compose the frame bitbuffer + */ + if(do_mid_side) { + unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */ + FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */ + FLAC__ChannelAssignment channel_assignment; + + FLAC__ASSERT(encoder->protected_->channels == 2); + + if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) { + channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE); + } + else { + unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */ + unsigned min_bits; + int ca; + + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT == 0); + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE == 1); + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE == 2); + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_MID_SIDE == 3); + FLAC__ASSERT(do_independent && do_mid_side); + + /* We have to figure out which channel assignent results in the smallest frame */ + bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits [1]; + bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE ] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits_mid_side[1]; + bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits [1] + encoder->private_->best_subframe_bits_mid_side[1]; + bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1]; + + channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; + min_bits = bits[channel_assignment]; + for(ca = 1; ca <= 3; ca++) { + if(bits[ca] < min_bits) { + min_bits = bits[ca]; + channel_assignment = (FLAC__ChannelAssignment)ca; + } + } + } + + frame_header.channel_assignment = channel_assignment; + + if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + + switch(channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; + right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; + right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + left_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; + right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]]; + right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; + break; + default: + FLAC__ASSERT(0); + } + + switch(channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + left_bps = encoder->private_->subframe_bps [0]; + right_bps = encoder->private_->subframe_bps [1]; + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + left_bps = encoder->private_->subframe_bps [0]; + right_bps = encoder->private_->subframe_bps_mid_side[1]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + left_bps = encoder->private_->subframe_bps_mid_side[1]; + right_bps = encoder->private_->subframe_bps [1]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + left_bps = encoder->private_->subframe_bps_mid_side[0]; + right_bps = encoder->private_->subframe_bps_mid_side[1]; + break; + default: + FLAC__ASSERT(0); + } + + /* note that encoder_add_subframe_ sets the state for us in case of an error */ + if(!add_subframe_(encoder, frame_header.blocksize, left_bps , left_subframe , encoder->private_->frame)) + return false; + if(!add_subframe_(encoder, frame_header.blocksize, right_bps, right_subframe, encoder->private_->frame)) + return false; + } + else { + if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + + for(channel = 0; channel < encoder->protected_->channels; channel++) { + if(!add_subframe_(encoder, frame_header.blocksize, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) { + /* the above function sets the state for us in case of an error */ + return false; + } + } + } + + if(encoder->protected_->loose_mid_side_stereo) { + encoder->private_->loose_mid_side_stereo_frame_count++; + if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames) + encoder->private_->loose_mid_side_stereo_frame_count = 0; + } + + encoder->private_->last_channel_assignment = frame_header.channel_assignment; + + return true; +} + +FLAC__bool process_subframe_( + FLAC__StreamEncoder *encoder, + unsigned min_partition_order, + unsigned max_partition_order, + const FLAC__FrameHeader *frame_header, + unsigned subframe_bps, + const FLAC__int32 integer_signal[], + FLAC__Subframe *subframe[2], + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], + FLAC__int32 *residual[2], + unsigned *best_subframe, + unsigned *best_bits +) +{ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; +#else + FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; +#endif +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__double lpc_residual_bits_per_sample; + FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm routines need all the space */ + FLAC__double lpc_error[FLAC__MAX_LPC_ORDER]; + unsigned min_lpc_order, max_lpc_order, lpc_order; + unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision; +#endif + unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order; + unsigned rice_parameter; + unsigned _candidate_bits, _best_bits; + unsigned _best_subframe; + /* only use RICE2 partitions if stream bps > 16 */ + const unsigned rice_parameter_limit = FLAC__stream_encoder_get_bits_per_sample(encoder) > 16? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + FLAC__ASSERT(frame_header->blocksize > 0); + + /* verbatim subframe is the baseline against which we measure other compressed subframes */ + _best_subframe = 0; + if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) + _best_bits = UINT_MAX; + else + _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); + + if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) { + unsigned signal_is_constant = false; + guess_fixed_order = encoder->private_->local_fixed_compute_best_predictor(integer_signal+FLAC__MAX_FIXED_ORDER, frame_header->blocksize-FLAC__MAX_FIXED_ORDER, fixed_residual_bits_per_sample); + /* check for constant subframe */ + if( + !encoder->private_->disable_constant_subframes && +#ifndef FLAC__INTEGER_ONLY_LIBRARY + fixed_residual_bits_per_sample[1] == 0.0 +#else + fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO +#endif + ) { + /* the above means it's possible all samples are the same value; now double-check it: */ + unsigned i; + signal_is_constant = true; + for(i = 1; i < frame_header->blocksize; i++) { + if(integer_signal[0] != integer_signal[i]) { + signal_is_constant = false; + break; + } + } + } + if(signal_is_constant) { + _candidate_bits = evaluate_constant_subframe_(encoder, integer_signal[0], frame_header->blocksize, subframe_bps, subframe[!_best_subframe]); + if(_candidate_bits < _best_bits) { + _best_subframe = !_best_subframe; + _best_bits = _candidate_bits; + } + } + else { + if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) { + /* encode fixed */ + if(encoder->protected_->do_exhaustive_model_search) { + min_fixed_order = 0; + max_fixed_order = FLAC__MAX_FIXED_ORDER; + } + else { + min_fixed_order = max_fixed_order = guess_fixed_order; + } + if(max_fixed_order >= frame_header->blocksize) + max_fixed_order = frame_header->blocksize - 1; + for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) { +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps) + continue; /* don't even try */ + rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > 0.0)? (unsigned)(fixed_residual_bits_per_sample[fixed_order]+0.5) : 0; /* 0.5 is for rounding */ +#else + if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps) + continue; /* don't even try */ + rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */ +#endif + rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ + if(rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, rice_parameter_limit - 1); +#endif + rice_parameter = rice_parameter_limit - 1; + } + _candidate_bits = + evaluate_fixed_subframe_( + encoder, + integer_signal, + residual[!_best_subframe], + encoder->private_->abs_residual_partition_sums, + encoder->private_->raw_bits_per_partition, + frame_header->blocksize, + subframe_bps, + fixed_order, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + encoder->protected_->do_escape_coding, + encoder->protected_->rice_parameter_search_dist, + subframe[!_best_subframe], + partitioned_rice_contents[!_best_subframe] + ); + if(_candidate_bits < _best_bits) { + _best_subframe = !_best_subframe; + _best_bits = _candidate_bits; + } + } + } + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + /* encode lpc */ + if(encoder->protected_->max_lpc_order > 0) { + if(encoder->protected_->max_lpc_order >= frame_header->blocksize) + max_lpc_order = frame_header->blocksize-1; + else + max_lpc_order = encoder->protected_->max_lpc_order; + if(max_lpc_order > 0) { + unsigned a; + for (a = 0; a < encoder->protected_->num_apodizations; a++) { + FLAC__lpc_window_data(integer_signal, encoder->private_->window[a], encoder->private_->windowed_signal, frame_header->blocksize); + encoder->private_->local_lpc_compute_autocorrelation(encoder->private_->windowed_signal, frame_header->blocksize, max_lpc_order+1, autoc); + /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */ + if(autoc[0] != 0.0) { + FLAC__lpc_compute_lp_coefficients(autoc, &max_lpc_order, encoder->private_->lp_coeff, lpc_error); + if(encoder->protected_->do_exhaustive_model_search) { + min_lpc_order = 1; + } + else { + const unsigned guess_lpc_order = + FLAC__lpc_compute_best_order( + lpc_error, + max_lpc_order, + frame_header->blocksize, + subframe_bps + ( + encoder->protected_->do_qlp_coeff_prec_search? + FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */ + encoder->protected_->qlp_coeff_precision + ) + ); + min_lpc_order = max_lpc_order = guess_lpc_order; + } + if(max_lpc_order >= frame_header->blocksize) + max_lpc_order = frame_header->blocksize - 1; + for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) { + lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order); + if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps) + continue; /* don't even try */ + rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */ + rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ + if(rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, rice_parameter_limit - 1); +#endif + rice_parameter = rice_parameter_limit - 1; + } + if(encoder->protected_->do_qlp_coeff_prec_search) { + min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; + /* try to ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */ + if(subframe_bps <= 17) { + max_qlp_coeff_precision = flac_min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION); + max_qlp_coeff_precision = flac_max(max_qlp_coeff_precision, min_qlp_coeff_precision); + } + else + max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; + } + else { + min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision; + } + for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) { + _candidate_bits = + evaluate_lpc_subframe_( + encoder, + integer_signal, + residual[!_best_subframe], + encoder->private_->abs_residual_partition_sums, + encoder->private_->raw_bits_per_partition, + encoder->private_->lp_coeff[lpc_order-1], + frame_header->blocksize, + subframe_bps, + lpc_order, + qlp_coeff_precision, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + encoder->protected_->do_escape_coding, + encoder->protected_->rice_parameter_search_dist, + subframe[!_best_subframe], + partitioned_rice_contents[!_best_subframe] + ); + if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */ + if(_candidate_bits < _best_bits) { + _best_subframe = !_best_subframe; + _best_bits = _candidate_bits; + } + } + } + } + } + } + } + } +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + } + } + + /* under rare circumstances this can happen when all but lpc subframe types are disabled: */ + if(_best_bits == UINT_MAX) { + FLAC__ASSERT(_best_subframe == 0); + _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); + } + + *best_subframe = _best_subframe; + *best_bits = _best_bits; + + return true; +} + +FLAC__bool add_subframe_( + FLAC__StreamEncoder *encoder, + unsigned blocksize, + unsigned subframe_bps, + const FLAC__Subframe *subframe, + FLAC__BitWriter *frame +) +{ + switch(subframe->type) { + case FLAC__SUBFRAME_TYPE_CONSTANT: + if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + case FLAC__SUBFRAME_TYPE_FIXED: + if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + case FLAC__SUBFRAME_TYPE_LPC: + if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + case FLAC__SUBFRAME_TYPE_VERBATIM: + if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), blocksize, subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + default: + FLAC__ASSERT(0); + } + + return true; +} + +#define SPOTCHECK_ESTIMATE 0 +#if SPOTCHECK_ESTIMATE +static void spotcheck_subframe_estimate_( + FLAC__StreamEncoder *encoder, + unsigned blocksize, + unsigned subframe_bps, + const FLAC__Subframe *subframe, + unsigned estimate +) +{ + FLAC__bool ret; + FLAC__BitWriter *frame = FLAC__bitwriter_new(); + if(frame == 0) { + fprintf(stderr, "EST: can't allocate frame\n"); + return; + } + if(!FLAC__bitwriter_init(frame)) { + fprintf(stderr, "EST: can't init frame\n"); + return; + } + ret = add_subframe_(encoder, blocksize, subframe_bps, subframe, frame); + FLAC__ASSERT(ret); + { + const unsigned actual = FLAC__bitwriter_get_input_bits_unconsumed(frame); + if(estimate != actual) + fprintf(stderr, "EST: bad, frame#%u sub#%%d type=%8s est=%u, actual=%u, delta=%d\n", encoder->private_->current_frame_number, FLAC__SubframeTypeString[subframe->type], estimate, actual, (int)actual-(int)estimate); + } + FLAC__bitwriter_delete(frame); +} +#endif + +unsigned evaluate_constant_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal, + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +) +{ + unsigned estimate; + subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT; + subframe->data.constant.value = signal; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + subframe_bps; + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#else + (void)encoder, (void)blocksize; +#endif + + return estimate; +} + +unsigned evaluate_fixed_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +) +{ + unsigned i, residual_bits, estimate; + const unsigned residual_samples = blocksize - order; + + FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual); + + subframe->type = FLAC__SUBFRAME_TYPE_FIXED; + + subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; + subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; + subframe->data.fixed.residual = residual; + + residual_bits = + find_best_partition_order_( + encoder->private_, + residual, + abs_residual_partition_sums, + raw_bits_per_partition, + residual_samples, + order, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + subframe_bps, + do_escape_coding, + rice_parameter_search_dist, + &subframe->data.fixed.entropy_coding_method + ); + + subframe->data.fixed.order = order; + for(i = 0; i < order; i++) + subframe->data.fixed.warmup[i] = signal[i]; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (order * subframe_bps) + residual_bits; + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#endif + + return estimate; +} + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned evaluate_lpc_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + const FLAC__real lp_coeff[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned qlp_coeff_precision, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +) +{ + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + unsigned i, residual_bits, estimate; + int quantization, ret; + const unsigned residual_samples = blocksize - order; + + /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ + if(subframe_bps <= 16) { + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER); + qlp_coeff_precision = flac_min(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order)); + } + + ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization); + if(ret != 0) + return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */ + + if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) + if(subframe_bps <= 16 && qlp_coeff_precision <= 16) + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); + else + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual); + else + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); + + subframe->type = FLAC__SUBFRAME_TYPE_LPC; + + subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; + subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; + subframe->data.lpc.residual = residual; + + residual_bits = + find_best_partition_order_( + encoder->private_, + residual, + abs_residual_partition_sums, + raw_bits_per_partition, + residual_samples, + order, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + subframe_bps, + do_escape_coding, + rice_parameter_search_dist, + &subframe->data.lpc.entropy_coding_method + ); + + subframe->data.lpc.order = order; + subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision; + subframe->data.lpc.quantization_level = quantization; + memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER); + for(i = 0; i < order; i++) + subframe->data.lpc.warmup[i] = signal[i]; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits; + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#endif + + return estimate; +} +#endif + +unsigned evaluate_verbatim_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +) +{ + unsigned estimate; + + subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM; + + subframe->data.verbatim.data = signal; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (blocksize * subframe_bps); + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#else + (void)encoder; +#endif + + return estimate; +} + +unsigned find_best_partition_order_( + FLAC__StreamEncoderPrivate *private_, + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__EntropyCodingMethod *best_ecm +) +{ + unsigned residual_bits, best_residual_bits = 0; + unsigned best_parameters_index = 0; + unsigned best_partition_order = 0; + const unsigned blocksize = residual_samples + predictor_order; + + max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order); + min_partition_order = flac_min(min_partition_order, max_partition_order); + + precompute_partition_info_sums_(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); + + if(do_escape_coding) + precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order); + + { + int partition_order; + unsigned sum; + + for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) { + if(! + set_partitioned_rice_( +#ifdef EXACT_RICE_BITS_CALCULATION + residual, +#endif + abs_residual_partition_sums+sum, + raw_bits_per_partition+sum, + residual_samples, + predictor_order, + rice_parameter, + rice_parameter_limit, + rice_parameter_search_dist, + (unsigned)partition_order, + do_escape_coding, + &private_->partitioned_rice_contents_extra[!best_parameters_index], + &residual_bits + ) + ) + { + FLAC__ASSERT(best_residual_bits != 0); + break; + } + sum += 1u << partition_order; + if(best_residual_bits == 0 || residual_bits < best_residual_bits) { + best_residual_bits = residual_bits; + best_parameters_index = !best_parameters_index; + best_partition_order = partition_order; + } + } + } + + best_ecm->data.partitioned_rice.order = best_partition_order; + + { + /* + * We are allowed to de-const the pointer based on our special + * knowledge; it is const to the outside world. + */ + FLAC__EntropyCodingMethod_PartitionedRiceContents* prc = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_ecm->data.partitioned_rice.contents; + unsigned partition; + + /* save best parameters and raw_bits */ + FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(prc, flac_max(6u, best_partition_order)); + memcpy(prc->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partition_order))); + if(do_escape_coding) + memcpy(prc->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partition_order))); + /* + * Now need to check if the type should be changed to + * FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 based on the + * size of the rice parameters. + */ + for(partition = 0; partition < (1u<parameters[partition] >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { + best_ecm->type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2; + break; + } + } + } + + return best_residual_bits; +} + +#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM +extern void precompute_partition_info_sums_32bit_asm_ia32_( + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned blocksize, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order +); +#endif + +void precompute_partition_info_sums_( + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps +) +{ + const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; + unsigned partitions = 1u << max_partition_order; + + FLAC__ASSERT(default_partition_samples > predictor_order); + +#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM + /* slightly pessimistic but still catches all common cases */ + /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ + if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { + precompute_partition_info_sums_32bit_asm_ia32_(residual, abs_residual_partition_sums, residual_samples + predictor_order, predictor_order, min_partition_order, max_partition_order); + return; + } +#endif + + /* first do max_partition_order */ + { + unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); + /* slightly pessimistic but still catches all common cases */ + /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ + if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { + FLAC__uint32 abs_residual_partition_sum; + + for(partition = residual_sample = 0; partition < partitions; partition++) { + end += default_partition_samples; + abs_residual_partition_sum = 0; + for( ; residual_sample < end; residual_sample++) + abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ + abs_residual_partition_sums[partition] = abs_residual_partition_sum; + } + } + else { /* have to pessimistically use 64 bits for accumulator */ + FLAC__uint64 abs_residual_partition_sum; + + for(partition = residual_sample = 0; partition < partitions; partition++) { + end += default_partition_samples; + abs_residual_partition_sum = 0; + for( ; residual_sample < end; residual_sample++) + abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ + abs_residual_partition_sums[partition] = abs_residual_partition_sum; + } + } + } + + /* now merge partitions for lower orders */ + { + unsigned from_partition = 0, to_partition = partitions; + int partition_order; + for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { + unsigned i; + partitions >>= 1; + for(i = 0; i < partitions; i++) { + abs_residual_partition_sums[to_partition++] = + abs_residual_partition_sums[from_partition ] + + abs_residual_partition_sums[from_partition+1]; + from_partition += 2; + } + } + } +} + +void precompute_partition_info_escapes_( + const FLAC__int32 residual[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order +) +{ + int partition_order; + unsigned from_partition, to_partition = 0; + const unsigned blocksize = residual_samples + predictor_order; + + /* first do max_partition_order */ + for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) { + FLAC__int32 r; + FLAC__uint32 rmax; + unsigned partition, partition_sample, partition_samples, residual_sample; + const unsigned partitions = 1u << partition_order; + const unsigned default_partition_samples = blocksize >> partition_order; + + FLAC__ASSERT(default_partition_samples > predictor_order); + + for(partition = residual_sample = 0; partition < partitions; partition++) { + partition_samples = default_partition_samples; + if(partition == 0) + partition_samples -= predictor_order; + rmax = 0; + for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) { + r = residual[residual_sample++]; + /* OPT: maybe faster: rmax |= r ^ (r>>31) */ + if(r < 0) + rmax |= ~r; + else + rmax |= r; + } + /* now we know all residual values are in the range [-rmax-1,rmax] */ + raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1; + } + to_partition = partitions; + break; /*@@@ yuck, should remove the 'for' loop instead */ + } + + /* now merge partitions for lower orders */ + for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) { + unsigned m; + unsigned i; + const unsigned partitions = 1u << partition_order; + for(i = 0; i < partitions; i++) { + m = raw_bits_per_partition[from_partition]; + from_partition++; + raw_bits_per_partition[to_partition] = flac_max(m, raw_bits_per_partition[from_partition]); + from_partition++; + to_partition++; + } + } +} + +#ifdef EXACT_RICE_BITS_CALCULATION +static inline unsigned count_rice_bits_in_partition_( + const unsigned rice_parameter, + const unsigned partition_samples, + const FLAC__int32 *residual +) +{ + unsigned i, partition_bits = + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ + (1+rice_parameter) * partition_samples /* 1 for unary stop bit + rice_parameter for the binary portion */ + ; + for(i = 0; i < partition_samples; i++) + partition_bits += ( (FLAC__uint32)((residual[i]<<1)^(residual[i]>>31)) >> rice_parameter ); + return partition_bits; +} +#else +static inline unsigned count_rice_bits_in_partition_( + const unsigned rice_parameter, + const unsigned partition_samples, + const FLAC__uint64 abs_residual_partition_sum +) +{ + return + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ + (1+rice_parameter) * partition_samples + /* 1 for unary stop bit + rice_parameter for the binary portion */ + ( + rice_parameter? + (unsigned)(abs_residual_partition_sum >> (rice_parameter-1)) /* rice_parameter-1 because the real coder sign-folds instead of using a sign bit */ + : (unsigned)(abs_residual_partition_sum << 1) /* can't shift by negative number, so reverse */ + ) + - (partition_samples >> 1) + /* -(partition_samples>>1) to subtract out extra contributions to the abs_residual_partition_sum. + * The actual number of bits used is closer to the sum(for all i in the partition) of abs(residual[i])>>(rice_parameter-1) + * By using the abs_residual_partition sum, we also add in bits in the LSBs that would normally be shifted out. + * So the subtraction term tries to guess how many extra bits were contributed. + * If the LSBs are randomly distributed, this should average to 0.5 extra bits per sample. + */ + ; +} +#endif + +FLAC__bool set_partitioned_rice_( +#ifdef EXACT_RICE_BITS_CALCULATION + const FLAC__int32 residual[], +#endif + const FLAC__uint64 abs_residual_partition_sums[], + const unsigned raw_bits_per_partition[], + const unsigned residual_samples, + const unsigned predictor_order, + const unsigned suggested_rice_parameter, + const unsigned rice_parameter_limit, + const unsigned rice_parameter_search_dist, + const unsigned partition_order, + const FLAC__bool search_for_escapes, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, + unsigned *bits +) +{ + unsigned rice_parameter, partition_bits; + unsigned best_partition_bits, best_rice_parameter = 0; + unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; + unsigned *parameters, *raw_bits; +#ifdef ENABLE_RICE_PARAMETER_SEARCH + unsigned min_rice_parameter, max_rice_parameter; +#else + (void)rice_parameter_search_dist; +#endif + + FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); + FLAC__ASSERT(rice_parameter_limit <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); + + FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order)); + parameters = partitioned_rice_contents->parameters; + raw_bits = partitioned_rice_contents->raw_bits; + + if(partition_order == 0) { + best_partition_bits = (unsigned)(-1); +#ifdef ENABLE_RICE_PARAMETER_SEARCH + if(rice_parameter_search_dist) { + if(suggested_rice_parameter < rice_parameter_search_dist) + min_rice_parameter = 0; + else + min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist; + max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist; + if(max_rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, rice_parameter_limit - 1); +#endif + max_rice_parameter = rice_parameter_limit - 1; + } + } + else + min_rice_parameter = max_rice_parameter = suggested_rice_parameter; + + for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { +#else + rice_parameter = suggested_rice_parameter; +#endif +#ifdef EXACT_RICE_BITS_CALCULATION + partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, residual); +#else + partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, abs_residual_partition_sums[0]); +#endif + if(partition_bits < best_partition_bits) { + best_rice_parameter = rice_parameter; + best_partition_bits = partition_bits; + } +#ifdef ENABLE_RICE_PARAMETER_SEARCH + } +#endif + if(search_for_escapes) { + partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples; + if(partition_bits <= best_partition_bits) { + raw_bits[0] = raw_bits_per_partition[0]; + best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ + best_partition_bits = partition_bits; + } + else + raw_bits[0] = 0; + } + parameters[0] = best_rice_parameter; + bits_ += best_partition_bits; + } + else { + unsigned partition, residual_sample; + unsigned partition_samples; + FLAC__uint64 mean, k; + const unsigned partitions = 1u << partition_order; + for(partition = residual_sample = 0; partition < partitions; partition++) { + partition_samples = (residual_samples+predictor_order) >> partition_order; + if(partition == 0) { + if(partition_samples <= predictor_order) + return false; + else + partition_samples -= predictor_order; + } + mean = abs_residual_partition_sums[partition]; + /* we are basically calculating the size in bits of the + * average residual magnitude in the partition: + * rice_parameter = floor(log2(mean/partition_samples)) + * 'mean' is not a good name for the variable, it is + * actually the sum of magnitudes of all residual values + * in the partition, so the actual mean is + * mean/partition_samples + */ + for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) + ; + if(rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); +#endif + rice_parameter = rice_parameter_limit - 1; + } + + best_partition_bits = (unsigned)(-1); +#ifdef ENABLE_RICE_PARAMETER_SEARCH + if(rice_parameter_search_dist) { + if(rice_parameter < rice_parameter_search_dist) + min_rice_parameter = 0; + else + min_rice_parameter = rice_parameter - rice_parameter_search_dist; + max_rice_parameter = rice_parameter + rice_parameter_search_dist; + if(max_rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, rice_parameter_limit - 1); +#endif + max_rice_parameter = rice_parameter_limit - 1; + } + } + else + min_rice_parameter = max_rice_parameter = rice_parameter; + + for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { +#endif +#ifdef EXACT_RICE_BITS_CALCULATION + partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, residual+residual_sample); +#else + partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, abs_residual_partition_sums[partition]); +#endif + if(partition_bits < best_partition_bits) { + best_rice_parameter = rice_parameter; + best_partition_bits = partition_bits; + } +#ifdef ENABLE_RICE_PARAMETER_SEARCH + } +#endif + if(search_for_escapes) { + partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples; + if(partition_bits <= best_partition_bits) { + raw_bits[partition] = raw_bits_per_partition[partition]; + best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ + best_partition_bits = partition_bits; + } + else + raw_bits[partition] = 0; + } + parameters[partition] = best_rice_parameter; + bits_ += best_partition_bits; + residual_sample += partition_samples; + } + } + + *bits = bits_; + return true; +} + +unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples) +{ + unsigned i, shift; + FLAC__int32 x = 0; + + for(i = 0; i < samples && !(x&1); i++) + x |= signal[i]; + + if(x == 0) { + shift = 0; + } + else { + for(shift = 0; !(x&1); shift++) + x >>= 1; + } + + if(shift > 0) { + for(i = 0; i < samples; i++) + signal[i] >>= shift; + } + + return shift; +} + +void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples) +{ + unsigned channel; + + for(channel = 0; channel < channels; channel++) + memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples); + + fifo->tail += wide_samples; + + FLAC__ASSERT(fifo->tail <= fifo->size); +} + +void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples) +{ + unsigned channel; + unsigned sample, wide_sample; + unsigned tail = fifo->tail; + + sample = input_offset * channels; + for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) { + for(channel = 0; channel < channels; channel++) + fifo->data[channel][tail] = input[sample++]; + tail++; + } + fifo->tail = tail; + + FLAC__ASSERT(fifo->tail <= fifo->size); +} + +FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; + const size_t encoded_bytes = encoder->private_->verify.output.bytes; + (void)decoder; + + if(encoder->private_->verify.needs_magic_hack) { + FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH); + *bytes = FLAC__STREAM_SYNC_LENGTH; + memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes); + encoder->private_->verify.needs_magic_hack = false; + } + else { + if(encoded_bytes == 0) { + /* + * If we get here, a FIFO underflow has occurred, + * which means there is a bug somewhere. + */ + FLAC__ASSERT(0); + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + else if(encoded_bytes < *bytes) + *bytes = encoded_bytes; + memcpy(buffer, encoder->private_->verify.output.data, *bytes); + encoder->private_->verify.output.data += *bytes; + encoder->private_->verify.output.bytes -= *bytes; + } + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + +FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +{ + FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data; + unsigned channel; + const unsigned channels = frame->header.channels; + const unsigned blocksize = frame->header.blocksize; + const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize; + + (void)decoder; + + for(channel = 0; channel < channels; channel++) { + if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) { + unsigned i, sample = 0; + FLAC__int32 expect = 0, got = 0; + + for(i = 0; i < blocksize; i++) { + if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) { + sample = i; + expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i]; + got = (FLAC__int32)buffer[channel][i]; + break; + } + } + FLAC__ASSERT(i < blocksize); + FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample; + encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize); + encoder->private_->verify.error_stats.channel = channel; + encoder->private_->verify.error_stats.sample = sample; + encoder->private_->verify.error_stats.expected = expect; + encoder->private_->verify.error_stats.got = got; + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + } + /* dequeue the frame from the fifo */ + encoder->private_->verify.input_fifo.tail -= blocksize; + FLAC__ASSERT(encoder->private_->verify.input_fifo.tail <= OVERREAD_); + for(channel = 0; channel < channels; channel++) + memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail * sizeof(encoder->private_->verify.input_fifo.data[0][0])); + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + (void)decoder, (void)metadata, (void)client_data; +} + +void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ + FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; + (void)decoder, (void)status; + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; +} + +#if 0 +FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + (void)client_data; + + *bytes = fread(buffer, 1, *bytes, encoder->private_->file); + if (*bytes == 0) { + if (feof(encoder->private_->file)) + return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; + else if (ferror(encoder->private_->file)) + return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; + } + return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; +} + +FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + (void)client_data; + + if(fseeko(encoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) + return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; + else + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; +} + +FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + FLAC__off_t offset; + + (void)client_data; + + offset = ftello(encoder->private_->file); + + if(offset < 0) { + return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; + } + else { + *absolute_byte_offset = (FLAC__uint64)offset; + return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + } +} + +#ifdef FLAC__VALGRIND_TESTING +static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + size_t ret = fwrite(ptr, size, nmemb, stream); + if(!ferror(stream)) + fflush(stream); + return ret; +} +#else +#define local__fwrite fwrite +#endif + +FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) +{ + (void)client_data, (void)current_frame; + + if(local__fwrite(buffer, sizeof(FLAC__byte), bytes, encoder->private_->file) == bytes) { + FLAC__bool call_it = 0 != encoder->private_->progress_callback && ( +#if FLAC__HAS_OGG + /* We would like to be able to use 'samples > 0' in the + * clause here but currently because of the nature of our + * Ogg writing implementation, 'samples' is always 0 (see + * ogg_encoder_aspect.c). The downside is extra progress + * callbacks. + */ + encoder->private_->is_ogg? true : +#endif + samples > 0 + ); + if(call_it) { + /* NOTE: We have to add +bytes, +samples, and +1 to the stats + * because at this point in the callback chain, the stats + * have not been updated. Only after we return and control + * gets back to write_frame_() are the stats updated + */ + encoder->private_->progress_callback(encoder, encoder->private_->bytes_written+bytes, encoder->private_->samples_written+samples, encoder->private_->frames_written+(samples?1:0), encoder->private_->total_frames_estimate, encoder->private_->client_data); + } + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; + } + else + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; +} + +/* + * This will forcibly set stdout to binary mode (for OSes that require it) + */ +FILE *get_binary_stdout_(void) +{ + /* if something breaks here it is probably due to the presence or + * absence of an underscore before the identifiers 'setmode', + * 'fileno', and/or 'O_BINARY'; check your system header files. + */ +#if defined _MSC_VER || defined __MINGW32__ + _setmode(_fileno(stdout), _O_BINARY); +#elif defined __CYGWIN__ + /* almost certainly not needed for any modern Cygwin, but let's be safe... */ + setmode(_fileno(stdout), _O_BINARY); +#elif defined __EMX__ + setmode(fileno(stdout), O_BINARY); +#endif + + return stdout; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c new file mode 100644 index 0000000000..41efca5ef5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c @@ -0,0 +1,549 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include /* for strlen() */ +#include "include/private/stream_encoder_framing.h" +#include "include/private/crc.h" +#include "../assert.h" + +static FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method); +static FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended); + +FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw) +{ + unsigned i, j; + const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING); + + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->is_last, FLAC__STREAM_METADATA_IS_LAST_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->type, FLAC__STREAM_METADATA_TYPE_LEN)) + return false; + + /* + * First, for VORBIS_COMMENTs, adjust the length to reflect our vendor string + */ + i = metadata->length; + if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { + FLAC__ASSERT(metadata->data.vorbis_comment.vendor_string.length == 0 || 0 != metadata->data.vorbis_comment.vendor_string.entry); + i -= metadata->data.vorbis_comment.vendor_string.length; + i += vendor_string_length; + } + FLAC__ASSERT(i < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, i, FLAC__STREAM_METADATA_LENGTH_LEN)) + return false; + + switch(metadata->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + FLAC__ASSERT(metadata->data.stream_info.min_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.max_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.min_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_framesize, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.max_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_framesize, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) + return false; + FLAC__ASSERT(FLAC__format_sample_rate_is_valid(metadata->data.stream_info.sample_rate)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.sample_rate, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.channels > 0); + FLAC__ASSERT(metadata->data.stream_info.channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.channels-1, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.bits_per_sample > 0); + FLAC__ASSERT(metadata->data.stream_info.bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.bits_per_sample-1, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.stream_info.md5sum, 16)) + return false; + break; + case FLAC__METADATA_TYPE_PADDING: + if(!FLAC__bitwriter_write_zeroes(bw, metadata->length * 8)) + return false; + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.data, metadata->length - (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) + return false; + break; + case FLAC__METADATA_TYPE_SEEKTABLE: + for(i = 0; i < metadata->data.seek_table.num_points; i++) { + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].sample_number, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].stream_offset, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.seek_table.points[i].frame_samples, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) + return false; + } + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, vendor_string_length)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)FLAC__VENDOR_STRING, vendor_string_length)) + return false; + if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.num_comments)) + return false; + for(i = 0; i < metadata->data.vorbis_comment.num_comments; i++) { + if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.comments[i].length)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length)) + return false; + } + break; + case FLAC__METADATA_TYPE_CUESHEET: + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.cue_sheet.media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) + return false; + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.cue_sheet.lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.is_cd? 1 : 0, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) + return false; + if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.num_tracks, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) + return false; + for(i = 0; i < metadata->data.cue_sheet.num_tracks; i++) { + const FLAC__StreamMetadata_CueSheet_Track *track = metadata->data.cue_sheet.tracks + i; + + if(!FLAC__bitwriter_write_raw_uint64(bw, track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->number, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) + return false; + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->type, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->pre_emphasis, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) + return false; + if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->num_indices, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) + return false; + for(j = 0; j < track->num_indices; j++) { + const FLAC__StreamMetadata_CueSheet_Index *indx = track->indices + j; + + if(!FLAC__bitwriter_write_raw_uint64(bw, indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, indx->number, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) + return false; + if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) + return false; + } + } + break; + case FLAC__METADATA_TYPE_PICTURE: + { + size_t len; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.type, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) + return false; + len = strlen(metadata->data.picture.mime_type); + if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.picture.mime_type, len)) + return false; + len = strlen((const char *)metadata->data.picture.description); + if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.description, len)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.data_length, FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.data, metadata->data.picture.data_length)) + return false; + } + break; + default: + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.unknown.data, metadata->length)) + return false; + break; + } + + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); + return true; +} + +FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw) +{ + unsigned u, blocksize_hint, sample_rate_hint; + FLAC__byte crc; + + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_RESERVED_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, (header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER)? 0 : 1, FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN)) + return false; + + FLAC__ASSERT(header->blocksize > 0 && header->blocksize <= FLAC__MAX_BLOCK_SIZE); + /* when this assertion holds true, any legal blocksize can be expressed in the frame header */ + FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535u); + blocksize_hint = 0; + switch(header->blocksize) { + case 192: u = 1; break; + case 576: u = 2; break; + case 1152: u = 3; break; + case 2304: u = 4; break; + case 4608: u = 5; break; + case 256: u = 8; break; + case 512: u = 9; break; + case 1024: u = 10; break; + case 2048: u = 11; break; + case 4096: u = 12; break; + case 8192: u = 13; break; + case 16384: u = 14; break; + case 32768: u = 15; break; + default: + if(header->blocksize <= 0x100) + blocksize_hint = u = 6; + else + blocksize_hint = u = 7; + break; + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BLOCK_SIZE_LEN)) + return false; + + FLAC__ASSERT(FLAC__format_sample_rate_is_valid(header->sample_rate)); + sample_rate_hint = 0; + switch(header->sample_rate) { + case 88200: u = 1; break; + case 176400: u = 2; break; + case 192000: u = 3; break; + case 8000: u = 4; break; + case 16000: u = 5; break; + case 22050: u = 6; break; + case 24000: u = 7; break; + case 32000: u = 8; break; + case 44100: u = 9; break; + case 48000: u = 10; break; + case 96000: u = 11; break; + default: + if(header->sample_rate <= 255000 && header->sample_rate % 1000 == 0) + sample_rate_hint = u = 12; + else if(header->sample_rate % 10 == 0) + sample_rate_hint = u = 14; + else if(header->sample_rate <= 0xffff) + sample_rate_hint = u = 13; + else + u = 0; + break; + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_SAMPLE_RATE_LEN)) + return false; + + FLAC__ASSERT(header->channels > 0 && header->channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN) && header->channels <= FLAC__MAX_CHANNELS); + switch(header->channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + u = header->channels - 1; + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(header->channels == 2); + u = 8; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(header->channels == 2); + u = 9; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(header->channels == 2); + u = 10; + break; + default: + FLAC__ASSERT(0); + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN)) + return false; + + FLAC__ASSERT(header->bits_per_sample > 0 && header->bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); + switch(header->bits_per_sample) { + case 8 : u = 1; break; + case 12: u = 2; break; + case 16: u = 4; break; + case 20: u = 5; break; + case 24: u = 6; break; + default: u = 0; break; + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_ZERO_PAD_LEN)) + return false; + + if(header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { + if(!FLAC__bitwriter_write_utf8_uint32(bw, header->number.frame_number)) + return false; + } + else { + if(!FLAC__bitwriter_write_utf8_uint64(bw, header->number.sample_number)) + return false; + } + + if(blocksize_hint) + if(!FLAC__bitwriter_write_raw_uint32(bw, header->blocksize-1, (blocksize_hint==6)? 8:16)) + return false; + + switch(sample_rate_hint) { + case 12: + if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 1000, 8)) + return false; + break; + case 13: + if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate, 16)) + return false; + break; + case 14: + if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 10, 16)) + return false; + break; + } + + /* write the CRC */ + if(!FLAC__bitwriter_get_write_crc8(bw, &crc)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, crc, FLAC__FRAME_HEADER_CRC_LEN)) + return false; + + return true; +} + +FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + FLAC__bool ok; + + ok = + FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN) && + (wasted_bits? FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1) : true) && + FLAC__bitwriter_write_raw_int32(bw, subframe->value, subframe_bps) + ; + + return ok; +} + +FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + unsigned i; + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK | (subframe->order<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) + return false; + if(wasted_bits) + if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) + return false; + + for(i = 0; i < subframe->order; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) + return false; + + if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) + return false; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!add_residual_partitioned_rice_( + bw, + subframe->residual, + residual_samples, + subframe->order, + subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, + subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, + subframe->entropy_coding_method.data.partitioned_rice.order, + /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 + )) + return false; + break; + default: + FLAC__ASSERT(0); + } + + return true; +} + +FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + unsigned i; + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK | ((subframe->order-1)<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) + return false; + if(wasted_bits) + if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) + return false; + + for(i = 0; i < subframe->order; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, subframe->qlp_coeff_precision-1, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->quantization_level, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) + return false; + for(i = 0; i < subframe->order; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->qlp_coeff[i], subframe->qlp_coeff_precision)) + return false; + + if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) + return false; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!add_residual_partitioned_rice_( + bw, + subframe->residual, + residual_samples, + subframe->order, + subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, + subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, + subframe->entropy_coding_method.data.partitioned_rice.order, + /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 + )) + return false; + break; + default: + FLAC__ASSERT(0); + } + + return true; +} + +FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + unsigned i; + const FLAC__int32 *signal = subframe->data; + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) + return false; + if(wasted_bits) + if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) + return false; + + for(i = 0; i < samples; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, signal[i], subframe_bps)) + return false; + + return true; +} + +FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method) +{ + if(!FLAC__bitwriter_write_raw_uint32(bw, method->type, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; + switch(method->type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitwriter_write_raw_uint32(bw, method->data.partitioned_rice.order, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; + break; + default: + FLAC__ASSERT(0); + } + return true; +} + +FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended) +{ + const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; + const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + if(partition_order == 0) { + unsigned i; + + if(raw_bits[0] == 0) { + if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[0], plen)) + return false; + if(!FLAC__bitwriter_write_rice_signed_block(bw, residual, residual_samples, rice_parameters[0])) + return false; + } + else { + FLAC__ASSERT(rice_parameters[0] == 0); + if(!FLAC__bitwriter_write_raw_uint32(bw, pesc, plen)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) + return false; + for(i = 0; i < residual_samples; i++) { + if(!FLAC__bitwriter_write_raw_int32(bw, residual[i], raw_bits[0])) + return false; + } + } + return true; + } + else { + unsigned i, j, k = 0, k_last = 0; + unsigned partition_samples; + const unsigned default_partition_samples = (residual_samples+predictor_order) >> partition_order; + for(i = 0; i < (1u< +#endif + +#include +#include "../assert.h" +#include "../format.h" +#include "include/private/window.h" + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#ifndef M_PI +/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ +#define M_PI 3.14159265358979323846 +#endif + + +void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + if (L & 1) { + for (n = 0; n <= N/2; n++) + window[n] = 2.0f * n / (float)N; + for (; n <= N; n++) + window[n] = 2.0f - 2.0f * n / (float)N; + } + else { + for (n = 0; n <= L/2-1; n++) + window[n] = 2.0f * n / (float)N; + for (; n <= N; n++) + window[n] = 2.0f - 2.0f * (N-n) / (float)N; + } +} + +void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.62f - 0.48f * fabs((float)n/(float)N+0.5f) + 0.38f * cos(2.0f * M_PI * ((float)n/(float)N+0.5f))); +} + +void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.42f - 0.5f * cos(2.0f * M_PI * n / N) + 0.08f * cos(4.0f * M_PI * n / N)); +} + +/* 4-term -92dB side-lobe */ +void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n <= N; n++) + window[n] = (FLAC__real)(0.35875f - 0.48829f * cos(2.0f * M_PI * n / N) + 0.14128f * cos(4.0f * M_PI * n / N) - 0.01168f * cos(6.0f * M_PI * n / N)); +} + +void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + double k = ((double)n - N2) / N2; + k = 1.0f - k * k; + window[n] = (FLAC__real)(k * k); + } +} + +void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(1.0f - 1.93f * cos(2.0f * M_PI * n / N) + 1.29f * cos(4.0f * M_PI * n / N) - 0.388f * cos(6.0f * M_PI * n / N) + 0.0322f * cos(8.0f * M_PI * n / N)); +} + +void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev) +{ + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + const double k = ((double)n - N2) / (stddev * N2); + window[n] = (FLAC__real)exp(-0.5f * k * k); + } +} + +void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.54f - 0.46f * cos(2.0f * M_PI * n / N)); +} + +void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(2.0f * M_PI * n / N)); +} + +void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.402f - 0.498f * cos(2.0f * M_PI * n / N) + 0.098f * cos(4.0f * M_PI * n / N) - 0.001f * cos(6.0f * M_PI * n / N)); +} + +void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.3635819f - 0.4891775f*cos(2.0f*M_PI*n/N) + 0.1365995f*cos(4.0f*M_PI*n/N) - 0.0106411f*cos(6.0f*M_PI*n/N)); +} + +void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L) +{ + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = 1.0f; +} + +void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) +{ + FLAC__int32 n; + + if (L & 1) { + for (n = 1; n <= L+1/2; n++) + window[n-1] = 2.0f * n / ((float)L + 1.0f); + for (; n <= L; n++) + window[n-1] = - (float)(2 * (L - n + 1)) / ((float)L + 1.0f); + } + else { + for (n = 1; n <= L/2; n++) + window[n-1] = 2.0f * n / (float)L; + for (; n <= L; n++) + window[n-1] = ((float)(2 * (L - n)) + 1.0f) / (float)L; + } +} + +void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p) +{ + if (p <= 0.0) + FLAC__window_rectangle(window, L); + else if (p >= 1.0) + FLAC__window_hann(window, L); + else { + const FLAC__int32 Np = (FLAC__int32)(p / 2.0f * L) - 1; + FLAC__int32 n; + /* start with rectangle... */ + FLAC__window_rectangle(window, L); + /* ...replace ends with hann */ + if (Np > 0) { + for (n = 0; n <= Np; n++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * n / Np)); + window[L-Np-1+n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * (n+Np) / Np)); + } + } + } +} + +void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + const double k = ((double)n - N2) / N2; + window[n] = (FLAC__real)(1.0f - k * k); + } +} + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h new file mode 100644 index 0000000000..18bf6d1946 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h @@ -0,0 +1,2182 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__METADATA_H +#define FLAC__METADATA_H + +#include /* for off_t */ +#include "export.h" +#include "callback.h" +#include "format.h" + +/* -------------------------------------------------------------------- + (For an example of how all these routines are used, see the source + code for the unit tests in src/test_libFLAC/metadata_*.c, or + metaflac in src/metaflac/) + ------------------------------------------------------------------*/ + +/** \file include/FLAC/metadata.h + * + * \brief + * This module provides functions for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in FLAC files. + * + * See the detailed documentation for each interface in the + * \link flac_metadata metadata \endlink module. + */ + +/** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces + * \ingroup flac + * + * \brief + * This module provides functions for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in native FLAC files. + * Note that currently only the Chain interface (level 2) supports Ogg + * FLAC files, and it is read-only i.e. no writing back changed + * metadata to file. + * + * There are three metadata interfaces of increasing complexity: + * + * Level 0: + * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and + * PICTURE blocks. + * + * Level 1: + * Read-write access to all metadata blocks. This level is write- + * efficient in most cases (more on this below), and uses less memory + * than level 2. + * + * Level 2: + * Read-write access to all metadata blocks. This level is write- + * efficient in all cases, but uses more memory since all metadata for + * the whole file is read into memory and manipulated before writing + * out again. + * + * What do we mean by efficient? Since FLAC metadata appears at the + * beginning of the file, when writing metadata back to a FLAC file + * it is possible to grow or shrink the metadata such that the entire + * file must be rewritten. However, if the size remains the same during + * changes or PADDING blocks are utilized, only the metadata needs to be + * overwritten, which is much faster. + * + * Efficient means the whole file is rewritten at most one time, and only + * when necessary. Level 1 is not efficient only in the case that you + * cause more than one metadata block to grow or shrink beyond what can + * be accomodated by padding. In this case you should probably use level + * 2, which allows you to edit all the metadata for a file in memory and + * write it out all at once. + * + * All levels know how to skip over and not disturb an ID3v2 tag at the + * front of the file. + * + * All levels access files via their filenames. In addition, level 2 + * has additional alternative read and write functions that take an I/O + * handle and callbacks, for situations where access by filename is not + * possible. + * + * In addition to the three interfaces, this module defines functions for + * creating and manipulating various metadata objects in memory. As we see + * from the Format module, FLAC metadata blocks in memory are very primitive + * structures for storing information in an efficient way. Reading + * information from the structures is easy but creating or modifying them + * directly is more complex. The metadata object routines here facilitate + * this by taking care of the consistency and memory management drudgery. + * + * Unless you will be using the level 1 or 2 interfaces to modify existing + * metadata however, you will not probably not need these. + * + * From a dependency standpoint, none of the encoders or decoders require + * the metadata module. This is so that embedded users can strip out the + * metadata module from libFLAC to reduce the size and complexity. + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface + * \ingroup flac_metadata + * + * \brief + * The level 0 interface consists of individual routines to read the + * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring + * only a filename. + * + * They try to skip any ID3v2 tag at the head of the file. + * + * \{ + */ + +/** Read the STREAMINFO metadata block of the given FLAC file. This function + * will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param streaminfo A pointer to space for the STREAMINFO block. Since + * FLAC__StreamMetadata is a simple structure with no + * memory allocation involved, you pass the address of + * an existing structure. It need not be initialized. + * \assert + * \code filename != NULL \endcode + * \code streaminfo != NULL \endcode + * \retval FLAC__bool + * \c true if a valid STREAMINFO block was read from \a filename. Returns + * \c false if there was a memory allocation error, a file decoder error, + * or the file contained no STREAMINFO block. (A memory allocation error + * is possible because this function must set up a file decoder.) + */ +FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); + +/** Read the VORBIS_COMMENT metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param tags The address where the returned pointer will be + * stored. The \a tags object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \assert + * \code filename != NULL \endcode + * \code tags != NULL \endcode + * \retval FLAC__bool + * \c true if a valid VORBIS_COMMENT block was read from \a filename, + * and \a *tags will be set to the address of the metadata structure. + * Returns \c false if there was a memory allocation error, a file + * decoder error, or the file contained no VORBIS_COMMENT block, and + * \a *tags will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); + +/** Read the CUESHEET metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param cuesheet The address where the returned pointer will be + * stored. The \a cuesheet object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \assert + * \code filename != NULL \endcode + * \code cuesheet != NULL \endcode + * \retval FLAC__bool + * \c true if a valid CUESHEET block was read from \a filename, + * and \a *cuesheet will be set to the address of the metadata + * structure. Returns \c false if there was a memory allocation + * error, a file decoder error, or the file contained no CUESHEET + * block, and \a *cuesheet will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); + +/** Read a PICTURE metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * Since there can be more than one PICTURE block in a file, this + * function takes a number of parameters that act as constraints to + * the search. The PICTURE block with the largest area matching all + * the constraints will be returned, or \a *picture will be set to + * \c NULL if there was no such block. + * + * \param filename The path to the FLAC file to read. + * \param picture The address where the returned pointer will be + * stored. The \a picture object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \param type The desired picture type. Use \c -1 to mean + * "any type". + * \param mime_type The desired MIME type, e.g. "image/jpeg". The + * string will be matched exactly. Use \c NULL to + * mean "any MIME type". + * \param description The desired description. The string will be + * matched exactly. Use \c NULL to mean "any + * description". + * \param max_width The maximum width in pixels desired. Use + * \c (unsigned)(-1) to mean "any width". + * \param max_height The maximum height in pixels desired. Use + * \c (unsigned)(-1) to mean "any height". + * \param max_depth The maximum color depth in bits-per-pixel desired. + * Use \c (unsigned)(-1) to mean "any depth". + * \param max_colors The maximum number of colors desired. Use + * \c (unsigned)(-1) to mean "any number of colors". + * \assert + * \code filename != NULL \endcode + * \code picture != NULL \endcode + * \retval FLAC__bool + * \c true if a valid PICTURE block was read from \a filename, + * and \a *picture will be set to the address of the metadata + * structure. Returns \c false if there was a memory allocation + * error, a file decoder error, or the file contained no PICTURE + * block, and \a *picture will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); + +/* \} */ + + +/** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface + * \ingroup flac_metadata + * + * \brief + * The level 1 interface provides read-write access to FLAC file metadata and + * operates directly on the FLAC file. + * + * The general usage of this interface is: + * + * - Create an iterator using FLAC__metadata_simple_iterator_new() + * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check + * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to + * see if the file is writable, or only read access is allowed. + * - Use FLAC__metadata_simple_iterator_next() and + * FLAC__metadata_simple_iterator_prev() to traverse the blocks. + * This is does not read the actual blocks themselves. + * FLAC__metadata_simple_iterator_next() is relatively fast. + * FLAC__metadata_simple_iterator_prev() is slower since it needs to search + * forward from the front of the file. + * - Use FLAC__metadata_simple_iterator_get_block_type() or + * FLAC__metadata_simple_iterator_get_block() to access the actual data at + * the current iterator position. The returned object is yours to modify + * and free. + * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block + * back. You must have write permission to the original file. Make sure to + * read the whole comment to FLAC__metadata_simple_iterator_set_block() + * below. + * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. + * Use the object creation functions from + * \link flac_metadata_object here \endlink to generate new objects. + * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block + * currently referred to by the iterator, or replace it with padding. + * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when + * finished. + * + * \note + * The FLAC file remains open the whole time between + * FLAC__metadata_simple_iterator_init() and + * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering + * the file during this time. + * + * \note + * Do not modify the \a is_last, \a length, or \a type fields of returned + * FLAC__StreamMetadata objects. These are managed automatically. + * + * \note + * If any of the modification functions + * (FLAC__metadata_simple_iterator_set_block(), + * FLAC__metadata_simple_iterator_delete_block(), + * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, + * you should delete the iterator as it may no longer be valid. + * + * \{ + */ + +struct FLAC__Metadata_SimpleIterator; +/** The opaque structure definition for the level 1 iterator type. + * See the + * \link flac_metadata_level1 metadata level 1 module \endlink + * for a detailed description. + */ +typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; + +/** Status type for FLAC__Metadata_SimpleIterator. + * + * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). + */ +typedef enum { + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, + /**< The iterator is in the normal OK state */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, + /**< The iterator could not open the target file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, + /**< The iterator could not find the FLAC signature at the start of the file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, + /**< The iterator tried to write to a file that was not writable */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, + /**< The iterator encountered input that does not conform to the FLAC metadata specification */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, + /**< The iterator encountered an error while reading the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, + /**< The iterator encountered an error while seeking in the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, + /**< The iterator encountered an error while writing the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, + /**< The iterator encountered an error renaming the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, + /**< The iterator encountered an error removing the temporary file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR + /**< The caller violated an assertion or an unexpected error occurred */ + +} FLAC__Metadata_SimpleIteratorStatus; + +/** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. + * + * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; + + +/** Create a new iterator instance. + * + * \retval FLAC__Metadata_SimpleIterator* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); + +/** Free an iterator instance. Deletes the object pointed to by \a iterator. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + */ +FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); + +/** Get the current status of the iterator. Call this after a function + * returns \c false to get the reason for the error. Also resets the status + * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + * \retval FLAC__Metadata_SimpleIteratorStatus + * The current status of the iterator. + */ +FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); + +/** Initialize the iterator to point to the first metadata block in the + * given FLAC file. + * + * \param iterator A pointer to an existing iterator. + * \param filename The path to the FLAC file. + * \param read_only If \c true, the FLAC file will be opened + * in read-only mode; if \c false, the FLAC + * file will be opened for edit even if no + * edits are performed. + * \param preserve_file_stats If \c true, the owner and modification + * time will be preserved even if the FLAC + * file is written to. + * \assert + * \code iterator != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c false if a memory allocation error occurs, the file can't be + * opened, or another error occurs, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); + +/** Returns \c true if the FLAC file is writable. If \c false, calls to + * FLAC__metadata_simple_iterator_set_block() and + * FLAC__metadata_simple_iterator_insert_block_after() will fail. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); + +/** Moves the iterator forward one metadata block, returning \c false if + * already at the end. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c false if already at the last metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); + +/** Moves the iterator backward one metadata block, returning \c false if + * already at the beginning. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c false if already at the first metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); + +/** Returns a flag telling if the current metadata block is the last. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the current metadata block is the last in the file, + * else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the offset of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval off_t + * The offset of the metadata block at the current iterator position. + * This is the byte offset relative to the beginning of the file of + * the current metadata block's header. + */ +FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the type of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__MetadataType + * The type of the metadata block at the current iterator position. + */ +FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the length of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval unsigned + * The length of the metadata block at the current iterator position. + * The is same length as that in the + * metadata block header, + * i.e. the length of the metadata body that follows the header. + */ +FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the application ID of the \c APPLICATION block at the current + * position. This avoids reading the actual block data which can save + * time for large blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \param id A pointer to a buffer of at least \c 4 bytes where + * the ID will be stored. + * \assert + * \code iterator != NULL \endcode + * \code id != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the ID was successfully read, else \c false, in which + * case you should check FLAC__metadata_simple_iterator_status() to + * find out why. If the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the + * current metadata block is not an \c APPLICATION block. Otherwise + * if the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error + * occurred and the iterator can no longer be used. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); + +/** Get the metadata block at the current position. You can modify the + * block but must use FLAC__metadata_simple_iterator_set_block() to + * write it back to the FLAC file. + * + * You must call FLAC__metadata_object_delete() on the returned object + * when you are finished with it. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__StreamMetadata* + * The current metadata block, or \c NULL if there was a memory + * allocation error. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); + +/** Write a block back to the FLAC file. This function tries to be + * as efficient as possible; how the block is actually written is + * shown by the following: + * + * Existing block is a STREAMINFO block and the new block is a + * STREAMINFO block: the new block is written in place. Make sure + * you know what you're doing when changing the values of a + * STREAMINFO block. + * + * Existing block is a STREAMINFO block and the new block is a + * not a STREAMINFO block: this is an error since the first block + * must be a STREAMINFO block. Returns \c false without altering the + * file. + * + * Existing block is not a STREAMINFO block and the new block is a + * STREAMINFO block: this is an error since there may be only one + * STREAMINFO block. Returns \c false without altering the file. + * + * Existing block and new block are the same length: the existing + * block will be replaced by the new block, written in place. + * + * Existing block is longer than new block: if use_padding is \c true, + * the existing block will be overwritten in place with the new + * block followed by a PADDING block, if possible, to make the total + * size the same as the existing block. Remember that a padding + * block requires at least four bytes so if the difference in size + * between the new block and existing block is less than that, the + * entire file will have to be rewritten, using the new block's + * exact size. If use_padding is \c false, the entire file will be + * rewritten, replacing the existing block by the new block. + * + * Existing block is shorter than new block: if use_padding is \c true, + * the function will try and expand the new block into the following + * PADDING block, if it exists and doing so won't shrink the PADDING + * block to less than 4 bytes. If there is no following PADDING + * block, or it will shrink to less than 4 bytes, or use_padding is + * \c false, the entire file is rewritten, replacing the existing block + * with the new block. Note that in this case any following PADDING + * block is preserved as is. + * + * After writing the block, the iterator will remain in the same + * place, i.e. pointing to the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block The block to set. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); + +/** This is similar to FLAC__metadata_simple_iterator_set_block() + * except that instead of writing over an existing block, it appends + * a block after the existing block. \a use_padding is again used to + * tell the function to try an expand into following padding in an + * attempt to avoid rewriting the entire file. + * + * This function will fail and return \c false if given a STREAMINFO + * block. + * + * After writing the block, the iterator will be pointing to the + * new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block The block to set. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); + +/** Deletes the block at the current position. This will cause the + * entire FLAC file to be rewritten, unless \a use_padding is \c true, + * in which case the block will be replaced by an equal-sized PADDING + * block. The iterator will be left pointing to the block before the + * one just deleted. + * + * You may not delete the STREAMINFO block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); + +/* \} */ + + +/** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface + * \ingroup flac_metadata + * + * \brief + * The level 2 interface provides read-write access to FLAC file metadata; + * all metadata is read into memory, operated on in memory, and then written + * to file, which is more efficient than level 1 when editing multiple blocks. + * + * Currently Ogg FLAC is supported for read only, via + * FLAC__metadata_chain_read_ogg() but a subsequent + * FLAC__metadata_chain_write() will fail. + * + * The general usage of this interface is: + * + * - Create a new chain using FLAC__metadata_chain_new(). A chain is a + * linked list of FLAC metadata blocks. + * - Read all metadata into the the chain from a FLAC file using + * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and + * check the status. + * - Optionally, consolidate the padding using + * FLAC__metadata_chain_merge_padding() or + * FLAC__metadata_chain_sort_padding(). + * - Create a new iterator using FLAC__metadata_iterator_new() + * - Initialize the iterator to point to the first element in the chain + * using FLAC__metadata_iterator_init() + * - Traverse the chain using FLAC__metadata_iterator_next and + * FLAC__metadata_iterator_prev(). + * - Get a block for reading or modification using + * FLAC__metadata_iterator_get_block(). The pointer to the object + * inside the chain is returned, so the block is yours to modify. + * Changes will be reflected in the FLAC file when you write the + * chain. You can also add and delete blocks (see functions below). + * - When done, write out the chain using FLAC__metadata_chain_write(). + * Make sure to read the whole comment to the function below. + * - Delete the chain using FLAC__metadata_chain_delete(). + * + * \note + * Even though the FLAC file is not open while the chain is being + * manipulated, you must not alter the file externally during + * this time. The chain assumes the FLAC file will not change + * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() + * and FLAC__metadata_chain_write(). + * + * \note + * Do not modify the is_last, length, or type fields of returned + * FLAC__StreamMetadata objects. These are managed automatically. + * + * \note + * The metadata objects returned by FLAC__metadata_iterator_get_block() + * are owned by the chain; do not FLAC__metadata_object_delete() them. + * In the same way, blocks passed to FLAC__metadata_iterator_set_block() + * become owned by the chain and they will be deleted when the chain is + * deleted. + * + * \{ + */ + +struct FLAC__Metadata_Chain; +/** The opaque structure definition for the level 2 chain type. + */ +typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; + +struct FLAC__Metadata_Iterator; +/** The opaque structure definition for the level 2 iterator type. + */ +typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; + +typedef enum { + FLAC__METADATA_CHAIN_STATUS_OK = 0, + /**< The chain is in the normal OK state */ + + FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ + + FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, + /**< The chain could not open the target file */ + + FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, + /**< The chain could not find the FLAC signature at the start of the file */ + + FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, + /**< The chain tried to write to a file that was not writable */ + + FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, + /**< The chain encountered input that does not conform to the FLAC metadata specification */ + + FLAC__METADATA_CHAIN_STATUS_READ_ERROR, + /**< The chain encountered an error while reading the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, + /**< The chain encountered an error while seeking in the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, + /**< The chain encountered an error while writing the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, + /**< The chain encountered an error renaming the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, + /**< The chain encountered an error removing the temporary file */ + + FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ + + FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, + /**< The caller violated an assertion or an unexpected error occurred */ + + FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, + /**< One or more of the required callbacks was NULL */ + + FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, + /**< FLAC__metadata_chain_write() was called on a chain read by + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * or + * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() + * was called on a chain read by + * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Matching read/write methods must always be used. */ + + FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL + /**< FLAC__metadata_chain_write_with_callbacks() was called when the + * chain write requires a tempfile; use + * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. + * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was + * called when the chain write does not require a tempfile; use + * FLAC__metadata_chain_write_with_callbacks() instead. + * Always check FLAC__metadata_chain_check_if_tempfile_needed() + * before writing via callbacks. */ + +} FLAC__Metadata_ChainStatus; + +/** Maps a FLAC__Metadata_ChainStatus to a C string. + * + * Using a FLAC__Metadata_ChainStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; + +/*********** FLAC__Metadata_Chain ***********/ + +/** Create a new chain instance. + * + * \retval FLAC__Metadata_Chain* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); + +/** Free a chain instance. Deletes the object pointed to by \a chain. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); + +/** Get the current status of the chain. Call this after a function + * returns \c false to get the reason for the error. Also resets the + * status to FLAC__METADATA_CHAIN_STATUS_OK. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__Metadata_ChainStatus + * The current status of the chain. + */ +FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); + +/** Read all metadata from a FLAC file into the chain. + * + * \param chain A pointer to an existing chain. + * \param filename The path to the FLAC file to read. + * \assert + * \code chain != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a filename, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); + +/** Read all metadata from an Ogg FLAC file into the chain. + * + * \note Ogg FLAC metadata data writing is not supported yet and + * FLAC__metadata_chain_write() will fail. + * + * \param chain A pointer to an existing chain. + * \param filename The path to the Ogg FLAC file to read. + * \assert + * \code chain != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a filename, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); + +/** Read all metadata from a FLAC stream into the chain via I/O callbacks. + * + * The \a handle need only be open for reading, but must be seekable. + * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * \param chain A pointer to an existing chain. + * \param handle The I/O handle of the FLAC stream to read. The + * handle will NOT be closed after the metadata is read; + * that is the duty of the caller. + * \param callbacks + * A set of callbacks to use for I/O. The mandatory + * callbacks are \a read, \a seek, and \a tell. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a handle, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. + * + * The \a handle need only be open for reading, but must be seekable. + * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * \note Ogg FLAC metadata data writing is not supported yet and + * FLAC__metadata_chain_write() will fail. + * + * \param chain A pointer to an existing chain. + * \param handle The I/O handle of the Ogg FLAC stream to read. The + * handle will NOT be closed after the metadata is read; + * that is the duty of the caller. + * \param callbacks + * A set of callbacks to use for I/O. The mandatory + * callbacks are \a read, \a seek, and \a tell. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a handle, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Checks if writing the given chain would require the use of a + * temporary file, or if it could be written in place. + * + * Under certain conditions, padding can be utilized so that writing + * edited metadata back to the FLAC file does not require rewriting the + * entire file. If rewriting is required, then a temporary workfile is + * required. When writing metadata using callbacks, you must check + * this function to know whether to call + * FLAC__metadata_chain_write_with_callbacks() or + * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When + * writing with FLAC__metadata_chain_write(), the temporary file is + * handled internally. + * + * \param chain A pointer to an existing chain. + * \param use_padding + * Whether or not padding will be allowed to be used + * during the write. The value of \a use_padding given + * here must match the value later passed to + * FLAC__metadata_chain_write_with_callbacks() or + * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if writing the current chain would require a tempfile, or + * \c false if metadata can be written in place. + */ +FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); + +/** Write all metadata out to the FLAC file. This function tries to be as + * efficient as possible; how the metadata is actually written is shown by + * the following: + * + * If the current chain is the same size as the existing metadata, the new + * data is written in place. + * + * If the current chain is longer than the existing metadata, and + * \a use_padding is \c true, and the last block is a PADDING block of + * sufficient length, the function will truncate the final padding block + * so that the overall size of the metadata is the same as the existing + * metadata, and then just rewrite the metadata. Otherwise, if not all of + * the above conditions are met, the entire FLAC file must be rewritten. + * If you want to use padding this way it is a good idea to call + * FLAC__metadata_chain_sort_padding() first so that you have the maximum + * amount of padding to work with, unless you need to preserve ordering + * of the PADDING blocks for some reason. + * + * If the current chain is shorter than the existing metadata, and + * \a use_padding is \c true, and the final block is a PADDING block, the padding + * is extended to make the overall size the same as the existing data. If + * \a use_padding is \c true and the last block is not a PADDING block, a new + * PADDING block is added to the end of the new data to make it the same + * size as the existing data (if possible, see the note to + * FLAC__metadata_simple_iterator_set_block() about the four byte limit) + * and the new data is written in place. If none of the above apply or + * \a use_padding is \c false, the entire FLAC file is rewritten. + * + * If \a preserve_file_stats is \c true, the owner and modification time will + * be preserved even if the FLAC file is written. + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). + * + * \param chain A pointer to an existing chain. + * \param use_padding See above. + * \param preserve_file_stats See above. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); + +/** Write all metadata out to a FLAC stream via callbacks. + * + * (See FLAC__metadata_chain_write() for the details on how padding is + * used to write metadata in place if possible.) + * + * The \a handle must be open for updating and be seekable. The + * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" + * for Windows). + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + * \c false. + * + * \param chain A pointer to an existing chain. + * \param use_padding See FLAC__metadata_chain_write() + * \param handle The I/O handle of the FLAC stream to write. The + * handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param callbacks A set of callbacks to use for I/O. The mandatory + * callbacks are \a write and \a seek. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Write all metadata out to a FLAC stream via callbacks. + * + * (See FLAC__metadata_chain_write() for the details on how padding is + * used to write metadata in place if possible.) + * + * This version of the write-with-callbacks function must be used when + * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In + * this function, you must supply an I/O handle corresponding to the + * FLAC file to edit, and a temporary handle to which the new FLAC + * file will be written. It is the caller's job to move this temporary + * FLAC file on top of the original FLAC file to complete the metadata + * edit. + * + * The \a handle must be open for reading and be seekable. The + * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * The \a temp_handle must be open for writing. The + * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" + * for Windows). It should be an empty stream, or at least positioned + * at the start-of-file (in which case it is the caller's duty to + * truncate it on return). + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + * \c true. + * + * \param chain A pointer to an existing chain. + * \param use_padding See FLAC__metadata_chain_write() + * \param handle The I/O handle of the original FLAC stream to read. + * The handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param callbacks A set of callbacks to use for I/O on \a handle. + * The mandatory callbacks are \a read, \a seek, and + * \a eof. + * \param temp_handle The I/O handle of the FLAC stream to write. The + * handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param temp_callbacks + * A set of callbacks to use for I/O on temp_handle. + * The only mandatory callback is \a write. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); + +/** Merge adjacent PADDING blocks into a single block. + * + * \note This function does not write to the FLAC file, it only + * modifies the chain. + * + * \warning Any iterator on the current chain will become invalid after this + * call. You should delete the iterator and get a new one. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); + +/** This function will move all PADDING blocks to the end on the metadata, + * then merge them into a single block. + * + * \note This function does not write to the FLAC file, it only + * modifies the chain. + * + * \warning Any iterator on the current chain will become invalid after this + * call. You should delete the iterator and get a new one. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); + + +/*********** FLAC__Metadata_Iterator ***********/ + +/** Create a new iterator instance. + * + * \retval FLAC__Metadata_Iterator* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); + +/** Free an iterator instance. Deletes the object pointed to by \a iterator. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + */ +FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); + +/** Initialize the iterator to point to the first metadata block in the + * given chain. + * + * \param iterator A pointer to an existing iterator. + * \param chain A pointer to an existing and initialized (read) chain. + * \assert + * \code iterator != NULL \endcode + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); + +/** Moves the iterator forward one metadata block, returning \c false if + * already at the end. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if already at the last metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); + +/** Moves the iterator backward one metadata block, returning \c false if + * already at the beginning. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if already at the first metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); + +/** Get the type of the metadata block at the current position. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__MetadataType + * The type of the metadata block at the current iterator position. + */ +FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); + +/** Get the metadata block at the current position. You can modify + * the block in place but must write the chain before the changes + * are reflected to the FLAC file. You do not need to call + * FLAC__metadata_iterator_set_block() to reflect the changes; + * the pointer returned by FLAC__metadata_iterator_get_block() + * points directly into the chain. + * + * \warning + * Do not call FLAC__metadata_object_delete() on the returned object; + * to delete a block use FLAC__metadata_iterator_delete_block(). + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__StreamMetadata* + * The current metadata block. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); + +/** Set the metadata block at the current position, replacing the existing + * block. The new block passed in becomes owned by the chain and it will be + * deleted when the chain is deleted. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/** Removes the current block from the chain. If \a replace_with_padding is + * \c true, the block will instead be replaced with a padding block of equal + * size. You can not delete the STREAMINFO block. The iterator will be + * left pointing to the block before the one just "deleted", even if + * \a replace_with_padding is \c true. + * + * \param iterator A pointer to an existing initialized iterator. + * \param replace_with_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, + * otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); + +/** Insert a new block before the current block. You cannot insert a block + * before the first STREAMINFO block. You cannot insert a STREAMINFO block + * as there can be only one, the one that already exists at the head when you + * read in a chain. The chain takes ownership of the new block and it will be + * deleted when the chain is deleted. The iterator will be left pointing to + * the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block to insert. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/** Insert a new block after the current block. You cannot insert a STREAMINFO + * block as there can be only one, the one that already exists at the head when + * you read in a chain. The chain takes ownership of the new block and it will + * be deleted when the chain is deleted. The iterator will be left pointing to + * the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block to insert. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/* \} */ + + +/** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods + * \ingroup flac_metadata + * + * \brief + * This module contains methods for manipulating FLAC metadata objects. + * + * Since many are variable length we have to be careful about the memory + * management. We decree that all pointers to data in the object are + * owned by the object and memory-managed by the object. + * + * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() + * functions to create all instances. When using the + * FLAC__metadata_object_set_*() functions to set pointers to data, set + * \a copy to \c true to have the function make it's own copy of the data, or + * to \c false to give the object ownership of your data. In the latter case + * your pointer must be freeable by free() and will be free()d when the object + * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as + * the data pointer to a FLAC__metadata_object_set_*() function as long as + * the length argument is 0 and the \a copy argument is \c false. + * + * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function + * will return \c NULL in the case of a memory allocation error, otherwise a new + * object. The FLAC__metadata_object_set_*() functions return \c false in the + * case of a memory allocation error. + * + * We don't have the convenience of C++ here, so note that the library relies + * on you to keep the types straight. In other words, if you pass, for + * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to + * FLAC__metadata_object_application_set_data(), you will get an assertion + * failure. + * + * For convenience the FLAC__metadata_object_vorbiscomment_*() functions + * maintain a trailing NUL on each Vorbis comment entry. This is not counted + * toward the length or stored in the stream, but it can make working with plain + * comments (those that don't contain embedded-NULs in the value) easier. + * Entries passed into these functions have trailing NULs added if missing, and + * returned entries are guaranteed to have a trailing NUL. + * + * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis + * comment entry/name/value will first validate that it complies with the Vorbis + * comment specification and return false if it does not. + * + * There is no need to recalculate the length field on metadata blocks you + * have modified. They will be calculated automatically before they are + * written back to a file. + * + * \{ + */ + + +/** Create a new metadata object instance of the given type. + * + * The object will be "empty"; i.e. values and data pointers will be \c 0, + * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have + * the vendor string set (but zero comments). + * + * Do not pass in a value greater than or equal to + * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're + * doing. + * + * \param type Type of object to create + * \retval FLAC__StreamMetadata* + * \c NULL if there was an error allocating memory or the type code is + * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); + +/** Create a copy of an existing metadata object. + * + * The copy is a "deep" copy, i.e. dynamically allocated data within the + * object is also copied. The caller takes ownership of the new block and + * is responsible for freeing it with FLAC__metadata_object_delete(). + * + * \param object Pointer to object to copy. + * \assert + * \code object != NULL \endcode + * \retval FLAC__StreamMetadata* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); + +/** Free a metadata object. Deletes the object pointed to by \a object. + * + * The delete is a "deep" delete, i.e. dynamically allocated data within the + * object is also deleted. + * + * \param object A pointer to an existing object. + * \assert + * \code object != NULL \endcode + */ +FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); + +/** Compares two metadata objects. + * + * The compare is "deep", i.e. dynamically allocated data within the + * object is also compared. + * + * \param block1 A pointer to an existing object. + * \param block2 A pointer to an existing object. + * \assert + * \code block1 != NULL \endcode + * \code block2 != NULL \endcode + * \retval FLAC__bool + * \c true if objects are identical, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); + +/** Sets the application data of an APPLICATION block. + * + * If \a copy is \c true, a copy of the data is stored; otherwise, the object + * takes ownership of the pointer. The existing data will be freed if this + * function is successful, otherwise the original data will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a data if \a copy is \c true. + * + * \param object A pointer to an existing APPLICATION object. + * \param data A pointer to the data to set. + * \param length The length of \a data in bytes. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode + * \code (data != NULL && length > 0) || + * (data == NULL && length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy); + +/** Resize the seekpoint array. + * + * If the size shrinks, elements will truncated; if it grows, new placeholder + * points will be added to the end. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param new_num_points The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || + * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points); + +/** Set a seekpoint in a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \param point The point to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points > point_num \endcode + */ +FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); + +/** Insert a seekpoint into a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \param point The point to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points >= point_num \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); + +/** Delete a seekpoint from a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points > point_num \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num); + +/** Check a seektable to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if seek table is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); + +/** Append a number of placeholder points to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param num The number of placeholder points to append. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num); + +/** Append a specific seek point template to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param sample_number The sample number of the seek point template. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); + +/** Append specific seek point templates to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param sample_numbers An array of sample numbers for the seek points. + * \param num The number of seek point templates to append. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num); + +/** Append a set of evenly-spaced seek point templates to the end of a + * seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param num The number of placeholder points to append. + * \param total_samples The total number of samples to be encoded; + * the seekpoints will be spaced approximately + * \a total_samples / \a num samples apart. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code total_samples > 0 \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples); + +/** Append a set of evenly-spaced seek point templates to the end of a + * seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param samples The number of samples apart to space the placeholder + * points. The first point will be at sample \c 0, the + * second at sample \a samples, then 2*\a samples, and + * so on. As long as \a samples and \a total_samples + * are greater than \c 0, there will always be at least + * one seekpoint at sample \c 0. + * \param total_samples The total number of samples to be encoded; + * the seekpoints will be spaced + * \a samples samples apart. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code samples > 0 \endcode + * \code total_samples > 0 \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples); + +/** Sort a seek table's seek points according to the format specification, + * removing duplicates. + * + * \param object A pointer to a seek table to be sorted. + * \param compact If \c false, behaves like FLAC__format_seektable_sort(). + * If \c true, duplicates are deleted and the seek table is + * shrunk appropriately; the number of placeholder points + * present in the seek table will be the same after the call + * as before. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); + +/** Sets the vendor string in a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The entry to set the vendor string to. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Resize the comment array. + * + * If the size shrinks, elements will truncated; if it grows, new empty + * fields will be added to the end. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param new_num_comments The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || + * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments); + +/** Sets a comment in a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num Index into comment array to set. + * \param entry The entry to set the comment to. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code comment_num < object->data.vorbis_comment.num_comments \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Insert a comment in a VORBIS_COMMENT block at the given index. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num The index at which to insert the comment. The comments + * at and after \a comment_num move right one position. + * To append a comment to the end, set \a comment_num to + * \c object->data.vorbis_comment.num_comments . + * \param entry The comment to insert. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code object->data.vorbis_comment.num_comments >= comment_num \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Appends a comment to a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The comment to insert. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Replaces comments in a VORBIS_COMMENT block with a new one. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * Depending on the the value of \a all, either all or just the first comment + * whose field name(s) match the given entry's name will be replaced by the + * given entry. If no comments match, \a entry will simply be appended. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The comment to insert. + * \param all If \c true, all comments whose field name matches + * \a entry's field name will be removed, and \a entry will + * be inserted at the position of the first matching + * comment. If \c false, only the first comment whose + * field name matches \a entry's field name will be + * replaced with \a entry. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); + +/** Delete a comment in a VORBIS_COMMENT block at the given index. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num The index of the comment to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code object->data.vorbis_comment.num_comments > comment_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num); + +/** Creates a Vorbis comment entry from NUL-terminated name and value strings. + * + * On return, the filled-in \a entry->entry pointer will point to malloc()ed + * memory and shall be owned by the caller. For convenience the entry will + * have a terminating NUL. + * + * \param entry A pointer to a Vorbis comment entry. The entry's + * \c entry pointer should not point to allocated + * memory as it will be overwritten. + * \param field_name The field name in ASCII, \c NUL terminated. + * \param field_value The field value in UTF-8, \c NUL terminated. + * \assert + * \code entry != NULL \endcode + * \code field_name != NULL \endcode + * \code field_value != NULL \endcode + * \retval FLAC__bool + * \c false if malloc() fails, or if \a field_name or \a field_value does + * not comply with the Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); + +/** Splits a Vorbis comment entry into NUL-terminated name and value strings. + * + * The returned pointers to name and value will be allocated by malloc() + * and shall be owned by the caller. + * + * \param entry An existing Vorbis comment entry. + * \param field_name The address of where the returned pointer to the + * field name will be stored. + * \param field_value The address of where the returned pointer to the + * field value will be stored. + * \assert + * \code (entry.entry != NULL && entry.length > 0) \endcode + * \code memchr(entry.entry, '=', entry.length) != NULL \endcode + * \code field_name != NULL \endcode + * \code field_value != NULL \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); + +/** Check if the given Vorbis comment entry's field name matches the given + * field name. + * + * \param entry An existing Vorbis comment entry. + * \param field_name The field name to check. + * \param field_name_length The length of \a field_name, not including the + * terminating \c NUL. + * \assert + * \code (entry.entry != NULL && entry.length > 0) \endcode + * \retval FLAC__bool + * \c true if the field names match, else \c false + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length); + +/** Find a Vorbis comment with the given field name. + * + * The search begins at entry number \a offset; use an offset of 0 to + * search from the beginning of the comment array. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param offset The offset into the comment array from where to start + * the search. + * \param field_name The field name of the comment to find. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code field_name != NULL \endcode + * \retval int + * The offset in the comment array of the first comment whose field + * name matches \a field_name, or \c -1 if no match was found. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name); + +/** Remove first Vorbis comment matching the given field name. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param field_name The field name of comment to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \retval int + * \c -1 for memory allocation error, \c 0 for no matching entries, + * \c 1 for one matching entry deleted. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); + +/** Remove all Vorbis comments matching the given field name. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param field_name The field name of comments to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \retval int + * \c -1 for memory allocation error, \c 0 for no matching entries, + * else the number of matching entries deleted. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); + +/** Create a new CUESHEET track instance. + * + * The object will be "empty"; i.e. values and data pointers will be \c 0. + * + * \retval FLAC__StreamMetadata_CueSheet_Track* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); + +/** Create a copy of an existing CUESHEET track object. + * + * The copy is a "deep" copy, i.e. dynamically allocated data within the + * object is also copied. The caller takes ownership of the new object and + * is responsible for freeing it with + * FLAC__metadata_object_cuesheet_track_delete(). + * + * \param object Pointer to object to copy. + * \assert + * \code object != NULL \endcode + * \retval FLAC__StreamMetadata_CueSheet_Track* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); + +/** Delete a CUESHEET track object + * + * \param object A pointer to an existing CUESHEET track object. + * \assert + * \code object != NULL \endcode + */ +FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); + +/** Resize a track's index point array. + * + * If the size shrinks, elements will truncated; if it grows, new blank + * indices will be added to the end. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param new_num_indices The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || + * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices); + +/** Insert an index point in a CUESHEET track at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param index_num The index into the track's index array at which to + * insert the index point. NOTE: this is not necessarily + * the same as the index point's \a number field. The + * indices at and after \a index_num move right one + * position. To append an index point to the end, set + * \a index_num to + * \c object->data.cue_sheet.tracks[track_num].num_indices . + * \param index The index point to insert. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index); + +/** Insert a blank index point in a CUESHEET track at the given index. + * + * A blank index point is one in which all field values are zero. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param index_num The index into the track's index array at which to + * insert the index point. NOTE: this is not necessarily + * the same as the index point's \a number field. The + * indices at and after \a index_num move right one + * position. To append an index point to the end, set + * \a index_num to + * \c object->data.cue_sheet.tracks[track_num].num_indices . + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); + +/** Delete an index point in a CUESHEET track at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index into the track array of the track to + * modify. NOTE: this is not necessarily the same + * as the track's \a number field. + * \param index_num The index into the track's index array of the index + * to delete. NOTE: this is not necessarily the same + * as the index's \a number field. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); + +/** Resize the track array. + * + * If the size shrinks, elements will truncated; if it grows, new blank + * tracks will be added to the end. + * + * \param object A pointer to an existing CUESHEET object. + * \param new_num_tracks The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || + * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks); + +/** Sets a track in a CUESHEET block. + * + * If \a copy is \c true, a copy of the track is stored; otherwise, the object + * takes ownership of the \a track pointer. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num Index into track array to set. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param track The track to set the track to. You may safely pass in + * a const pointer if \a copy is \c true. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code track_num < object->data.cue_sheet.num_tracks \endcode + * \code (track->indices != NULL && track->num_indices > 0) || + * (track->indices == NULL && track->num_indices == 0) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); + +/** Insert a track in a CUESHEET block at the given index. + * + * If \a copy is \c true, a copy of the track is stored; otherwise, the object + * takes ownership of the \a track pointer. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index at which to insert the track. NOTE: this + * is not necessarily the same as the track's \a number + * field. The tracks at and after \a track_num move right + * one position. To append a track to the end, set + * \a track_num to \c object->data.cue_sheet.num_tracks . + * \param track The track to insert. You may safely pass in a const + * pointer if \a copy is \c true. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks >= track_num \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); + +/** Insert a blank track in a CUESHEET block at the given index. + * + * A blank track is one in which all field values are zero. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index at which to insert the track. NOTE: this + * is not necessarily the same as the track's \a number + * field. The tracks at and after \a track_num move right + * one position. To append a track to the end, set + * \a track_num to \c object->data.cue_sheet.num_tracks . + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks >= track_num \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num); + +/** Delete a track in a CUESHEET block at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index into the track array of the track to + * delete. NOTE: this is not necessarily the same + * as the track's \a number field. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num); + +/** Check a cue sheet to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * cue sheet. + * + * \param object A pointer to an existing CUESHEET object. + * \param check_cd_da_subset If \c true, check CUESHEET against more + * stringent requirements for a CD-DA (audio) disc. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \retval FLAC__bool + * \c false if cue sheet is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); + +/** Calculate and return the CDDB/freedb ID for a cue sheet. The function + * assumes the cue sheet corresponds to a CD; the result is undefined + * if the cuesheet's is_cd bit is not set. + * + * \param object A pointer to an existing CUESHEET object. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \retval FLAC__uint32 + * The unsigned integer representation of the CDDB/freedb ID + */ +FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); + +/** Sets the MIME type of a PICTURE block. + * + * If \a copy is \c true, a copy of the string is stored; otherwise, the object + * takes ownership of the pointer. The existing string will be freed if this + * function is successful, otherwise the original string will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param mime_type A pointer to the MIME type string. The string must be + * ASCII characters 0x20-0x7e, NUL-terminated. No validation + * is done. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (mime_type != NULL) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); + +/** Sets the description of a PICTURE block. + * + * If \a copy is \c true, a copy of the string is stored; otherwise, the object + * takes ownership of the pointer. The existing string will be freed if this + * function is successful, otherwise the original string will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a description if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param description A pointer to the description string. The string must be + * valid UTF-8, NUL-terminated. No validation is done. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (description != NULL) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); + +/** Sets the picture data of a PICTURE block. + * + * If \a copy is \c true, a copy of the data is stored; otherwise, the object + * takes ownership of the pointer. Also sets the \a data_length field of the + * metadata object to what is passed in as the \a length parameter. The + * existing data will be freed if this function is successful, otherwise the + * original data and data_length will remain if \a copy is \c true and + * malloc() fails. + * + * \note It is safe to pass a const pointer to \a data if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param data A pointer to the data to set. + * \param length The length of \a data in bytes. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (data != NULL && length > 0) || + * (data == NULL && length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); + +/** Check a PICTURE block to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * PICTURE block. + * + * \param object A pointer to existing PICTURE block to be checked. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \retval FLAC__bool + * \c false if PICTURE block is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h new file mode 100644 index 0000000000..c9466c5c20 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h @@ -0,0 +1,86 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__ORDINALS_H +#define FLAC__ORDINALS_H + +#if defined(_MSC_VER) && _MSC_VER < 1600 + +/* Microsoft Visual Studio earlier than the 2010 version did not provide + * the 1999 ISO C Standard header file . + */ + +typedef __int8 FLAC__int8; +typedef unsigned __int8 FLAC__uint8; + +typedef __int16 FLAC__int16; +typedef __int32 FLAC__int32; +typedef __int64 FLAC__int64; +typedef unsigned __int16 FLAC__uint16; +typedef unsigned __int32 FLAC__uint32; +typedef unsigned __int64 FLAC__uint64; + +#else + +/* For MSVC 2010 and everything else which provides . */ + +#include + +typedef int8_t FLAC__int8; +typedef uint8_t FLAC__uint8; + +typedef int16_t FLAC__int16; +typedef int32_t FLAC__int32; +typedef int64_t FLAC__int64; +typedef uint16_t FLAC__uint16; +typedef uint32_t FLAC__uint32; +typedef uint64_t FLAC__uint64; + +#endif + +typedef int FLAC__bool; + +typedef FLAC__uint8 FLAC__byte; + + +#ifdef true +#undef true +#endif +#ifdef false +#undef false +#endif +#ifndef __cplusplus +#define true 1 +#define false 0 +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h new file mode 100644 index 0000000000..be402c8302 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h @@ -0,0 +1,1560 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__STREAM_DECODER_H +#define FLAC__STREAM_DECODER_H + +#include /* for FILE */ +#include "export.h" +#include "format.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \file include/FLAC/stream_decoder.h + * + * \brief + * This module contains the functions which implement the stream + * decoder. + * + * See the detailed documentation in the + * \link flac_stream_decoder stream decoder \endlink module. + */ + +/** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces + * \ingroup flac + * + * \brief + * This module describes the decoder layers provided by libFLAC. + * + * The stream decoder can be used to decode complete streams either from + * the client via callbacks, or directly from a file, depending on how + * it is initialized. When decoding via callbacks, the client provides + * callbacks for reading FLAC data and writing decoded samples, and + * handling metadata and errors. If the client also supplies seek-related + * callback, the decoder function for sample-accurate seeking within the + * FLAC input is also available. When decoding from a file, the client + * needs only supply a filename or open \c FILE* and write/metadata/error + * callbacks; the rest of the callbacks are supplied internally. For more + * info see the \link flac_stream_decoder stream decoder \endlink module. + */ + +/** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface + * \ingroup flac_decoder + * + * \brief + * This module contains the functions which implement the stream + * decoder. + * + * The stream decoder can decode native FLAC, and optionally Ogg FLAC + * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. + * + * The basic usage of this decoder is as follows: + * - The program creates an instance of a decoder using + * FLAC__stream_decoder_new(). + * - The program overrides the default settings using + * FLAC__stream_decoder_set_*() functions. + * - The program initializes the instance to validate the settings and + * prepare for decoding using + * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() + * or FLAC__stream_decoder_init_file() for native FLAC, + * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() + * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC + * - The program calls the FLAC__stream_decoder_process_*() functions + * to decode data, which subsequently calls the callbacks. + * - The program finishes the decoding with FLAC__stream_decoder_finish(), + * which flushes the input and output and resets the decoder to the + * uninitialized state. + * - The instance may be used again or deleted with + * FLAC__stream_decoder_delete(). + * + * In more detail, the program will create a new instance by calling + * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() + * functions to override the default decoder options, and call + * one of the FLAC__stream_decoder_init_*() functions. + * + * There are three initialization functions for native FLAC, one for + * setting up the decoder to decode FLAC data from the client via + * callbacks, and two for decoding directly from a FLAC file. + * + * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). + * You must also supply several callbacks for handling I/O. Some (like + * seeking) are optional, depending on the capabilities of the input. + * + * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() + * or FLAC__stream_decoder_init_file(). Then you must only supply an open + * \c FILE* or filename and fewer callbacks; the decoder will handle + * the other callbacks internally. + * + * There are three similarly-named init functions for decoding from Ogg + * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the + * library has been built with Ogg support. + * + * Once the decoder is initialized, your program will call one of several + * functions to start the decoding process: + * + * - FLAC__stream_decoder_process_single() - Tells the decoder to process at + * most one metadata block or audio frame and return, calling either the + * metadata callback or write callback, respectively, once. If the decoder + * loses sync it will return with only the error callback being called. + * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder + * to process the stream from the current location and stop upon reaching + * the first audio frame. The client will get one metadata, write, or error + * callback per metadata block, audio frame, or sync error, respectively. + * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder + * to process the stream from the current location until the read callback + * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or + * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, + * write, or error callback per metadata block, audio frame, or sync error, + * respectively. + * + * When the decoder has finished decoding (normally or through an abort), + * the instance is finished by calling FLAC__stream_decoder_finish(), which + * ensures the decoder is in the correct state and frees memory. Then the + * instance may be deleted with FLAC__stream_decoder_delete() or initialized + * again to decode another stream. + * + * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. + * At any point after the stream decoder has been initialized, the client can + * call this function to seek to an exact sample within the stream. + * Subsequently, the first time the write callback is called it will be + * passed a (possibly partial) block starting at that sample. + * + * If the client cannot seek via the callback interface provided, but still + * has another way of seeking, it can flush the decoder using + * FLAC__stream_decoder_flush() and start feeding data from the new position + * through the read callback. + * + * The stream decoder also provides MD5 signature checking. If this is + * turned on before initialization, FLAC__stream_decoder_finish() will + * report when the decoded MD5 signature does not match the one stored + * in the STREAMINFO block. MD5 checking is automatically turned off + * (until the next FLAC__stream_decoder_reset()) if there is no signature + * in the STREAMINFO block or when a seek is attempted. + * + * The FLAC__stream_decoder_set_metadata_*() functions deserve special + * attention. By default, the decoder only calls the metadata_callback for + * the STREAMINFO block. These functions allow you to tell the decoder + * explicitly which blocks to parse and return via the metadata_callback + * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), + * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), + * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify + * which blocks to return. Remember that metadata blocks can potentially + * be big (for example, cover art) so filtering out the ones you don't + * use can reduce the memory requirements of the decoder. Also note the + * special forms FLAC__stream_decoder_set_metadata_respond_application(id) + * and FLAC__stream_decoder_set_metadata_ignore_application(id) for + * filtering APPLICATION blocks based on the application ID. + * + * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but + * they still can legally be filtered from the metadata_callback. + * + * \note + * The "set" functions may only be called when the decoder is in the + * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after + * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but + * before FLAC__stream_decoder_init_*(). If this is the case they will + * return \c true, otherwise \c false. + * + * \note + * FLAC__stream_decoder_finish() resets all settings to the constructor + * defaults, including the callbacks. + * + * \{ + */ + + +/** State values for a FLAC__StreamDecoder + * + * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). + */ +typedef enum { + + FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, + /**< The decoder is ready to search for metadata. */ + + FLAC__STREAM_DECODER_READ_METADATA, + /**< The decoder is ready to or is in the process of reading metadata. */ + + FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, + /**< The decoder is ready to or is in the process of searching for the + * frame sync code. + */ + + FLAC__STREAM_DECODER_READ_FRAME, + /**< The decoder is ready to or is in the process of reading a frame. */ + + FLAC__STREAM_DECODER_END_OF_STREAM, + /**< The decoder has reached the end of the stream. */ + + FLAC__STREAM_DECODER_OGG_ERROR, + /**< An error occurred in the underlying Ogg layer. */ + + FLAC__STREAM_DECODER_SEEK_ERROR, + /**< An error occurred while seeking. The decoder must be flushed + * with FLAC__stream_decoder_flush() or reset with + * FLAC__stream_decoder_reset() before decoding can continue. + */ + + FLAC__STREAM_DECODER_ABORTED, + /**< The decoder was aborted by the read callback. */ + + FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. The decoder is in an invalid + * state and can no longer be used. + */ + + FLAC__STREAM_DECODER_UNINITIALIZED + /**< The decoder is in the uninitialized state; one of the + * FLAC__stream_decoder_init_*() functions must be called before samples + * can be processed. + */ + +} FLAC__StreamDecoderState; + +/** Maps a FLAC__StreamDecoderState to a C string. + * + * Using a FLAC__StreamDecoderState as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; + + +/** Possible return values for the FLAC__stream_decoder_init_*() functions. + */ +typedef enum { + + FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, + /**< Initialization was successful. */ + + FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, + /**< The library was not compiled with support for the given container + * format. + */ + + FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, + /**< A required callback was not supplied. */ + + FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. */ + + FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, + /**< fopen() failed in FLAC__stream_decoder_init_file() or + * FLAC__stream_decoder_init_ogg_file(). */ + + FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED + /**< FLAC__stream_decoder_init_*() was called when the decoder was + * already initialized, usually because + * FLAC__stream_decoder_finish() was not called. + */ + +} FLAC__StreamDecoderInitStatus; + +/** Maps a FLAC__StreamDecoderInitStatus to a C string. + * + * Using a FLAC__StreamDecoderInitStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; + + +/** Return values for the FLAC__StreamDecoder read callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, + /**< The read was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, + /**< The read was attempted while at the end of the stream. Note that + * the client must only return this value when the read callback was + * called when already at the end of the stream. Otherwise, if the read + * itself moves to the end of the stream, the client should still return + * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on + * the next read callback it should return + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count + * of \c 0. + */ + + FLAC__STREAM_DECODER_READ_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + +} FLAC__StreamDecoderReadStatus; + +/** Maps a FLAC__StreamDecoderReadStatus to a C string. + * + * Using a FLAC__StreamDecoderReadStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; + + +/** Return values for the FLAC__StreamDecoder seek callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_SEEK_STATUS_OK, + /**< The seek was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamDecoderSeekStatus; + +/** Maps a FLAC__StreamDecoderSeekStatus to a C string. + * + * Using a FLAC__StreamDecoderSeekStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; + + +/** Return values for the FLAC__StreamDecoder tell callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_TELL_STATUS_OK, + /**< The tell was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_TELL_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + /**< Client does not support telling the position. */ + +} FLAC__StreamDecoderTellStatus; + +/** Maps a FLAC__StreamDecoderTellStatus to a C string. + * + * Using a FLAC__StreamDecoderTellStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; + + +/** Return values for the FLAC__StreamDecoder length callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_LENGTH_STATUS_OK, + /**< The length call was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + /**< Client does not support reporting the length. */ + +} FLAC__StreamDecoderLengthStatus; + +/** Maps a FLAC__StreamDecoderLengthStatus to a C string. + * + * Using a FLAC__StreamDecoderLengthStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; + + +/** Return values for the FLAC__StreamDecoder write callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, + /**< The write was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_WRITE_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + +} FLAC__StreamDecoderWriteStatus; + +/** Maps a FLAC__StreamDecoderWriteStatus to a C string. + * + * Using a FLAC__StreamDecoderWriteStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; + + +/** Possible values passed back to the FLAC__StreamDecoder error callback. + * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- + * all. The rest could be caused by bad sync (false synchronization on + * data that is not the start of a frame) or corrupted data. The error + * itself is the decoder's best guess at what happened assuming a correct + * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER + * could be caused by a correct sync on the start of a frame, but some + * data in the frame header was corrupted. Or it could be the result of + * syncing on a point the stream that looked like the starting of a frame + * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + * could be because the decoder encountered a valid frame made by a future + * version of the encoder which it cannot parse, or because of a false + * sync making it appear as though an encountered frame was generated by + * a future encoder. + */ +typedef enum { + + FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, + /**< An error in the stream caused the decoder to lose synchronization. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, + /**< The decoder encountered a corrupted frame header. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, + /**< The frame's data did not match the CRC in the footer. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + /**< The decoder encountered reserved fields in use in the stream. */ + +} FLAC__StreamDecoderErrorStatus; + +/** Maps a FLAC__StreamDecoderErrorStatus to a C string. + * + * Using a FLAC__StreamDecoderErrorStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; + + +/*********************************************************************** + * + * class FLAC__StreamDecoder + * + ***********************************************************************/ + +struct FLAC__StreamDecoderProtected; +struct FLAC__StreamDecoderPrivate; +/** The opaque structure definition for the stream decoder type. + * See the \link flac_stream_decoder stream decoder module \endlink + * for a detailed description. + */ +typedef struct { + struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ + struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ +} FLAC__StreamDecoder; + +/** Signature for the read callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs more input data. The address of the + * buffer to be filled is supplied, along with the number of bytes the + * buffer can hold. The callback may choose to supply less data and + * modify the byte count but must be careful not to overflow the buffer. + * The callback then returns a status code chosen from + * FLAC__StreamDecoderReadStatus. + * + * Here is an example of a read callback for stdio streams: + * \code + * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(*bytes > 0) { + * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); + * if(ferror(file)) + * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + * else if(*bytes == 0) + * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + * else + * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + * } + * else + * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param buffer A pointer to a location for the callee to store + * data to be decoded. + * \param bytes A pointer to the size of the buffer. On entry + * to the callback, it contains the maximum number + * of bytes that may be stored in \a buffer. The + * callee must set it to the actual number of bytes + * stored (0 in case of error or end-of-stream) before + * returning. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderReadStatus + * The callee's return status. Note that the callback should return + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if + * zero bytes were read and there is no more data to be read. + */ +typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + +/** Signature for the seek callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs to seek the input stream. The decoder + * will pass the absolute byte offset to seek to, 0 meaning the + * beginning of the stream. + * + * Here is an example of a seek callback for stdio streams: + * \code + * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(file == stdin) + * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + * else + * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param absolute_byte_offset The offset from the beginning of the stream + * to seek to. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderSeekStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); + +/** Signature for the tell callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder wants to know the current position of the + * stream. The callback should return the byte offset from the + * beginning of the stream. + * + * Here is an example of a tell callback for stdio streams: + * \code + * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * off_t pos; + * if(file == stdin) + * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + * else if((pos = ftello(file)) < 0) + * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + * else { + * *absolute_byte_offset = (FLAC__uint64)pos; + * return FLAC__STREAM_DECODER_TELL_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param absolute_byte_offset A pointer to storage for the current offset + * from the beginning of the stream. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderTellStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + +/** Signature for the length callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder wants to know the total length of the stream + * in bytes. + * + * Here is an example of a length callback for stdio streams: + * \code + * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * struct stat filestats; + * + * if(file == stdin) + * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + * else if(fstat(fileno(file), &filestats) != 0) + * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + * else { + * *stream_length = (FLAC__uint64)filestats.st_size; + * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param stream_length A pointer to storage for the length of the stream + * in bytes. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderLengthStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); + +/** Signature for the EOF callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs to know if the end of the stream has + * been reached. + * + * Here is an example of a EOF callback for stdio streams: + * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) + * \code + * { + * FILE *file = ((MyClientData*)client_data)->file; + * return feof(file)? true : false; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__bool + * \c true if the currently at the end of the stream, else \c false. + */ +typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); + +/** Signature for the write callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called when the decoder has decoded a + * single audio frame. The decoder will pass the frame metadata as well + * as an array of pointers (one for each channel) pointing to the + * decoded audio. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param frame The description of the decoded frame. See + * FLAC__Frame. + * \param buffer An array of pointers to decoded channels of data. + * Each pointer will point to an array of signed + * samples of length \a frame->header.blocksize. + * Channels will be ordered according to the FLAC + * specification; see the documentation for the + * frame header. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderWriteStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); + +/** Signature for the metadata callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called when the decoder has decoded a + * metadata block. In a valid FLAC file there will always be one + * \c STREAMINFO block, followed by zero or more other metadata blocks. + * These will be supplied by the decoder in the same order as they + * appear in the stream and always before the first audio frame (i.e. + * write callback). The metadata block that is passed in must not be + * modified, and it doesn't live beyond the callback, so you should make + * a copy of it with FLAC__metadata_object_clone() if you will need it + * elsewhere. Since metadata blocks can potentially be large, by + * default the decoder only calls the metadata callback for the + * \c STREAMINFO block; you can instruct the decoder to pass or filter + * other blocks with FLAC__stream_decoder_set_metadata_*() calls. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param metadata The decoded metadata block. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + */ +typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); + +/** Signature for the error callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called whenever an error occurs during + * decoding. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param status The error encountered by the decoder. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + */ +typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +/** Create a new stream decoder instance. The instance is created with + * default settings; see the individual FLAC__stream_decoder_set_*() + * functions for each setting's default. + * + * \retval FLAC__StreamDecoder* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); + +/** Free a decoder instance. Deletes the object pointed to by \a decoder. + * + * \param decoder A pointer to an existing decoder. + * \assert + * \code decoder != NULL \endcode + */ +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); + + +/*********************************************************************** + * + * Public class method prototypes + * + ***********************************************************************/ + +/** Set the serial number for the FLAC stream within the Ogg container. + * The default behavior is to use the serial number of the first Ogg + * page. Setting a serial number here will explicitly specify which + * stream is to be decoded. + * + * \note + * This does not need to be set for native FLAC decoding. + * + * \default \c use serial number of first page + * \param decoder A decoder instance to set. + * \param serial_number See above. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); + +/** Set the "MD5 signature checking" flag. If \c true, the decoder will + * compute the MD5 signature of the unencoded audio data while decoding + * and compare it to the signature from the STREAMINFO block, if it + * exists, during FLAC__stream_decoder_finish(). + * + * MD5 signature checking will be turned off (until the next + * FLAC__stream_decoder_reset()) if there is no signature in the + * STREAMINFO block or when a seek is attempted. + * + * Clients that do not use the MD5 check should leave this off to speed + * up decoding. + * + * \default \c false + * \param decoder A decoder instance to set. + * \param value Flag value (see above). + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); + +/** Direct the decoder to pass on all metadata blocks of type \a type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param type See above. + * \assert + * \code decoder != NULL \endcode + * \a type is valid + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); + +/** Direct the decoder to pass on all APPLICATION metadata blocks of the + * given \a id. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param id See above. + * \assert + * \code decoder != NULL \endcode + * \code id != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); + +/** Direct the decoder to pass on all metadata blocks of any type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); + +/** Direct the decoder to filter out all metadata blocks of type \a type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param type See above. + * \assert + * \code decoder != NULL \endcode + * \a type is valid + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); + +/** Direct the decoder to filter out all APPLICATION metadata blocks of + * the given \a id. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param id See above. + * \assert + * \code decoder != NULL \endcode + * \code id != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); + +/** Direct the decoder to filter out all metadata blocks of any type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); + +/** Get the current decoder state. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderState + * The current decoder state. + */ +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); + +/** Get the current decoder state as a C string. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval const char * + * The decoder state as a C string. Do not modify the contents. + */ +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); + +/** Get the "MD5 signature checking" flag. + * This is the value of the setting, not whether or not the decoder is + * currently checking the MD5 (remember, it can be turned off automatically + * by a seek). When the decoder is reset the flag will be restored to the + * value returned by this function. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); + +/** Get the total number of samples in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the \c STREAMINFO block. A value of \c 0 means "unknown". + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); + +/** Get the current number of channels in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); + +/** Get the current channel assignment in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__ChannelAssignment + * See above. + */ +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); + +/** Get the current sample resolution in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); + +/** Get the current sample rate in Hz of the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); + +/** Get the current blocksize of the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); + +/** Returns the decoder's current read position within the stream. + * The position is the byte offset from the start of the stream. + * Bytes before this position have been fully decoded. Note that + * there may still be undecoded bytes in the decoder's read FIFO. + * The returned position is correct even after a seek. + * + * \warning This function currently only works for native FLAC, + * not Ogg FLAC streams. + * + * \param decoder A decoder instance to query. + * \param position Address at which to return the desired position. + * \assert + * \code decoder != NULL \endcode + * \code position != NULL \endcode + * \retval FLAC__bool + * \c true if successful, \c false if the stream is not native FLAC, + * or there was an error from the 'tell' callback or it returned + * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); + +/** Initialize the decoder instance to decode native FLAC streams. + * + * This flavor of initialization sets up the decoder to decode from a + * native FLAC stream. I/O is performed via callbacks to the client. + * For decoding from a plain file via filename or open FILE*, + * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() + * provide a simpler interface. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param read_callback See FLAC__StreamDecoderReadCallback. This + * pointer must not be \c NULL. + * \param seek_callback See FLAC__StreamDecoderSeekCallback. This + * pointer may be \c NULL if seeking is not + * supported. If \a seek_callback is not \c NULL then a + * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + * Alternatively, a dummy seek callback that just + * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param tell_callback See FLAC__StreamDecoderTellCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a tell_callback must also be supplied. + * Alternatively, a dummy tell callback that just + * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param length_callback See FLAC__StreamDecoderLengthCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a length_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param eof_callback See FLAC__StreamDecoderEofCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a eof_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c false + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC streams. + * + * This flavor of initialization sets up the decoder to decode from a + * FLAC stream in an Ogg container. I/O is performed via callbacks to the + * client. For decoding from a plain file via filename or open FILE*, + * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() + * provide a simpler interface. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param read_callback See FLAC__StreamDecoderReadCallback. This + * pointer must not be \c NULL. + * \param seek_callback See FLAC__StreamDecoderSeekCallback. This + * pointer may be \c NULL if seeking is not + * supported. If \a seek_callback is not \c NULL then a + * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + * Alternatively, a dummy seek callback that just + * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param tell_callback See FLAC__StreamDecoderTellCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a tell_callback must also be supplied. + * Alternatively, a dummy tell callback that just + * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param length_callback See FLAC__StreamDecoderLengthCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a length_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param eof_callback See FLAC__StreamDecoderEofCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a eof_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c false + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode native FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a + * plain native FLAC file. For non-stdio streams, you must use + * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param file An open FLAC file. The file should have been + * opened with mode \c "rb" and rewound. The file + * becomes owned by the decoder and should not be + * manipulated by the client while decoding. + * Unless \a file is \c stdin, it will be closed + * when FLAC__stream_decoder_finish() is called. + * Note however that seeking will not work when + * decoding from \c stdout since it is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \code file != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a + * plain Ogg FLAC file. For non-stdio streams, you must use + * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param file An open FLAC file. The file should have been + * opened with mode \c "rb" and rewound. The file + * becomes owned by the decoder and should not be + * manipulated by the client while decoding. + * Unless \a file is \c stdin, it will be closed + * when FLAC__stream_decoder_finish() is called. + * Note however that seeking will not work when + * decoding from \c stdout since it is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \code file != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode native FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a plain + * native FLAC file. If POSIX fopen() semantics are not sufficient, (for + * example, with Unicode filenames on Windows), you must use + * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() + * and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param filename The name of the file to decode from. The file will + * be opened with fopen(). Use \c NULL to decode from + * \c stdin. Note that \c stdin is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a plain + * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for + * example, with Unicode filenames on Windows), you must use + * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() + * and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param filename The name of the file to decode from. The file will + * be opened with fopen(). Use \c NULL to decode from + * \c stdin. Note that \c stdin is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Finish the decoding process. + * Flushes the decoding buffer, releases resources, resets the decoder + * settings to their defaults, and returns the decoder state to + * FLAC__STREAM_DECODER_UNINITIALIZED. + * + * In the event of a prematurely-terminated decode, it is not strictly + * necessary to call this immediately before FLAC__stream_decoder_delete() + * but it is good practice to match every FLAC__stream_decoder_init_*() + * with a FLAC__stream_decoder_finish(). + * + * \param decoder An uninitialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if MD5 checking is on AND a STREAMINFO block was available + * AND the MD5 signature in the STREAMINFO block was non-zero AND the + * signature does not match the one computed by the decoder; else + * \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); + +/** Flush the stream input. + * The decoder's input buffer will be cleared and the state set to + * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn + * off MD5 checking. + * + * \param decoder A decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false if a memory allocation + * error occurs (in which case the state will be set to + * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); + +/** Reset the decoding process. + * The decoder's input buffer will be cleared and the state set to + * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to + * FLAC__stream_decoder_finish() except that the settings are + * preserved; there is no need to call FLAC__stream_decoder_init_*() + * before decoding again. MD5 checking will be restored to its original + * setting. + * + * If the decoder is seekable, or was initialized with + * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), + * the decoder will also attempt to seek to the beginning of the file. + * If this rewind fails, this function will return \c false. It follows + * that FLAC__stream_decoder_reset() cannot be used when decoding from + * \c stdin. + * + * If the decoder was initialized with FLAC__stream_encoder_init*_stream() + * and is not seekable (i.e. no seek callback was provided or the seek + * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it + * is the duty of the client to start feeding data from the beginning of + * the stream on the next FLAC__stream_decoder_process() or + * FLAC__stream_decoder_process_interleaved() call. + * + * \param decoder A decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false if a memory allocation occurs + * (in which case the state will be set to + * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error + * occurs (the state will be unchanged). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); + +/** Decode one metadata block or audio frame. + * This version instructs the decoder to decode a either a single metadata + * block or a single frame and stop, unless the callbacks return a fatal + * error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * As the decoder needs more input it will call the read callback. + * Depending on what was decoded, the metadata or write callback will be + * called with the decoded metadata block or audio frame. + * + * Unless there is a fatal read error or end of stream, this function + * will return once one whole frame is decoded. In other words, if the + * stream is not synchronized or points to a corrupt frame header, the + * decoder will continue to try and resync until it gets to a valid + * frame, then decode one frame, then return. If the decoder points to + * a frame whose frame CRC in the frame footer does not match the + * computed frame CRC, this function will issue a + * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the + * error callback, and return, having decoded one complete, although + * corrupt, frame. (Such corrupted frames are sent as silence of the + * correct length to the write callback.) + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); + +/** Decode until the end of the metadata. + * This version instructs the decoder to decode from the current position + * and continue until all the metadata has been read, or until the + * callbacks return a fatal error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * As the decoder needs more input it will call the read callback. + * As each metadata block is decoded, the metadata callback will be called + * with the decoded metadata. + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); + +/** Decode until the end of the stream. + * This version instructs the decoder to decode from the current position + * and continue until the end of stream (the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the + * callbacks return a fatal error. + * + * As the decoder needs more input it will call the read callback. + * As each metadata block and frame is decoded, the metadata or write + * callback will be called with the decoded metadata or frame. + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); + +/** Skip one audio frame. + * This version instructs the decoder to 'skip' a single frame and stop, + * unless the callbacks return a fatal error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * The decoding flow is the same as what occurs when + * FLAC__stream_decoder_process_single() is called to process an audio + * frame, except that this function does not decode the parsed data into + * PCM or call the write callback. The integrity of the frame is still + * checked the same way as in the other process functions. + * + * This function will return once one whole frame is skipped, in the + * same way that FLAC__stream_decoder_process_single() will return once + * one whole frame is decoded. + * + * This function can be used in more quickly determining FLAC frame + * boundaries when decoding of the actual data is not needed, for + * example when an application is separating a FLAC stream into frames + * for editing or storing in a container. To do this, the application + * can use FLAC__stream_decoder_skip_single_frame() to quickly advance + * to the next frame, then use + * FLAC__stream_decoder_get_decode_position() to find the new frame + * boundary. + * + * This function should only be called when the stream has advanced + * past all the metadata, otherwise it will return \c false. + * + * \param decoder An initialized decoder instance not in a metadata + * state. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), or if the decoder + * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or + * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); + +/** Flush the input and seek to an absolute sample. + * Decoding will resume at the given sample. Note that because of + * this, the next write callback may contain a partial block. The + * client must support seeking the input or this function will fail + * and return \c false. Furthermore, if the decoder state is + * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed + * with FLAC__stream_decoder_flush() or reset with + * FLAC__stream_decoder_reset() before decoding can continue. + * + * \param decoder A decoder instance. + * \param sample The target sample number to seek to. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h new file mode 100644 index 0000000000..f0fcab569f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h @@ -0,0 +1,1769 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2013 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FLAC__STREAM_ENCODER_H +#define FLAC__STREAM_ENCODER_H + +#include /* for FILE */ +#include "export.h" +#include "format.h" +#include "stream_decoder.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \file include/FLAC/stream_encoder.h + * + * \brief + * This module contains the functions which implement the stream + * encoder. + * + * See the detailed documentation in the + * \link flac_stream_encoder stream encoder \endlink module. + */ + +/** \defgroup flac_encoder FLAC/ \*_encoder.h: encoder interfaces + * \ingroup flac + * + * \brief + * This module describes the encoder layers provided by libFLAC. + * + * The stream encoder can be used to encode complete streams either to the + * client via callbacks, or directly to a file, depending on how it is + * initialized. When encoding via callbacks, the client provides a write + * callback which will be called whenever FLAC data is ready to be written. + * If the client also supplies a seek callback, the encoder will also + * automatically handle the writing back of metadata discovered while + * encoding, like stream info, seek points offsets, etc. When encoding to + * a file, the client needs only supply a filename or open \c FILE* and an + * optional progress callback for periodic notification of progress; the + * write and seek callbacks are supplied internally. For more info see the + * \link flac_stream_encoder stream encoder \endlink module. + */ + +/** \defgroup flac_stream_encoder FLAC/stream_encoder.h: stream encoder interface + * \ingroup flac_encoder + * + * \brief + * This module contains the functions which implement the stream + * encoder. + * + * The stream encoder can encode to native FLAC, and optionally Ogg FLAC + * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. + * + * The basic usage of this encoder is as follows: + * - The program creates an instance of an encoder using + * FLAC__stream_encoder_new(). + * - The program overrides the default settings using + * FLAC__stream_encoder_set_*() functions. At a minimum, the following + * functions should be called: + * - FLAC__stream_encoder_set_channels() + * - FLAC__stream_encoder_set_bits_per_sample() + * - FLAC__stream_encoder_set_sample_rate() + * - FLAC__stream_encoder_set_ogg_serial_number() (if encoding to Ogg FLAC) + * - FLAC__stream_encoder_set_total_samples_estimate() (if known) + * - If the application wants to control the compression level or set its own + * metadata, then the following should also be called: + * - FLAC__stream_encoder_set_compression_level() + * - FLAC__stream_encoder_set_verify() + * - FLAC__stream_encoder_set_metadata() + * - The rest of the set functions should only be called if the client needs + * exact control over how the audio is compressed; thorough understanding + * of the FLAC format is necessary to achieve good results. + * - The program initializes the instance to validate the settings and + * prepare for encoding using + * - FLAC__stream_encoder_init_stream() or FLAC__stream_encoder_init_FILE() + * or FLAC__stream_encoder_init_file() for native FLAC + * - FLAC__stream_encoder_init_ogg_stream() or FLAC__stream_encoder_init_ogg_FILE() + * or FLAC__stream_encoder_init_ogg_file() for Ogg FLAC + * - The program calls FLAC__stream_encoder_process() or + * FLAC__stream_encoder_process_interleaved() to encode data, which + * subsequently calls the callbacks when there is encoder data ready + * to be written. + * - The program finishes the encoding with FLAC__stream_encoder_finish(), + * which causes the encoder to encode any data still in its input pipe, + * update the metadata with the final encoding statistics if output + * seeking is possible, and finally reset the encoder to the + * uninitialized state. + * - The instance may be used again or deleted with + * FLAC__stream_encoder_delete(). + * + * In more detail, the stream encoder functions similarly to the + * \link flac_stream_decoder stream decoder \endlink, but has fewer + * callbacks and more options. Typically the client will create a new + * instance by calling FLAC__stream_encoder_new(), then set the necessary + * parameters with FLAC__stream_encoder_set_*(), and initialize it by + * calling one of the FLAC__stream_encoder_init_*() functions. + * + * Unlike the decoders, the stream encoder has many options that can + * affect the speed and compression ratio. When setting these parameters + * you should have some basic knowledge of the format (see the + * user-level documentation + * or the formal description). The + * FLAC__stream_encoder_set_*() functions themselves do not validate the + * values as many are interdependent. The FLAC__stream_encoder_init_*() + * functions will do this, so make sure to pay attention to the state + * returned by FLAC__stream_encoder_init_*() to make sure that it is + * FLAC__STREAM_ENCODER_INIT_STATUS_OK. Any parameters that are not set + * before FLAC__stream_encoder_init_*() will take on the defaults from + * the constructor. + * + * There are three initialization functions for native FLAC, one for + * setting up the encoder to encode FLAC data to the client via + * callbacks, and two for encoding directly to a file. + * + * For encoding via callbacks, use FLAC__stream_encoder_init_stream(). + * You must also supply a write callback which will be called anytime + * there is raw encoded data to write. If the client can seek the output + * it is best to also supply seek and tell callbacks, as this allows the + * encoder to go back after encoding is finished to write back + * information that was collected while encoding, like seek point offsets, + * frame sizes, etc. + * + * For encoding directly to a file, use FLAC__stream_encoder_init_FILE() + * or FLAC__stream_encoder_init_file(). Then you must only supply a + * filename or open \c FILE*; the encoder will handle all the callbacks + * internally. You may also supply a progress callback for periodic + * notification of the encoding progress. + * + * There are three similarly-named init functions for encoding to Ogg + * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the + * library has been built with Ogg support. + * + * The call to FLAC__stream_encoder_init_*() currently will also immediately + * call the write callback several times, once with the \c fLaC signature, + * and once for each encoded metadata block. Note that for Ogg FLAC + * encoding you will usually get at least twice the number of callbacks than + * with native FLAC, one for the Ogg page header and one for the page body. + * + * After initializing the instance, the client may feed audio data to the + * encoder in one of two ways: + * + * - Channel separate, through FLAC__stream_encoder_process() - The client + * will pass an array of pointers to buffers, one for each channel, to + * the encoder, each of the same length. The samples need not be + * block-aligned, but each channel should have the same number of samples. + * - Channel interleaved, through + * FLAC__stream_encoder_process_interleaved() - The client will pass a single + * pointer to data that is channel-interleaved (i.e. channel0_sample0, + * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). + * Again, the samples need not be block-aligned but they must be + * sample-aligned, i.e. the first value should be channel0_sample0 and + * the last value channelN_sampleM. + * + * Note that for either process call, each sample in the buffers should be a + * signed integer, right-justified to the resolution set by + * FLAC__stream_encoder_set_bits_per_sample(). For example, if the resolution + * is 16 bits per sample, the samples should all be in the range [-32768,32767]. + * + * When the client is finished encoding data, it calls + * FLAC__stream_encoder_finish(), which causes the encoder to encode any + * data still in its input pipe, and call the metadata callback with the + * final encoding statistics. Then the instance may be deleted with + * FLAC__stream_encoder_delete() or initialized again to encode another + * stream. + * + * For programs that write their own metadata, but that do not know the + * actual metadata until after encoding, it is advantageous to instruct + * the encoder to write a PADDING block of the correct size, so that + * instead of rewriting the whole stream after encoding, the program can + * just overwrite the PADDING block. If only the maximum size of the + * metadata is known, the program can write a slightly larger padding + * block, then split it after encoding. + * + * Make sure you understand how lengths are calculated. All FLAC metadata + * blocks have a 4 byte header which contains the type and length. This + * length does not include the 4 bytes of the header. See the format page + * for the specification of metadata blocks and their lengths. + * + * \note + * If you are writing the FLAC data to a file via callbacks, make sure it + * is open for update (e.g. mode "w+" for stdio streams). This is because + * after the first encoding pass, the encoder will try to seek back to the + * beginning of the stream, to the STREAMINFO block, to write some data + * there. (If using FLAC__stream_encoder_init*_file() or + * FLAC__stream_encoder_init*_FILE(), the file is managed internally.) + * + * \note + * The "set" functions may only be called when the encoder is in the + * state FLAC__STREAM_ENCODER_UNINITIALIZED, i.e. after + * FLAC__stream_encoder_new() or FLAC__stream_encoder_finish(), but + * before FLAC__stream_encoder_init_*(). If this is the case they will + * return \c true, otherwise \c false. + * + * \note + * FLAC__stream_encoder_finish() resets all settings to the constructor + * defaults. + * + * \{ + */ + + +/** State values for a FLAC__StreamEncoder. + * + * The encoder's state can be obtained by calling FLAC__stream_encoder_get_state(). + * + * If the encoder gets into any other state besides \c FLAC__STREAM_ENCODER_OK + * or \c FLAC__STREAM_ENCODER_UNINITIALIZED, it becomes invalid for encoding and + * must be deleted with FLAC__stream_encoder_delete(). + */ +typedef enum { + + FLAC__STREAM_ENCODER_OK = 0, + /**< The encoder is in the normal OK state and samples can be processed. */ + + FLAC__STREAM_ENCODER_UNINITIALIZED, + /**< The encoder is in the uninitialized state; one of the + * FLAC__stream_encoder_init_*() functions must be called before samples + * can be processed. + */ + + FLAC__STREAM_ENCODER_OGG_ERROR, + /**< An error occurred in the underlying Ogg layer. */ + + FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR, + /**< An error occurred in the underlying verify stream decoder; + * check FLAC__stream_encoder_get_verify_decoder_state(). + */ + + FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA, + /**< The verify decoder detected a mismatch between the original + * audio signal and the decoded audio signal. + */ + + FLAC__STREAM_ENCODER_CLIENT_ERROR, + /**< One of the callbacks returned a fatal error. */ + + FLAC__STREAM_ENCODER_IO_ERROR, + /**< An I/O error occurred while opening/reading/writing a file. + * Check \c errno. + */ + + FLAC__STREAM_ENCODER_FRAMING_ERROR, + /**< An error occurred while writing the stream; usually, the + * write_callback returned an error. + */ + + FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR + /**< Memory allocation failed. */ + +} FLAC__StreamEncoderState; + +/** Maps a FLAC__StreamEncoderState to a C string. + * + * Using a FLAC__StreamEncoderState as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderStateString[]; + + +/** Possible return values for the FLAC__stream_encoder_init_*() functions. + */ +typedef enum { + + FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0, + /**< Initialization was successful. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR, + /**< General failure to set up encoder; call FLAC__stream_encoder_get_state() for cause. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER, + /**< The library was not compiled with support for the given container + * format. + */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS, + /**< A required callback was not supplied. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS, + /**< The encoder has an invalid setting for number of channels. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE, + /**< The encoder has an invalid setting for bits-per-sample. + * FLAC supports 4-32 bps but the reference encoder currently supports + * only up to 24 bps. + */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE, + /**< The encoder has an invalid setting for the input sample rate. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE, + /**< The encoder has an invalid setting for the block size. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, + /**< The encoder has an invalid setting for the maximum LPC order. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, + /**< The encoder has an invalid setting for the precision of the quantized linear predictor coefficients. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER, + /**< The specified block size is less than the maximum LPC order. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE, + /**< The encoder is bound to the Subset but other settings violate it. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA, + /**< The metadata input to the encoder is invalid, in one of the following ways: + * - FLAC__stream_encoder_set_metadata() was called with a null pointer but a block count > 0 + * - One of the metadata blocks contains an undefined type + * - It contains an illegal CUESHEET as checked by FLAC__format_cuesheet_is_legal() + * - It contains an illegal SEEKTABLE as checked by FLAC__format_seektable_is_legal() + * - It contains more than one SEEKTABLE block or more than one VORBIS_COMMENT block + */ + + FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED + /**< FLAC__stream_encoder_init_*() was called when the encoder was + * already initialized, usually because + * FLAC__stream_encoder_finish() was not called. + */ + +} FLAC__StreamEncoderInitStatus; + +/** Maps a FLAC__StreamEncoderInitStatus to a C string. + * + * Using a FLAC__StreamEncoderInitStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderInitStatusString[]; + + +/** Return values for the FLAC__StreamEncoder read callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE, + /**< The read was OK and decoding can continue. */ + + FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM, + /**< The read was attempted at the end of the stream. */ + + FLAC__STREAM_ENCODER_READ_STATUS_ABORT, + /**< An unrecoverable error occurred. */ + + FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED + /**< Client does not support reading back from the output. */ + +} FLAC__StreamEncoderReadStatus; + +/** Maps a FLAC__StreamEncoderReadStatus to a C string. + * + * Using a FLAC__StreamEncoderReadStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderReadStatusString[]; + + +/** Return values for the FLAC__StreamEncoder write callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0, + /**< The write was OK and encoding can continue. */ + + FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR + /**< An unrecoverable error occurred. The encoder will return from the process call. */ + +} FLAC__StreamEncoderWriteStatus; + +/** Maps a FLAC__StreamEncoderWriteStatus to a C string. + * + * Using a FLAC__StreamEncoderWriteStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[]; + + +/** Return values for the FLAC__StreamEncoder seek callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_SEEK_STATUS_OK, + /**< The seek was OK and encoding can continue. */ + + FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR, + /**< An unrecoverable error occurred. */ + + FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamEncoderSeekStatus; + +/** Maps a FLAC__StreamEncoderSeekStatus to a C string. + * + * Using a FLAC__StreamEncoderSeekStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[]; + + +/** Return values for the FLAC__StreamEncoder tell callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_TELL_STATUS_OK, + /**< The tell was OK and encoding can continue. */ + + FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, + /**< An unrecoverable error occurred. */ + + FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamEncoderTellStatus; + +/** Maps a FLAC__StreamEncoderTellStatus to a C string. + * + * Using a FLAC__StreamEncoderTellStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderTellStatusString[]; + + +/*********************************************************************** + * + * class FLAC__StreamEncoder + * + ***********************************************************************/ + +struct FLAC__StreamEncoderProtected; +struct FLAC__StreamEncoderPrivate; +/** The opaque structure definition for the stream encoder type. + * See the \link flac_stream_encoder stream encoder module \endlink + * for a detailed description. + */ +typedef struct { + struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ + struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ +} FLAC__StreamEncoder; + +/** Signature for the read callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_encoder_init_ogg_stream() if seeking is supported. + * The supplied function will be called when the encoder needs to read back + * encoded data. This happens during the metadata callback, when the encoder + * has to read, modify, and rewrite the metadata (e.g. seekpoints) gathered + * while encoding. The address of the buffer to be filled is supplied, along + * with the number of bytes the buffer can hold. The callback may choose to + * supply less data and modify the byte count but must be careful not to + * overflow the buffer. The callback then returns a status code chosen from + * FLAC__StreamEncoderReadStatus. + * + * Here is an example of a read callback for stdio streams: + * \code + * FLAC__StreamEncoderReadStatus read_cb(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(*bytes > 0) { + * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); + * if(ferror(file)) + * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; + * else if(*bytes == 0) + * return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; + * else + * return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; + * } + * else + * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; + * } + * \endcode + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param buffer A pointer to a location for the callee to store + * data to be encoded. + * \param bytes A pointer to the size of the buffer. On entry + * to the callback, it contains the maximum number + * of bytes that may be stored in \a buffer. The + * callee must set it to the actual number of bytes + * stored (0 in case of error or end-of-stream) before + * returning. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_set_client_data(). + * \retval FLAC__StreamEncoderReadStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderReadStatus (*FLAC__StreamEncoderReadCallback)(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + +/** Signature for the write callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * by the encoder anytime there is raw encoded data ready to write. It may + * include metadata mixed with encoded audio frames and the data is not + * guaranteed to be aligned on frame or metadata block boundaries. + * + * The only duty of the callback is to write out the \a bytes worth of data + * in \a buffer to the current position in the output stream. The arguments + * \a samples and \a current_frame are purely informational. If \a samples + * is greater than \c 0, then \a current_frame will hold the current frame + * number that is being written; otherwise it indicates that the write + * callback is being called to write metadata. + * + * \note + * Unlike when writing to native FLAC, when writing to Ogg FLAC the + * write callback will be called twice when writing each audio + * frame; once for the page header, and once for the page body. + * When writing the page header, the \a samples argument to the + * write callback will be \c 0. + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param buffer An array of encoded data of length \a bytes. + * \param bytes The byte length of \a buffer. + * \param samples The number of samples encoded by \a buffer. + * \c 0 has a special meaning; see above. + * \param current_frame The number of the current frame being encoded. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + * \retval FLAC__StreamEncoderWriteStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderWriteStatus (*FLAC__StreamEncoderWriteCallback)(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); + +/** Signature for the seek callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * when the encoder needs to seek the output stream. The encoder will pass + * the absolute byte offset to seek to, 0 meaning the beginning of the stream. + * + * Here is an example of a seek callback for stdio streams: + * \code + * FLAC__StreamEncoderSeekStatus seek_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(file == stdin) + * return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; + * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + * return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; + * else + * return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; + * } + * \endcode + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param absolute_byte_offset The offset from the beginning of the stream + * to seek to. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + * \retval FLAC__StreamEncoderSeekStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderSeekStatus (*FLAC__StreamEncoderSeekCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); + +/** Signature for the tell callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * when the encoder needs to know the current position of the output stream. + * + * \warning + * The callback must return the true current byte offset of the output to + * which the encoder is writing. If you are buffering the output, make + * sure and take this into account. If you are writing directly to a + * FILE* from your write callback, ftell() is sufficient. If you are + * writing directly to a file descriptor from your write callback, you + * can use lseek(fd, SEEK_CUR, 0). The encoder may later seek back to + * these points to rewrite metadata after encoding. + * + * Here is an example of a tell callback for stdio streams: + * \code + * FLAC__StreamEncoderTellStatus tell_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * off_t pos; + * if(file == stdin) + * return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; + * else if((pos = ftello(file)) < 0) + * return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; + * else { + * *absolute_byte_offset = (FLAC__uint64)pos; + * return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param absolute_byte_offset The address at which to store the current + * position of the output. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + * \retval FLAC__StreamEncoderTellStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderTellStatus (*FLAC__StreamEncoderTellCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + +/** Signature for the metadata callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * once at the end of encoding with the populated STREAMINFO structure. This + * is so the client can seek back to the beginning of the file and write the + * STREAMINFO block with the correct statistics after encoding (like + * minimum/maximum frame size and total samples). + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param metadata The final populated STREAMINFO block. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + */ +typedef void (*FLAC__StreamEncoderMetadataCallback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); + +/** Signature for the progress callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE(). + * The supplied function will be called when the encoder has finished + * writing a frame. The \c total_frames_estimate argument to the + * callback will be based on the value from + * FLAC__stream_encoder_set_total_samples_estimate(). + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param bytes_written Bytes written so far. + * \param samples_written Samples written so far. + * \param frames_written Frames written so far. + * \param total_frames_estimate The estimate of the total number of + * frames to be written. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + */ +typedef void (*FLAC__StreamEncoderProgressCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +/** Create a new stream encoder instance. The instance is created with + * default settings; see the individual FLAC__stream_encoder_set_*() + * functions for each setting's default. + * + * \retval FLAC__StreamEncoder* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void); + +/** Free an encoder instance. Deletes the object pointed to by \a encoder. + * + * \param encoder A pointer to an existing encoder. + * \assert + * \code encoder != NULL \endcode + */ +FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder); + + +/*********************************************************************** + * + * Public class method prototypes + * + ***********************************************************************/ + +/** Set the serial number for the FLAC stream to use in the Ogg container. + * + * \note + * This does not need to be set for native FLAC encoding. + * + * \note + * It is recommended to set a serial number explicitly as the default of '0' + * may collide with other streams. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param serial_number See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long serial_number); + +/** Set the "verify" flag. If \c true, the encoder will verify it's own + * encoded output by feeding it through an internal decoder and comparing + * the original signal against the decoded signal. If a mismatch occurs, + * the process call will return \c false. Note that this will slow the + * encoding process by the extra time required for decoding and comparison. + * + * \default \c false + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Set the Subset flag. If \c true, + * the encoder will comply with the Subset and will check the + * settings during FLAC__stream_encoder_init_*() to see if all settings + * comply. If \c false, the settings may take advantage of the full + * range that the format allows. + * + * Make sure you know what it entails before setting this to \c false. + * + * \default \c true + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Set the number of channels to be encoded. + * + * \default \c 2 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the sample resolution of the input to be encoded. + * + * \warning + * Do not feed the encoder data that is wider than the value you + * set here or you will generate an invalid stream. + * + * \default \c 16 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the sample rate (in Hz) of the input to be encoded. + * + * \default \c 44100 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the compression level + * + * The compression level is roughly proportional to the amount of effort + * the encoder expends to compress the file. A higher level usually + * means more computation but higher compression. The default level is + * suitable for most applications. + * + * Currently the levels range from \c 0 (fastest, least compression) to + * \c 8 (slowest, most compression). A value larger than \c 8 will be + * treated as \c 8. + * + * This function automatically calls the following other \c _set_ + * functions with appropriate values, so the client does not need to + * unless it specifically wants to override them: + * - FLAC__stream_encoder_set_do_mid_side_stereo() + * - FLAC__stream_encoder_set_loose_mid_side_stereo() + * - FLAC__stream_encoder_set_apodization() + * - FLAC__stream_encoder_set_max_lpc_order() + * - FLAC__stream_encoder_set_qlp_coeff_precision() + * - FLAC__stream_encoder_set_do_qlp_coeff_prec_search() + * - FLAC__stream_encoder_set_do_escape_coding() + * - FLAC__stream_encoder_set_do_exhaustive_model_search() + * - FLAC__stream_encoder_set_min_residual_partition_order() + * - FLAC__stream_encoder_set_max_residual_partition_order() + * - FLAC__stream_encoder_set_rice_parameter_search_dist() + * + * The actual values set for each level are: + * + * + * + * + * + * + * + * + * + * + * + * + *
    level + * do mid-side stereo + * loose mid-side stereo + * apodization + * max lpc order + * qlp coeff precision + * qlp coeff prec search + * escape coding + * exhaustive model search + * min residual partition order + * max residual partition order + * rice parameter search dist + *
    0 false false tukey(0.5) 0 0 false false false 0 3 0
    1 true true tukey(0.5) 0 0 false false false 0 3 0
    2 true false tukey(0.5) 0 0 false false false 0 3 0
    3 false false tukey(0.5) 6 0 false false false 0 4 0
    4 true true tukey(0.5) 8 0 false false false 0 4 0
    5 true false tukey(0.5) 8 0 false false false 0 5 0
    6 true false tukey(0.5) 8 0 false false false 0 6 0
    7 true false tukey(0.5) 8 0 false false true 0 6 0
    8 true false tukey(0.5) 12 0 false false true 0 6 0
    + * + * \default \c 5 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the blocksize to use while encoding. + * + * The number of samples to use per frame. Use \c 0 to let the encoder + * estimate a blocksize; this is usually best. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set to \c true to enable mid-side encoding on stereo input. The + * number of channels must be 2 for this to have any effect. Set to + * \c false to use only independent channel coding. + * + * \default \c false + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Set to \c true to enable adaptive switching between mid-side and + * left-right encoding on stereo input. Set to \c false to use + * exhaustive searching. Setting this to \c true requires + * FLAC__stream_encoder_set_do_mid_side_stereo() to also be set to + * \c true in order to have any effect. + * + * \default \c false + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Sets the apodization function(s) the encoder will use when windowing + * audio data for LPC analysis. + * + * The \a specification is a plain ASCII string which specifies exactly + * which functions to use. There may be more than one (up to 32), + * separated by \c ';' characters. Some functions take one or more + * comma-separated arguments in parentheses. + * + * The available functions are \c bartlett, \c bartlett_hann, + * \c blackman, \c blackman_harris_4term_92db, \c connes, \c flattop, + * \c gauss(STDDEV), \c hamming, \c hann, \c kaiser_bessel, \c nuttall, + * \c rectangle, \c triangle, \c tukey(P), \c welch. + * + * For \c gauss(STDDEV), STDDEV specifies the standard deviation + * (0blocksize / (2 ^ order). + * + * Set both min and max values to \c 0 to force a single context, + * whose Rice parameter is based on the residual signal variance. + * Otherwise, set a min and max order, and the encoder will search + * all orders, using the mean of each context for its Rice parameter, + * and use the best. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the maximum partition order to search when coding the residual. + * This is used in tandem with + * FLAC__stream_encoder_set_min_residual_partition_order(). + * + * The partition order determines the context size in the residual. + * The context size will be approximately blocksize / (2 ^ order). + * + * Set both min and max values to \c 0 to force a single context, + * whose Rice parameter is based on the residual signal variance. + * Otherwise, set a min and max order, and the encoder will search + * all orders, using the mean of each context for its Rice parameter, + * and use the best. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); + +/** Deprecated. Setting this value has no effect. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set an estimate of the total samples that will be encoded. + * This is merely an estimate and may be set to \c 0 if unknown. + * This value will be written to the STREAMINFO block before encoding, + * and can remove the need for the caller to rewrite the value later + * if the value is known before encoding. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value); + +/** Set the metadata blocks to be emitted to the stream before encoding. + * A value of \c NULL, \c 0 implies no metadata; otherwise, supply an + * array of pointers to metadata blocks. The array is non-const since + * the encoder may need to change the \a is_last flag inside them, and + * in some cases update seek point offsets. Otherwise, the encoder will + * not modify or free the blocks. It is up to the caller to free the + * metadata blocks after encoding finishes. + * + * \note + * The encoder stores only copies of the pointers in the \a metadata array; + * the metadata blocks themselves must survive at least until after + * FLAC__stream_encoder_finish() returns. Do not free the blocks until then. + * + * \note + * The STREAMINFO block is always written and no STREAMINFO block may + * occur in the supplied array. + * + * \note + * By default the encoder does not create a SEEKTABLE. If one is supplied + * in the \a metadata array, but the client has specified that it does not + * support seeking, then the SEEKTABLE will be written verbatim. However + * by itself this is not very useful as the client will not know the stream + * offsets for the seekpoints ahead of time. In order to get a proper + * seektable the client must support seeking. See next note. + * + * \note + * SEEKTABLE blocks are handled specially. Since you will not know + * the values for the seek point stream offsets, you should pass in + * a SEEKTABLE 'template', that is, a SEEKTABLE object with the + * required sample numbers (or placeholder points), with \c 0 for the + * \a frame_samples and \a stream_offset fields for each point. If the + * client has specified that it supports seeking by providing a seek + * callback to FLAC__stream_encoder_init_stream() or both seek AND read + * callback to FLAC__stream_encoder_init_ogg_stream() (or by using + * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE()), + * then while it is encoding the encoder will fill the stream offsets in + * for you and when encoding is finished, it will seek back and write the + * real values into the SEEKTABLE block in the stream. There are helper + * routines for manipulating seektable template blocks; see metadata.h: + * FLAC__metadata_object_seektable_template_*(). If the client does + * not support seeking, the SEEKTABLE will have inaccurate offsets which + * will slow down or remove the ability to seek in the FLAC stream. + * + * \note + * The encoder instance \b will modify the first \c SEEKTABLE block + * as it transforms the template to a valid seektable while encoding, + * but it is still up to the caller to free all metadata blocks after + * encoding. + * + * \note + * A VORBIS_COMMENT block may be supplied. The vendor string in it + * will be ignored. libFLAC will use it's own vendor string. libFLAC + * will not modify the passed-in VORBIS_COMMENT's vendor string, it + * will simply write it's own into the stream. If no VORBIS_COMMENT + * block is present in the \a metadata array, libFLAC will write an + * empty one, containing only the vendor string. + * + * \note The Ogg FLAC mapping requires that the VORBIS_COMMENT block be + * the second metadata block of the stream. The encoder already supplies + * the STREAMINFO block automatically. If \a metadata does not contain a + * VORBIS_COMMENT block, the encoder will supply that too. Otherwise, if + * \a metadata does contain a VORBIS_COMMENT block and it is not the + * first, the init function will reorder \a metadata by moving the + * VORBIS_COMMENT block to the front; the relative ordering of the other + * blocks will remain as they were. + * + * \note The Ogg FLAC mapping limits the number of metadata blocks per + * stream to \c 65535. If \a num_blocks exceeds this the function will + * return \c false. + * + * \default \c NULL, 0 + * \param encoder An encoder instance to set. + * \param metadata See above. + * \param num_blocks See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + * \c false if the encoder is already initialized, or if + * \a num_blocks > 65535 if encoding to Ogg FLAC, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks); + +/** Get the current encoder state. + * + * \param encoder An encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__StreamEncoderState + * The current encoder state. + */ +FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder); + +/** Get the state of the verify stream decoder. + * Useful when the stream encoder state is + * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. + * + * \param encoder An encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__StreamDecoderState + * The verify stream decoder state. + */ +FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder); + +/** Get the current encoder state as a C string. + * This version automatically resolves + * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR by getting the + * verify decoder's state. + * + * \param encoder A encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval const char * + * The encoder state as a C string. Do not modify the contents. + */ +FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder); + +/** Get relevant values about the nature of a verify decoder error. + * Useful when the stream encoder state is + * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. The arguments should + * be addresses in which the stats will be returned, or NULL if value + * is not desired. + * + * \param encoder An encoder instance to query. + * \param absolute_sample The absolute sample number of the mismatch. + * \param frame_number The number of the frame in which the mismatch occurred. + * \param channel The channel in which the mismatch occurred. + * \param sample The number of the sample (relative to the frame) in + * which the mismatch occurred. + * \param expected The expected value for the sample in question. + * \param got The actual value returned by the decoder. + * \assert + * \code encoder != NULL \endcode + */ +FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); + +/** Get the "verify" flag. + * + * \param encoder An encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * See FLAC__stream_encoder_set_verify(). + */ +FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder); + +/** Get the frame header. + * + * \param encoder An initialized encoder instance in the OK state. + * \param buffer An array of pointers to each channel's signal. + * \param samples The number of samples in one channel. + * \assert + * \code encoder != NULL \endcode + * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode + * \retval FLAC__bool + * \c true if successful, else \c false; in this case, check the + * encoder state with FLAC__stream_encoder_get_state() to see what + * went wrong. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples); + +/** Submit data for encoding. + * This version allows you to supply the input data where the channels + * are interleaved into a single array (i.e. channel0_sample0, + * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). + * The samples need not be block-aligned but they must be + * sample-aligned, i.e. the first value should be channel0_sample0 + * and the last value channelN_sampleM. Each sample should be a signed + * integer, right-justified to the resolution set by + * FLAC__stream_encoder_set_bits_per_sample(). For example, if the + * resolution is 16 bits per sample, the samples should all be in the + * range [-32768,32767]. + * + * For applications where channel order is important, channels must + * follow the order as described in the + * frame header. + * + * \param encoder An initialized encoder instance in the OK state. + * \param buffer An array of channel-interleaved data (see above). + * \param samples The number of samples in one channel, the same as for + * FLAC__stream_encoder_process(). For example, if + * encoding two channels, \c 1000 \a samples corresponds + * to a \a buffer of 2000 values. + * \assert + * \code encoder != NULL \endcode + * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode + * \retval FLAC__bool + * \c true if successful, else \c false; in this case, check the + * encoder state with FLAC__stream_encoder_get_state() to see what + * went wrong. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp new file mode 100644 index 0000000000..2029bc827c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -0,0 +1,954 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +static const char* const aiffFormatName = "AIFF file"; + +//============================================================================== +const char* const AiffAudioFormat::appleOneShot = "apple one shot"; +const char* const AiffAudioFormat::appleRootSet = "apple root set"; +const char* const AiffAudioFormat::appleRootNote = "apple root note"; +const char* const AiffAudioFormat::appleBeats = "apple beats"; +const char* const AiffAudioFormat::appleDenominator = "apple denominator"; +const char* const AiffAudioFormat::appleNumerator = "apple numerator"; +const char* const AiffAudioFormat::appleTag = "apple tag"; +const char* const AiffAudioFormat::appleKey = "apple key"; + +//============================================================================== +namespace AiffFileHelpers +{ + inline int chunkName (const char* name) noexcept { return (int) ByteOrder::littleEndianInt (name); } + + #if JUCE_MSVC + #pragma pack (push, 1) + #endif + + //============================================================================== + struct InstChunk + { + struct Loop + { + uint16 type; // these are different in AIFF and WAV + uint16 startIdentifier; + uint16 endIdentifier; + } JUCE_PACKED; + + int8 baseNote; + int8 detune; + int8 lowNote; + int8 highNote; + int8 lowVelocity; + int8 highVelocity; + int16 gain; + Loop sustainLoop; + Loop releaseLoop; + + void copyTo (StringPairArray& values) const + { + values.set ("MidiUnityNote", String (baseNote)); + values.set ("Detune", String (detune)); + + values.set ("LowNote", String (lowNote)); + values.set ("HighNote", String (highNote)); + values.set ("LowVelocity", String (lowVelocity)); + values.set ("HighVelocity", String (highVelocity)); + + values.set ("Gain", String ((int16) ByteOrder::swapIfLittleEndian ((uint16) gain))); + + values.set ("NumSampleLoops", String (2)); // always 2 with AIFF, WAV can have more + values.set ("Loop0Type", String (ByteOrder::swapIfLittleEndian (sustainLoop.type))); + values.set ("Loop0StartIdentifier", String (ByteOrder::swapIfLittleEndian (sustainLoop.startIdentifier))); + values.set ("Loop0EndIdentifier", String (ByteOrder::swapIfLittleEndian (sustainLoop.endIdentifier))); + values.set ("Loop1Type", String (ByteOrder::swapIfLittleEndian (releaseLoop.type))); + values.set ("Loop1StartIdentifier", String (ByteOrder::swapIfLittleEndian (releaseLoop.startIdentifier))); + values.set ("Loop1EndIdentifier", String (ByteOrder::swapIfLittleEndian (releaseLoop.endIdentifier))); + } + + static uint16 getValue16 (const StringPairArray& values, const char* name, const char* def) + { + return ByteOrder::swapIfLittleEndian ((uint16) values.getValue (name, def).getIntValue()); + } + + static int8 getValue8 (const StringPairArray& values, const char* name, const char* def) + { + return (int8) values.getValue (name, def).getIntValue(); + } + + static void create (MemoryBlock& block, const StringPairArray& values) + { + if (values.getAllKeys().contains ("MidiUnityNote", true)) + { + block.setSize ((sizeof (InstChunk) + 3) & ~(size_t) 3, true); + InstChunk& inst = *static_cast (block.getData()); + + inst.baseNote = getValue8 (values, "MidiUnityNote", "60"); + inst.detune = getValue8 (values, "Detune", "0"); + inst.lowNote = getValue8 (values, "LowNote", "0"); + inst.highNote = getValue8 (values, "HighNote", "127"); + inst.lowVelocity = getValue8 (values, "LowVelocity", "1"); + inst.highVelocity = getValue8 (values, "HighVelocity", "127"); + inst.gain = (int16) getValue16 (values, "Gain", "0"); + + inst.sustainLoop.type = getValue16 (values, "Loop0Type", "0"); + inst.sustainLoop.startIdentifier = getValue16 (values, "Loop0StartIdentifier", "0"); + inst.sustainLoop.endIdentifier = getValue16 (values, "Loop0EndIdentifier", "0"); + inst.releaseLoop.type = getValue16 (values, "Loop1Type", "0"); + inst.releaseLoop.startIdentifier = getValue16 (values, "Loop1StartIdentifier", "0"); + inst.releaseLoop.endIdentifier = getValue16 (values, "Loop1EndIdentifier", "0"); + } + } + + } JUCE_PACKED; + + //============================================================================== + struct BASCChunk + { + enum Key + { + minor = 1, + major = 2, + neither = 3, + both = 4 + }; + + BASCChunk (InputStream& input) + { + zerostruct (*this); + + flags = (uint32) input.readIntBigEndian(); + numBeats = (uint32) input.readIntBigEndian(); + rootNote = (uint16) input.readShortBigEndian(); + key = (uint16) input.readShortBigEndian(); + timeSigNum = (uint16) input.readShortBigEndian(); + timeSigDen = (uint16) input.readShortBigEndian(); + oneShot = (uint16) input.readShortBigEndian(); + input.read (unknown, sizeof (unknown)); + } + + void addToMetadata (StringPairArray& metadata) const + { + const bool rootNoteSet = rootNote != 0; + + setBoolFlag (metadata, AiffAudioFormat::appleOneShot, oneShot == 2); + setBoolFlag (metadata, AiffAudioFormat::appleRootSet, rootNoteSet); + + if (rootNoteSet) + metadata.set (AiffAudioFormat::appleRootNote, String (rootNote)); + + metadata.set (AiffAudioFormat::appleBeats, String (numBeats)); + metadata.set (AiffAudioFormat::appleDenominator, String (timeSigDen)); + metadata.set (AiffAudioFormat::appleNumerator, String (timeSigNum)); + + const char* keyString = nullptr; + + switch (key) + { + case minor: keyString = "major"; break; + case major: keyString = "major"; break; + case neither: keyString = "neither"; break; + case both: keyString = "both"; break; + } + + if (keyString != nullptr) + metadata.set (AiffAudioFormat::appleKey, keyString); + } + + void setBoolFlag (StringPairArray& values, const char* name, bool shouldBeSet) const + { + values.set (name, shouldBeSet ? "1" : "0"); + } + + uint32 flags; + uint32 numBeats; + uint16 rootNote; + uint16 key; + uint16 timeSigNum; + uint16 timeSigDen; + uint16 oneShot; + uint8 unknown[66]; + } JUCE_PACKED; + + #if JUCE_MSVC + #pragma pack (pop) + #endif + + //============================================================================== + static String readCATEChunk (InputStream& input, const uint32 length) + { + MemoryBlock mb; + input.skipNextBytes (4); + input.readIntoMemoryBlock (mb, (ssize_t) length - 4); + + static const char* appleGenres[] = + { + "Rock/Blues", + "Electronic/Dance", + "Jazz", + "Urban", + "World/Ethnic", + "Cinematic/New Age", + "Orchestral", + "Country/Folk", + "Experimental", + "Other Genre", + nullptr + }; + + const StringArray genres (appleGenres); + StringArray tagsArray; + + int bytesLeft = (int) mb.getSize(); + const char* data = static_cast (mb.getData()); + + while (bytesLeft > 0) + { + const String tag (CharPointer_UTF8 (data), + CharPointer_UTF8 (data + bytesLeft)); + + if (tag.isNotEmpty()) + tagsArray.add (data); + + const int numBytesInTag = genres.contains (tag) ? 118 : 50; + data += numBytesInTag; + bytesLeft -= numBytesInTag; + } + + return tagsArray.joinIntoString (";"); + } + + //============================================================================== + namespace MarkChunk + { + static bool metaDataContainsZeroIdentifiers (const StringPairArray& values) + { + // (zero cue identifiers are valid for WAV but not for AIFF) + const String cueString ("Cue"); + const String noteString ("CueNote"); + const String identifierString ("Identifier"); + + const StringArray& keys = values.getAllKeys(); + + for (int i = 0; i < keys.size(); ++i) + { + const String key (keys[i]); + + if (key.startsWith (noteString)) + continue; // zero identifier IS valid in a COMT chunk + + if (key.startsWith (cueString) && key.contains (identifierString)) + { + const int value = values.getValue (key, "-1").getIntValue(); + + if (value == 0) + return true; + } + } + + return false; + } + + static void create (MemoryBlock& block, const StringPairArray& values) + { + const int numCues = values.getValue ("NumCuePoints", "0").getIntValue(); + + if (numCues > 0) + { + MemoryOutputStream out (block, false); + + out.writeShortBigEndian ((short) numCues); + + const int numCueLabels = values.getValue ("NumCueLabels", "0").getIntValue(); + const int idOffset = metaDataContainsZeroIdentifiers (values) ? 1 : 0; // can't have zero IDs in AIFF + + #if JUCE_DEBUG + Array identifiers; + #endif + + for (int i = 0; i < numCues; ++i) + { + const String prefixCue ("Cue" + String (i)); + const int identifier = idOffset + values.getValue (prefixCue + "Identifier", "1").getIntValue(); + + #if JUCE_DEBUG + jassert (! identifiers.contains (identifier)); + identifiers.add (identifier); + #endif + + const int offset = values.getValue (prefixCue + "Offset", "0").getIntValue(); + String label ("CueLabel" + String (i)); + + for (int labelIndex = 0; labelIndex < numCueLabels; ++labelIndex) + { + const String prefixLabel ("CueLabel" + String (labelIndex)); + const int labelIdentifier = idOffset + values.getValue (prefixLabel + "Identifier", "1").getIntValue(); + + if (labelIdentifier == identifier) + { + label = values.getValue (prefixLabel + "Text", label); + break; + } + } + + out.writeShortBigEndian ((short) identifier); + out.writeIntBigEndian (offset); + + const size_t labelLength = jmin ((size_t) 254, label.getNumBytesAsUTF8()); // seems to need null terminator even though it's a pstring + out.writeByte ((char) labelLength + 1); + out.write (label.toUTF8(), labelLength); + out.writeByte (0); + } + + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); + } + } + } + + //============================================================================== + namespace COMTChunk + { + static void create (MemoryBlock& block, const StringPairArray& values) + { + const int numNotes = values.getValue ("NumCueNotes", "0").getIntValue(); + + if (numNotes > 0) + { + MemoryOutputStream out (block, false); + out.writeShortBigEndian ((short) numNotes); + + for (int i = 0; i < numNotes; ++i) + { + const String prefix ("CueNote" + String (i)); + + out.writeIntBigEndian (values.getValue (prefix + "TimeStamp", "0").getIntValue()); + out.writeShortBigEndian ((short) values.getValue (prefix + "Identifier", "0").getIntValue()); + + const String comment (values.getValue (prefix + "Text", String())); + + const size_t commentLength = jmin (comment.getNumBytesAsUTF8(), (size_t) 65534); + out.writeShortBigEndian ((short) commentLength + 1); + out.write (comment.toUTF8(), commentLength); + out.writeByte (0); + + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); + } + } + } + } +} + +//============================================================================== +class AiffAudioFormatReader : public AudioFormatReader +{ +public: + AiffAudioFormatReader (InputStream* in) + : AudioFormatReader (in, aiffFormatName) + { + using namespace AiffFileHelpers; + + if (input->readInt() == chunkName ("FORM")) + { + const int len = input->readIntBigEndian(); + const int64 end = input->getPosition() + len; + + const int nextType = input->readInt(); + if (nextType == chunkName ("AIFF") || nextType == chunkName ("AIFC")) + { + bool hasGotVer = false; + bool hasGotData = false; + bool hasGotType = false; + + while (input->getPosition() < end) + { + const int type = input->readInt(); + const uint32 length = (uint32) input->readIntBigEndian(); + const int64 chunkEnd = input->getPosition() + length; + + if (type == chunkName ("FVER")) + { + hasGotVer = true; + + const int ver = input->readIntBigEndian(); + if (ver != 0 && ver != (int) 0xa2805140) + break; + } + else if (type == chunkName ("COMM")) + { + hasGotType = true; + + numChannels = (unsigned int) input->readShortBigEndian(); + lengthInSamples = input->readIntBigEndian(); + bitsPerSample = (unsigned int) input->readShortBigEndian(); + bytesPerFrame = (int) ((numChannels * bitsPerSample) >> 3); + + unsigned char sampleRateBytes[10]; + input->read (sampleRateBytes, 10); + const int byte0 = sampleRateBytes[0]; + + if ((byte0 & 0x80) != 0 + || byte0 <= 0x3F || byte0 > 0x40 + || (byte0 == 0x40 && sampleRateBytes[1] > 0x1C)) + break; + + unsigned int sampRate = ByteOrder::bigEndianInt (sampleRateBytes + 2); + sampRate >>= (16414 - ByteOrder::bigEndianShort (sampleRateBytes)); + sampleRate = (int) sampRate; + + if (length <= 18) + { + // some types don't have a chunk large enough to include a compression + // type, so assume it's just big-endian pcm + littleEndian = false; + } + else + { + const int compType = input->readInt(); + + if (compType == chunkName ("NONE") || compType == chunkName ("twos")) + { + littleEndian = false; + } + else if (compType == chunkName ("sowt")) + { + littleEndian = true; + } + else if (compType == chunkName ("fl32") || compType == chunkName ("FL32")) + { + littleEndian = false; + usesFloatingPointData = true; + } + else + { + sampleRate = 0; + break; + } + } + } + else if (type == chunkName ("SSND")) + { + hasGotData = true; + + const int offset = input->readIntBigEndian(); + dataChunkStart = input->getPosition() + 4 + offset; + lengthInSamples = (bytesPerFrame > 0) ? jmin (lengthInSamples, ((int64) length) / (int64) bytesPerFrame) : 0; + } + else if (type == chunkName ("MARK")) + { + const uint16 numCues = (uint16) input->readShortBigEndian(); + + // these two are always the same for AIFF-read files + metadataValues.set ("NumCuePoints", String (numCues)); + metadataValues.set ("NumCueLabels", String (numCues)); + + for (uint16 i = 0; i < numCues; ++i) + { + uint16 identifier = (uint16) input->readShortBigEndian(); + uint32 offset = (uint32) input->readIntBigEndian(); + uint8 stringLength = (uint8) input->readByte(); + MemoryBlock textBlock; + input->readIntoMemoryBlock (textBlock, stringLength); + + // if the stringLength is even then read one more byte as the + // string needs to be an even number of bytes INCLUDING the + // leading length character in the pascal string + if ((stringLength & 1) == 0) + input->readByte(); + + const String prefixCue ("Cue" + String (i)); + metadataValues.set (prefixCue + "Identifier", String (identifier)); + metadataValues.set (prefixCue + "Offset", String (offset)); + + const String prefixLabel ("CueLabel" + String (i)); + metadataValues.set (prefixLabel + "Identifier", String (identifier)); + metadataValues.set (prefixLabel + "Text", textBlock.toString()); + } + } + else if (type == chunkName ("COMT")) + { + const uint16 numNotes = (uint16) input->readShortBigEndian(); + metadataValues.set ("NumCueNotes", String (numNotes)); + + for (uint16 i = 0; i < numNotes; ++i) + { + uint32 timestamp = (uint32) input->readIntBigEndian(); + uint16 identifier = (uint16) input->readShortBigEndian(); // may be zero in this case + uint16 stringLength = (uint16) input->readShortBigEndian(); + + MemoryBlock textBlock; + input->readIntoMemoryBlock (textBlock, stringLength + (stringLength & 1)); + + const String prefix ("CueNote" + String (i)); + metadataValues.set (prefix + "TimeStamp", String (timestamp)); + metadataValues.set (prefix + "Identifier", String (identifier)); + metadataValues.set (prefix + "Text", textBlock.toString()); + } + } + else if (type == chunkName ("INST")) + { + HeapBlock inst; + inst.calloc (jmax ((size_t) length + 1, sizeof (InstChunk)), 1); + input->read (inst, (int) length); + inst->copyTo (metadataValues); + } + else if (type == chunkName ("basc")) + { + AiffFileHelpers::BASCChunk (*input).addToMetadata (metadataValues); + } + else if (type == chunkName ("cate")) + { + metadataValues.set (AiffAudioFormat::appleTag, + AiffFileHelpers::readCATEChunk (*input, length));; + } + else if ((hasGotVer && hasGotData && hasGotType) + || chunkEnd < input->getPosition() + || input->isExhausted()) + { + break; + } + + input->setPosition (chunkEnd + (chunkEnd & 1)); // (chunks should be aligned to an even byte address) + } + } + } + + if (metadataValues.size() > 0) + metadataValues.set ("MetaDataSource", "AIFF"); + } + + //============================================================================== + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, lengthInSamples); + + if (numSamples <= 0) + return true; + + input->setPosition (dataChunkStart + startSampleInFile * bytesPerFrame); + + while (numSamples > 0) + { + const int tempBufSize = 480 * 3 * 4; // (keep this a multiple of 3) + char tempBuffer [tempBufSize]; + + const int numThisTime = jmin (tempBufSize / bytesPerFrame, numSamples); + const int bytesRead = input->read (tempBuffer, numThisTime * bytesPerFrame); + + if (bytesRead < numThisTime * bytesPerFrame) + { + jassert (bytesRead >= 0); + zeromem (tempBuffer + bytesRead, (size_t) (numThisTime * bytesPerFrame - bytesRead)); + } + + if (littleEndian) + copySampleData (bitsPerSample, usesFloatingPointData, + destSamples, startOffsetInDestBuffer, numDestChannels, + tempBuffer, (int) numChannels, numThisTime); + else + copySampleData (bitsPerSample, usesFloatingPointData, + destSamples, startOffsetInDestBuffer, numDestChannels, + tempBuffer, (int) numChannels, numThisTime); + + startOffsetInDestBuffer += numThisTime; + numSamples -= numThisTime; + } + + return true; + } + + template + static void copySampleData (unsigned int bitsPerSample, const bool usesFloatingPointData, + int* const* destSamples, int startOffsetInDestBuffer, int numDestChannels, + const void* sourceData, int numChannels, int numSamples) noexcept + { + switch (bitsPerSample) + { + case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + case 32: if (usesFloatingPointData) ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); + else ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + default: jassertfalse; break; + } + } + + int bytesPerFrame; + int64 dataChunkStart; + bool littleEndian; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AiffAudioFormatReader) +}; + +//============================================================================== +class AiffAudioFormatWriter : public AudioFormatWriter +{ +public: + AiffAudioFormatWriter (OutputStream* out, double rate, + unsigned int numChans, unsigned int bits, + const StringPairArray& metadataValues) + : AudioFormatWriter (out, aiffFormatName, rate, numChans, bits), + lengthInSamples (0), + bytesWritten (0), + writeFailed (false) + { + using namespace AiffFileHelpers; + + if (metadataValues.size() > 0) + { + // The meta data should have been santised for the AIFF format. + // If it was originally sourced from a WAV file the MetaDataSource + // key should be removed (or set to "AIFF") once this has been done + jassert (metadataValues.getValue ("MetaDataSource", "None") != "WAV"); + + MarkChunk::create (markChunk, metadataValues); + COMTChunk::create (comtChunk, metadataValues); + InstChunk::create (instChunk, metadataValues); + } + + headerPosition = out->getPosition(); + writeHeader(); + } + + ~AiffAudioFormatWriter() + { + if ((bytesWritten & 1) != 0) + output->writeByte (0); + + writeHeader(); + } + + //============================================================================== + bool write (const int** data, int numSamples) override + { + jassert (data != nullptr && *data != nullptr); // the input must contain at least one channel! + + if (writeFailed) + return false; + + const size_t bytes = (size_t) numSamples * numChannels * bitsPerSample / 8; + tempBlock.ensureSize ((size_t) bytes, false); + + switch (bitsPerSample) + { + case 8: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + case 16: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + case 24: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + case 32: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + default: jassertfalse; break; + } + + if (bytesWritten + bytes >= (size_t) 0xfff00000 + || ! output->write (tempBlock.getData(), bytes)) + { + // failed to write to disk, so let's try writing the header. + // If it's just run out of disk space, then if it does manage + // to write the header, we'll still have a useable file.. + writeHeader(); + writeFailed = true; + return false; + } + else + { + bytesWritten += bytes; + lengthInSamples += (uint64) numSamples; + + return true; + } + } + +private: + MemoryBlock tempBlock, markChunk, comtChunk, instChunk; + uint64 lengthInSamples, bytesWritten; + int64 headerPosition; + bool writeFailed; + + void writeHeader() + { + using namespace AiffFileHelpers; + + const bool couldSeekOk = output->setPosition (headerPosition); + (void) couldSeekOk; + + // if this fails, you've given it an output stream that can't seek! It needs + // to be able to seek back to write the header + jassert (couldSeekOk); + + const int headerLen = (int) (54 + (markChunk.getSize() > 0 ? markChunk.getSize() + 8 : 0) + + (comtChunk.getSize() > 0 ? comtChunk.getSize() + 8 : 0) + + (instChunk.getSize() > 0 ? instChunk.getSize() + 8 : 0)); + int audioBytes = (int) (lengthInSamples * ((bitsPerSample * numChannels) / 8)); + audioBytes += (audioBytes & 1); + + output->writeInt (chunkName ("FORM")); + output->writeIntBigEndian (headerLen + audioBytes - 8); + output->writeInt (chunkName ("AIFF")); + output->writeInt (chunkName ("COMM")); + output->writeIntBigEndian (18); + output->writeShortBigEndian ((short) numChannels); + output->writeIntBigEndian ((int) lengthInSamples); + output->writeShortBigEndian ((short) bitsPerSample); + + uint8 sampleRateBytes[10] = { 0 }; + + if (sampleRate <= 1) + { + sampleRateBytes[0] = 0x3f; + sampleRateBytes[1] = 0xff; + sampleRateBytes[2] = 0x80; + } + else + { + int mask = 0x40000000; + sampleRateBytes[0] = 0x40; + + if (sampleRate >= mask) + { + jassertfalse; + sampleRateBytes[1] = 0x1d; + } + else + { + int n = (int) sampleRate; + + int i; + for (i = 0; i <= 32 ; ++i) + { + if ((n & mask) != 0) + break; + + mask >>= 1; + } + + n = n << (i + 1); + + sampleRateBytes[1] = (uint8) (29 - i); + sampleRateBytes[2] = (uint8) ((n >> 24) & 0xff); + sampleRateBytes[3] = (uint8) ((n >> 16) & 0xff); + sampleRateBytes[4] = (uint8) ((n >> 8) & 0xff); + sampleRateBytes[5] = (uint8) (n & 0xff); + } + } + + output->write (sampleRateBytes, 10); + + if (markChunk.getSize() > 0) + { + output->writeInt (chunkName ("MARK")); + output->writeIntBigEndian ((int) markChunk.getSize()); + *output << markChunk; + } + + if (comtChunk.getSize() > 0) + { + output->writeInt (chunkName ("COMT")); + output->writeIntBigEndian ((int) comtChunk.getSize()); + *output << comtChunk; + } + + if (instChunk.getSize() > 0) + { + output->writeInt (chunkName ("INST")); + output->writeIntBigEndian ((int) instChunk.getSize()); + *output << instChunk; + } + + output->writeInt (chunkName ("SSND")); + output->writeIntBigEndian (audioBytes + 8); + output->writeInt (0); + output->writeInt (0); + + jassert (output->getPosition() == headerLen); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AiffAudioFormatWriter) +}; + +//============================================================================== +class MemoryMappedAiffReader : public MemoryMappedAudioFormatReader +{ +public: + MemoryMappedAiffReader (const File& f, const AiffAudioFormatReader& reader) + : MemoryMappedAudioFormatReader (f, reader, reader.dataChunkStart, + reader.bytesPerFrame * reader.lengthInSamples, reader.bytesPerFrame), + littleEndian (reader.littleEndian) + { + } + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, lengthInSamples); + + if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) + { + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. + return false; + } + + if (littleEndian) + AiffAudioFormatReader::copySampleData + (bitsPerSample, usesFloatingPointData, destSamples, startOffsetInDestBuffer, + numDestChannels, sampleToPointer (startSampleInFile), (int) numChannels, numSamples); + else + AiffAudioFormatReader::copySampleData + (bitsPerSample, usesFloatingPointData, destSamples, startOffsetInDestBuffer, + numDestChannels, sampleToPointer (startSampleInFile), (int) numChannels, numSamples); + + return true; + } + + void readMaxLevels (int64 startSampleInFile, int64 numSamples, + float& min0, float& max0, float& min1, float& max1) + { + if (numSamples <= 0) + { + min0 = max0 = min1 = max1 = 0; + return; + } + + if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) + { + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. + + min0 = max0 = min1 = max1 = 0; + return; + } + + switch (bitsPerSample) + { + case 8: scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + case 16: scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + case 24: scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + case 32: if (usesFloatingPointData) scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); + else scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + default: jassertfalse; break; + } + } + +private: + const bool littleEndian; + + template + void scanMinAndMax (int64 startSampleInFile, int64 numSamples, + float& min0, float& max0, float& min1, float& max1) const noexcept + { + scanMinAndMax2 (0, startSampleInFile, numSamples, min0, max0); + + if (numChannels > 1) + scanMinAndMax2 (1, startSampleInFile, numSamples, min1, max1); + else + min1 = max1 = 0; + } + + template + void scanMinAndMax2 (int channel, int64 startSampleInFile, int64 numSamples, float& mn, float& mx) const noexcept + { + if (littleEndian) + scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples, mn, mx); + else + scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples, mn, mx); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedAiffReader) +}; + +//============================================================================== +AiffAudioFormat::AiffAudioFormat() : AudioFormat (aiffFormatName, ".aiff .aif") +{ +} + +AiffAudioFormat::~AiffAudioFormat() +{ +} + +Array AiffAudioFormat::getPossibleSampleRates() +{ + const int rates[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; + return Array (rates); +} + +Array AiffAudioFormat::getPossibleBitDepths() +{ + const int depths[] = { 8, 16, 24, 0 }; + return Array (depths); +} + +bool AiffAudioFormat::canDoStereo() { return true; } +bool AiffAudioFormat::canDoMono() { return true; } + +#if JUCE_MAC +bool AiffAudioFormat::canHandleFile (const File& f) +{ + if (AudioFormat::canHandleFile (f)) + return true; + + const OSType type = f.getMacOSType(); + + // (NB: written as hex to avoid four-char-constant warnings) + return type == 0x41494646 /* AIFF */ || type == 0x41494643 /* AIFC */ + || type == 0x61696666 /* aiff */ || type == 0x61696663 /* aifc */; +} +#endif + +AudioFormatReader* AiffAudioFormat::createReaderFor (InputStream* sourceStream, const bool deleteStreamIfOpeningFails) +{ + ScopedPointer w (new AiffAudioFormatReader (sourceStream)); + + if (w->sampleRate > 0 && w->numChannels > 0) + return w.release(); + + if (! deleteStreamIfOpeningFails) + w->input = nullptr; + + return nullptr; +} + +MemoryMappedAudioFormatReader* AiffAudioFormat::createMemoryMappedReader (const File& file) +{ + if (FileInputStream* fin = file.createInputStream()) + { + AiffAudioFormatReader reader (fin); + + if (reader.lengthInSamples > 0) + return new MemoryMappedAiffReader (file, reader); + } + + return nullptr; +} + +AudioFormatWriter* AiffAudioFormat::createWriterFor (OutputStream* out, + double sampleRate, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int /*qualityOptionIndex*/) +{ + if (getPossibleBitDepths().contains (bitsPerSample)) + return new AiffAudioFormatWriter (out, sampleRate, numberOfChannels, (unsigned int) bitsPerSample, metadataValues); + + return nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h new file mode 100644 index 0000000000..01d1484b43 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h @@ -0,0 +1,84 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +//============================================================================== +/** + Reads and Writes AIFF format audio files. + + @see AudioFormat +*/ +class JUCE_API AiffAudioFormat : public AudioFormat +{ +public: + //============================================================================== + /** Creates an format object. */ + AiffAudioFormat(); + + /** Destructor. */ + ~AiffAudioFormat(); + + //============================================================================== + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleOneShot; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleRootSet; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleRootNote; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleBeats; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleDenominator; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleNumerator; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleTag; + /** Metadata property name used when reading a aiff file with a basc chunk. */ + static const char* const appleKey; + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + + #if JUCE_MAC + bool canHandleFile (const File& fileToTest) override; + #endif + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) override; + + MemoryMappedAudioFormatReader* createMemoryMappedReader (const File&) override; + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) override; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AiffAudioFormat) +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp new file mode 100644 index 0000000000..6d3aafa1c8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -0,0 +1,528 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_MAC || JUCE_IOS + +//============================================================================== +namespace +{ + const char* const coreAudioFormatName = "CoreAudio supported file"; + + StringArray findFileExtensionsForCoreAudioCodecs() + { + StringArray extensionsArray; + CFArrayRef extensions = nullptr; + UInt32 sizeOfArray = sizeof (extensions); + + if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, 0, &sizeOfArray, &extensions) == noErr) + { + const CFIndex numValues = CFArrayGetCount (extensions); + + for (CFIndex i = 0; i < numValues; ++i) + extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions, i))); + + CFRelease (extensions); + } + + return extensionsArray; + } +} + +//============================================================================== +const char* const CoreAudioFormat::midiDataBase64 = "midiDataBase64"; +const char* const CoreAudioFormat::tempo = "tempo"; +const char* const CoreAudioFormat::timeSig = "time signature"; +const char* const CoreAudioFormat::keySig = "key signature"; + +//============================================================================== +struct CoreAudioFormatMetatdata +{ + static uint32 chunkName (const char* const name) noexcept { return ByteOrder::bigEndianInt (name); } + + //============================================================================== + struct FileHeader + { + FileHeader (InputStream& input) + { + fileType = (uint32) input.readIntBigEndian(); + fileVersion = (uint16) input.readShortBigEndian(); + fileFlags = (uint16) input.readShortBigEndian(); + } + + uint32 fileType; + uint16 fileVersion; + uint16 fileFlags; + }; + + //============================================================================== + struct ChunkHeader + { + ChunkHeader (InputStream& input) + { + chunkType = (uint32) input.readIntBigEndian(); + chunkSize = (int64) input.readInt64BigEndian(); + } + + uint32 chunkType; + int64 chunkSize; + }; + + //============================================================================== + struct AudioDescriptionChunk + { + AudioDescriptionChunk (InputStream& input) + { + sampleRate = input.readDoubleBigEndian(); + formatID = (uint32) input.readIntBigEndian(); + formatFlags = (uint32) input.readIntBigEndian(); + bytesPerPacket = (uint32) input.readIntBigEndian(); + framesPerPacket = (uint32) input.readIntBigEndian(); + channelsPerFrame = (uint32) input.readIntBigEndian(); + bitsPerChannel = (uint32) input.readIntBigEndian(); + } + + double sampleRate; + uint32 formatID; + uint32 formatFlags; + uint32 bytesPerPacket; + uint32 framesPerPacket; + uint32 channelsPerFrame; + uint32 bitsPerChannel; + }; + + //============================================================================== + struct UserDefinedChunk + { + UserDefinedChunk (InputStream& input, int64 size) + { + // a user defined chunk contains 16 bytes of a UUID first + uuid[1] = input.readInt64BigEndian(); + uuid[0] = input.readInt64BigEndian(); + + input.skipNextBytes (size - 16); + } + + int64 uuid[2]; + }; + + //============================================================================== + static StringPairArray parseMidiChunk (InputStream& input, int64 size) + { + const int64 originalPosition = input.getPosition(); + + MemoryBlock midiBlock; + input.readIntoMemoryBlock (midiBlock, (ssize_t) size); + MemoryInputStream midiInputStream (midiBlock, false); + + StringPairArray midiMetadata; + MidiFile midiFile; + + if (midiFile.readFrom (midiInputStream)) + { + midiMetadata.set (CoreAudioFormat::midiDataBase64, midiBlock.toBase64Encoding()); + + findTempoEvents (midiFile, midiMetadata); + findTimeSigEvents (midiFile, midiMetadata); + findKeySigEvents (midiFile, midiMetadata); + } + + input.setPosition (originalPosition + size); + return midiMetadata; + } + + static void findTempoEvents (MidiFile& midiFile, StringPairArray& midiMetadata) + { + MidiMessageSequence tempoEvents; + midiFile.findAllTempoEvents (tempoEvents); + + const int numTempoEvents = tempoEvents.getNumEvents(); + MemoryOutputStream tempoSequence; + + for (int i = 0; i < numTempoEvents; ++i) + { + const double tempo = getTempoFromTempoMetaEvent (tempoEvents.getEventPointer (i)); + + if (tempo > 0.0) + { + if (i == 0) + midiMetadata.set (CoreAudioFormat::tempo, String (tempo)); + + if (numTempoEvents > 1) + tempoSequence << String (tempo) << ',' << tempoEvents.getEventTime (i) << ';'; + } + } + + if (tempoSequence.getDataSize() > 0) + midiMetadata.set ("tempo sequence", tempoSequence.toUTF8()); + } + + static double getTempoFromTempoMetaEvent (MidiMessageSequence::MidiEventHolder* holder) + { + if (holder != nullptr) + { + const MidiMessage& midiMessage = holder->message; + + if (midiMessage.isTempoMetaEvent()) + { + const double tempoSecondsPerQuarterNote = midiMessage.getTempoSecondsPerQuarterNote(); + + if (tempoSecondsPerQuarterNote > 0.0) + return 60.0 / tempoSecondsPerQuarterNote; + } + } + + return 0.0; + } + + static void findTimeSigEvents (MidiFile& midiFile, StringPairArray& midiMetadata) + { + MidiMessageSequence timeSigEvents; + midiFile.findAllTimeSigEvents (timeSigEvents); + const int numTimeSigEvents = timeSigEvents.getNumEvents(); + + MemoryOutputStream timeSigSequence; + + for (int i = 0; i < numTimeSigEvents; ++i) + { + int numerator, denominator; + timeSigEvents.getEventPointer(i)->message.getTimeSignatureInfo (numerator, denominator); + + String timeSigString; + timeSigString << numerator << '/' << denominator; + + if (i == 0) + midiMetadata.set (CoreAudioFormat::timeSig, timeSigString); + + if (numTimeSigEvents > 1) + timeSigSequence << timeSigString << ',' << timeSigEvents.getEventTime (i) << ';'; + } + + if (timeSigSequence.getDataSize() > 0) + midiMetadata.set ("time signature sequence", timeSigSequence.toUTF8()); + } + + static void findKeySigEvents (MidiFile& midiFile, StringPairArray& midiMetadata) + { + MidiMessageSequence keySigEvents; + midiFile.findAllKeySigEvents (keySigEvents); + const int numKeySigEvents = keySigEvents.getNumEvents(); + + MemoryOutputStream keySigSequence; + + for (int i = 0; i < numKeySigEvents; ++i) + { + const MidiMessage& message (keySigEvents.getEventPointer (i)->message); + const int key = jlimit (0, 14, message.getKeySignatureNumberOfSharpsOrFlats() + 7); + const bool isMajor = message.isKeySignatureMajorKey(); + + static const char* majorKeys[] = { "Cb", "Gb", "Db", "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#" }; + static const char* minorKeys[] = { "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#", "G#", "D#", "A#" }; + + String keySigString (isMajor ? majorKeys[key] + : minorKeys[key]); + + if (! isMajor) + keySigString << 'm'; + + if (i == 0) + midiMetadata.set (CoreAudioFormat::keySig, keySigString); + + if (numKeySigEvents > 1) + keySigSequence << keySigString << ',' << keySigEvents.getEventTime (i) << ';'; + } + + if (keySigSequence.getDataSize() > 0) + midiMetadata.set ("key signature sequence", keySigSequence.toUTF8()); + } + + //============================================================================== + static StringPairArray parseInformationChunk (InputStream& input) + { + StringPairArray infoStrings; + const uint32 numEntries = (uint32) input.readIntBigEndian(); + + for (uint32 i = 0; i < numEntries; ++i) + infoStrings.set (input.readString(), input.readString()); + + return infoStrings; + } + + //============================================================================== + static bool read (InputStream& input, StringPairArray& metadataValues) + { + const int64 originalPos = input.getPosition(); + + const FileHeader cafFileHeader (input); + const bool isCafFile = cafFileHeader.fileType == chunkName ("caff"); + + if (isCafFile) + { + while (! input.isExhausted()) + { + const ChunkHeader chunkHeader (input); + + if (chunkHeader.chunkType == chunkName ("desc")) + { + AudioDescriptionChunk audioDescriptionChunk (input); + } + else if (chunkHeader.chunkType == chunkName ("uuid")) + { + UserDefinedChunk userDefinedChunk (input, chunkHeader.chunkSize); + } + else if (chunkHeader.chunkType == chunkName ("data")) + { + // -1 signifies an unknown data size so the data has to be at the + // end of the file so we must have finished the header + + if (chunkHeader.chunkSize == -1) + break; + + input.skipNextBytes (chunkHeader.chunkSize); + } + else if (chunkHeader.chunkType == chunkName ("midi")) + { + metadataValues.addArray (parseMidiChunk (input, chunkHeader.chunkSize)); + } + else if (chunkHeader.chunkType == chunkName ("info")) + { + metadataValues.addArray (parseInformationChunk (input)); + } + else + { + // we aren't decoding this chunk yet so just skip over it + input.skipNextBytes (chunkHeader.chunkSize); + } + } + } + + input.setPosition (originalPos); + + return isCafFile; + } +}; + +//============================================================================== +class CoreAudioReader : public AudioFormatReader +{ +public: + CoreAudioReader (InputStream* const inp) + : AudioFormatReader (inp, coreAudioFormatName), + ok (false), lastReadPosition (0) + { + usesFloatingPointData = true; + bitsPerSample = 32; + + if (input != nullptr) + CoreAudioFormatMetatdata::read (*input, metadataValues); + + OSStatus status = AudioFileOpenWithCallbacks (this, + &readCallback, + nullptr, // write needs to be null to avoid permisisions errors + &getSizeCallback, + nullptr, // setSize needs to be null to avoid permisisions errors + 0, // AudioFileTypeID inFileTypeHint + &audioFileID); + if (status == noErr) + { + status = ExtAudioFileWrapAudioFileID (audioFileID, false, &audioFileRef); + + if (status == noErr) + { + AudioStreamBasicDescription sourceAudioFormat; + UInt32 audioStreamBasicDescriptionSize = sizeof (AudioStreamBasicDescription); + ExtAudioFileGetProperty (audioFileRef, + kExtAudioFileProperty_FileDataFormat, + &audioStreamBasicDescriptionSize, + &sourceAudioFormat); + + numChannels = sourceAudioFormat.mChannelsPerFrame; + sampleRate = sourceAudioFormat.mSampleRate; + + UInt32 sizeOfLengthProperty = sizeof (int64); + ExtAudioFileGetProperty (audioFileRef, + kExtAudioFileProperty_FileLengthFrames, + &sizeOfLengthProperty, + &lengthInSamples); + + destinationAudioFormat.mSampleRate = sampleRate; + destinationAudioFormat.mFormatID = kAudioFormatLinearPCM; + destinationAudioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsNonInterleaved | kAudioFormatFlagsNativeEndian; + destinationAudioFormat.mBitsPerChannel = sizeof (float) * 8; + destinationAudioFormat.mChannelsPerFrame = numChannels; + destinationAudioFormat.mBytesPerFrame = sizeof (float); + destinationAudioFormat.mFramesPerPacket = 1; + destinationAudioFormat.mBytesPerPacket = destinationAudioFormat.mFramesPerPacket * destinationAudioFormat.mBytesPerFrame; + + status = ExtAudioFileSetProperty (audioFileRef, + kExtAudioFileProperty_ClientDataFormat, + sizeof (AudioStreamBasicDescription), + &destinationAudioFormat); + if (status == noErr) + { + bufferList.malloc (1, sizeof (AudioBufferList) + numChannels * sizeof (AudioBuffer)); + bufferList->mNumberBuffers = numChannels; + ok = true; + } + } + } + } + + ~CoreAudioReader() + { + ExtAudioFileDispose (audioFileRef); + AudioFileClose (audioFileID); + } + + //============================================================================== + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, lengthInSamples); + + if (numSamples <= 0) + return true; + + if (lastReadPosition != startSampleInFile) + { + OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); + if (status != noErr) + return false; + + lastReadPosition = startSampleInFile; + } + + while (numSamples > 0) + { + const int numThisTime = jmin (8192, numSamples); + const size_t numBytes = sizeof (float) * (size_t) numThisTime; + + audioDataBlock.ensureSize (numBytes * numChannels, false); + float* data = static_cast (audioDataBlock.getData()); + + for (int j = (int) numChannels; --j >= 0;) + { + bufferList->mBuffers[j].mNumberChannels = 1; + bufferList->mBuffers[j].mDataByteSize = (UInt32) numBytes; + bufferList->mBuffers[j].mData = data; + data += numThisTime; + } + + UInt32 numFramesToRead = (UInt32) numThisTime; + OSStatus status = ExtAudioFileRead (audioFileRef, &numFramesToRead, bufferList); + if (status != noErr) + return false; + + for (int i = numDestChannels; --i >= 0;) + { + if (destSamples[i] != nullptr) + { + if (i < (int) numChannels) + memcpy (destSamples[i] + startOffsetInDestBuffer, bufferList->mBuffers[i].mData, numBytes); + else + zeromem (destSamples[i] + startOffsetInDestBuffer, numBytes); + } + } + + startOffsetInDestBuffer += numThisTime; + numSamples -= numThisTime; + lastReadPosition += numThisTime; + } + + return true; + } + + bool ok; + +private: + AudioFileID audioFileID; + ExtAudioFileRef audioFileRef; + AudioStreamBasicDescription destinationAudioFormat; + MemoryBlock audioDataBlock; + HeapBlock bufferList; + int64 lastReadPosition; + + static SInt64 getSizeCallback (void* inClientData) + { + return static_cast (inClientData)->input->getTotalLength(); + } + + static OSStatus readCallback (void* inClientData, + SInt64 inPosition, + UInt32 requestCount, + void* buffer, + UInt32* actualCount) + { + CoreAudioReader* const reader = static_cast (inClientData); + + reader->input->setPosition (inPosition); + *actualCount = (UInt32) reader->input->read (buffer, (int) requestCount); + + return noErr; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioReader) +}; + +//============================================================================== +CoreAudioFormat::CoreAudioFormat() + : AudioFormat (coreAudioFormatName, findFileExtensionsForCoreAudioCodecs()) +{ +} + +CoreAudioFormat::~CoreAudioFormat() {} + +Array CoreAudioFormat::getPossibleSampleRates() { return Array(); } +Array CoreAudioFormat::getPossibleBitDepths() { return Array(); } + +bool CoreAudioFormat::canDoStereo() { return true; } +bool CoreAudioFormat::canDoMono() { return true; } + +//============================================================================== +AudioFormatReader* CoreAudioFormat::createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new CoreAudioReader (sourceStream)); + + if (r->ok) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +AudioFormatWriter* CoreAudioFormat::createWriterFor (OutputStream*, + double /*sampleRateToUse*/, + unsigned int /*numberOfChannels*/, + int /*bitsPerSample*/, + const StringPairArray& /*metadataValues*/, + int /*qualityOptionIndex*/) +{ + jassertfalse; // not yet implemented! + return nullptr; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h new file mode 100644 index 0000000000..60bace485d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h @@ -0,0 +1,77 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_MAC || JUCE_IOS || DOXYGEN + +//============================================================================== +/** + OSX and iOS only - This uses the AudioToolbox framework to read any audio + format that the system has a codec for. + + This should be able to understand formats such as mp3, m4a, etc. + + @see AudioFormat + */ +class JUCE_API CoreAudioFormat : public AudioFormat +{ +public: + //============================================================================== + /** Creates a format object. */ + CoreAudioFormat(); + + /** Destructor. */ + ~CoreAudioFormat(); + + //============================================================================== + /** Metadata property name used when reading a caf file with a MIDI chunk. */ + static const char* const midiDataBase64; + /** Metadata property name used when reading a caf file with tempo information. */ + static const char* const tempo; + /** Metadata property name used when reading a caf file time signature information. */ + static const char* const timeSig; + /** Metadata property name used when reading a caf file time signature information. */ + static const char* const keySig; + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream*, + bool deleteStreamIfOpeningFails) override; + + AudioFormatWriter* createWriterFor (OutputStream*, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) override; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioFormat) +}; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp new file mode 100644 index 0000000000..58fdd8fbcf --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -0,0 +1,556 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_FLAC + +namespace FlacNamespace +{ +#if JUCE_INCLUDE_FLAC_CODE || ! defined (JUCE_INCLUDE_FLAC_CODE) + + #undef VERSION + #define VERSION "1.2.1" + + #define FLAC__NO_DLL 1 + + #if JUCE_MSVC + #pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4312 4505 4365 4005 4334 181 111) + #endif + + #if JUCE_MAC + #define FLAC__SYS_DARWIN 1 + #endif + + #ifndef SIZE_MAX + #define SIZE_MAX 0xffffffff + #endif + + #if JUCE_CLANG + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wconversion" + #pragma clang diagnostic ignored "-Wshadow" + #pragma clang diagnostic ignored "-Wdeprecated-register" + #endif + + #if JUCE_INTEL + #if JUCE_32BIT + #define FLAC__CPU_IA32 1 + #endif + #if JUCE_64BIT + #define FLAC__CPU_X86_64 1 + #endif + #define FLAC__HAS_X86INTRIN 1 + #endif + + #undef __STDC_LIMIT_MACROS + #define __STDC_LIMIT_MACROS 1 + #define flac_max jmax + #define flac_min jmin + #include "flac/all.h" + #include "flac/libFLAC/bitmath.c" + #include "flac/libFLAC/bitreader.c" + #include "flac/libFLAC/bitwriter.c" + #include "flac/libFLAC/cpu.c" + #include "flac/libFLAC/crc.c" + #include "flac/libFLAC/fixed.c" + #include "flac/libFLAC/float.c" + #include "flac/libFLAC/format.c" + #include "flac/libFLAC/lpc_flac.c" + #include "flac/libFLAC/md5.c" + #include "flac/libFLAC/memory.c" + #include "flac/libFLAC/stream_decoder.c" + #include "flac/libFLAC/stream_encoder.c" + #include "flac/libFLAC/stream_encoder_framing.c" + #include "flac/libFLAC/window_flac.c" + #undef VERSION +#else + #include +#endif + + #if JUCE_CLANG + #pragma clang diagnostic pop + #endif +} + +#undef max +#undef min + +//============================================================================== +static const char* const flacFormatName = "FLAC file"; + + +//============================================================================== +class FlacReader : public AudioFormatReader +{ +public: + FlacReader (InputStream* const in) + : AudioFormatReader (in, flacFormatName), + reservoirStart (0), + samplesInReservoir (0), + scanningForLength (false) + { + using namespace FlacNamespace; + lengthInSamples = 0; + + decoder = FLAC__stream_decoder_new(); + + ok = FLAC__stream_decoder_init_stream (decoder, + readCallback_, seekCallback_, tellCallback_, lengthCallback_, + eofCallback_, writeCallback_, metadataCallback_, errorCallback_, + this) == FLAC__STREAM_DECODER_INIT_STATUS_OK; + + if (ok) + { + FLAC__stream_decoder_process_until_end_of_metadata (decoder); + + if (lengthInSamples == 0 && sampleRate > 0) + { + // the length hasn't been stored in the metadata, so we'll need to + // work it out the length the hard way, by scanning the whole file.. + scanningForLength = true; + FLAC__stream_decoder_process_until_end_of_stream (decoder); + scanningForLength = false; + const int64 tempLength = lengthInSamples; + + FLAC__stream_decoder_reset (decoder); + FLAC__stream_decoder_process_until_end_of_metadata (decoder); + lengthInSamples = tempLength; + } + } + } + + ~FlacReader() + { + FlacNamespace::FLAC__stream_decoder_delete (decoder); + } + + void useMetadata (const FlacNamespace::FLAC__StreamMetadata_StreamInfo& info) + { + sampleRate = info.sample_rate; + bitsPerSample = info.bits_per_sample; + lengthInSamples = (unsigned int) info.total_samples; + numChannels = info.channels; + + reservoir.setSize ((int) numChannels, 2 * (int) info.max_blocksize, false, false, true); + } + + // returns the number of samples read + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + using namespace FlacNamespace; + + if (! ok) + return false; + + while (numSamples > 0) + { + if (startSampleInFile >= reservoirStart + && startSampleInFile < reservoirStart + samplesInReservoir) + { + const int num = (int) jmin ((int64) numSamples, + reservoirStart + samplesInReservoir - startSampleInFile); + + jassert (num > 0); + + for (int i = jmin (numDestChannels, reservoir.getNumChannels()); --i >= 0;) + if (destSamples[i] != nullptr) + memcpy (destSamples[i] + startOffsetInDestBuffer, + reservoir.getReadPointer (i, (int) (startSampleInFile - reservoirStart)), + sizeof (int) * (size_t) num); + + startOffsetInDestBuffer += num; + startSampleInFile += num; + numSamples -= num; + } + else + { + if (startSampleInFile >= (int) lengthInSamples) + { + samplesInReservoir = 0; + } + else if (startSampleInFile < reservoirStart + || startSampleInFile > reservoirStart + jmax (samplesInReservoir, 511)) + { + // had some problems with flac crashing if the read pos is aligned more + // accurately than this. Probably fixed in newer versions of the library, though. + reservoirStart = (int) (startSampleInFile & ~511); + samplesInReservoir = 0; + FLAC__stream_decoder_seek_absolute (decoder, (FLAC__uint64) reservoirStart); + } + else + { + reservoirStart += samplesInReservoir; + samplesInReservoir = 0; + FLAC__stream_decoder_process_single (decoder); + } + + if (samplesInReservoir == 0) + break; + } + } + + if (numSamples > 0) + { + for (int i = numDestChannels; --i >= 0;) + if (destSamples[i] != nullptr) + zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); + } + + return true; + } + + void useSamples (const FlacNamespace::FLAC__int32* const buffer[], int numSamples) + { + if (scanningForLength) + { + lengthInSamples += numSamples; + } + else + { + if (numSamples > reservoir.getNumSamples()) + reservoir.setSize ((int) numChannels, numSamples, false, false, true); + + const unsigned int bitsToShift = 32 - bitsPerSample; + + for (int i = 0; i < (int) numChannels; ++i) + { + const FlacNamespace::FLAC__int32* src = buffer[i]; + + int n = i; + while (src == 0 && n > 0) + src = buffer [--n]; + + if (src != nullptr) + { + int* const dest = reinterpret_cast (reservoir.getWritePointer(i)); + + for (int j = 0; j < numSamples; ++j) + dest[j] = src[j] << bitsToShift; + } + } + + samplesInReservoir = numSamples; + } + } + + //============================================================================== + static FlacNamespace::FLAC__StreamDecoderReadStatus readCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__byte buffer[], size_t* bytes, void* client_data) + { + using namespace FlacNamespace; + *bytes = (size_t) static_cast (client_data)->input->read (buffer, (int) *bytes); + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + + static FlacNamespace::FLAC__StreamDecoderSeekStatus seekCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64 absolute_byte_offset, void* client_data) + { + using namespace FlacNamespace; + static_cast (client_data)->input->setPosition ((int) absolute_byte_offset); + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + } + + static FlacNamespace::FLAC__StreamDecoderTellStatus tellCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64* absolute_byte_offset, void* client_data) + { + using namespace FlacNamespace; + *absolute_byte_offset = (uint64) static_cast (client_data)->input->getPosition(); + return FLAC__STREAM_DECODER_TELL_STATUS_OK; + } + + static FlacNamespace::FLAC__StreamDecoderLengthStatus lengthCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64* stream_length, void* client_data) + { + using namespace FlacNamespace; + *stream_length = (uint64) static_cast (client_data)->input->getTotalLength(); + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + } + + static FlacNamespace::FLAC__bool eofCallback_ (const FlacNamespace::FLAC__StreamDecoder*, void* client_data) + { + return static_cast (client_data)->input->isExhausted(); + } + + static FlacNamespace::FLAC__StreamDecoderWriteStatus writeCallback_ (const FlacNamespace::FLAC__StreamDecoder*, + const FlacNamespace::FLAC__Frame* frame, + const FlacNamespace::FLAC__int32* const buffer[], + void* client_data) + { + using namespace FlacNamespace; + static_cast (client_data)->useSamples (buffer, (int) frame->header.blocksize); + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } + + static void metadataCallback_ (const FlacNamespace::FLAC__StreamDecoder*, + const FlacNamespace::FLAC__StreamMetadata* metadata, + void* client_data) + { + static_cast (client_data)->useMetadata (metadata->data.stream_info); + } + + static void errorCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__StreamDecoderErrorStatus, void*) + { + } + +private: + FlacNamespace::FLAC__StreamDecoder* decoder; + AudioSampleBuffer reservoir; + int reservoirStart, samplesInReservoir; + bool ok, scanningForLength; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacReader) +}; + + +//============================================================================== +class FlacWriter : public AudioFormatWriter +{ +public: + FlacWriter (OutputStream* const out, double rate, uint32 numChans, uint32 bits, int qualityOptionIndex) + : AudioFormatWriter (out, flacFormatName, rate, numChans, bits) + { + using namespace FlacNamespace; + encoder = FLAC__stream_encoder_new(); + + if (qualityOptionIndex > 0) + FLAC__stream_encoder_set_compression_level (encoder, (uint32) jmin (8, qualityOptionIndex)); + + FLAC__stream_encoder_set_do_mid_side_stereo (encoder, numChannels == 2); + FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, numChannels == 2); + FLAC__stream_encoder_set_channels (encoder, numChannels); + FLAC__stream_encoder_set_bits_per_sample (encoder, jmin ((unsigned int) 24, bitsPerSample)); + FLAC__stream_encoder_set_sample_rate (encoder, (unsigned int) sampleRate); + FLAC__stream_encoder_set_blocksize (encoder, 0); + FLAC__stream_encoder_set_do_escape_coding (encoder, true); + + ok = FLAC__stream_encoder_init_stream (encoder, + encodeWriteCallback, encodeSeekCallback, + encodeTellCallback, encodeMetadataCallback, + this) == FLAC__STREAM_ENCODER_INIT_STATUS_OK; + } + + ~FlacWriter() + { + if (ok) + { + FlacNamespace::FLAC__stream_encoder_finish (encoder); + output->flush(); + } + else + { + output = nullptr; // to stop the base class deleting this, as it needs to be returned + // to the caller of createWriter() + } + + FlacNamespace::FLAC__stream_encoder_delete (encoder); + } + + //============================================================================== + bool write (const int** samplesToWrite, int numSamples) override + { + using namespace FlacNamespace; + if (! ok) + return false; + + HeapBlock channels; + HeapBlock temp; + const int bitsToShift = 32 - (int) bitsPerSample; + + if (bitsToShift > 0) + { + temp.malloc (numChannels * (size_t) numSamples); + channels.calloc (numChannels + 1); + + for (unsigned int i = 0; i < numChannels; ++i) + { + if (samplesToWrite[i] == nullptr) + break; + + int* const destData = temp.getData() + i * (size_t) numSamples; + channels[i] = destData; + + for (int j = 0; j < numSamples; ++j) + destData[j] = (samplesToWrite[i][j] >> bitsToShift); + } + + samplesToWrite = const_cast (channels.getData()); + } + + return FLAC__stream_encoder_process (encoder, (const FLAC__int32**) samplesToWrite, (unsigned) numSamples) != 0; + } + + bool writeData (const void* const data, const int size) const + { + return output->write (data, (size_t) size); + } + + static void packUint32 (FlacNamespace::FLAC__uint32 val, FlacNamespace::FLAC__byte* b, const int bytes) + { + b += bytes; + + for (int i = 0; i < bytes; ++i) + { + *(--b) = (FlacNamespace::FLAC__byte) (val & 0xff); + val >>= 8; + } + } + + void writeMetaData (const FlacNamespace::FLAC__StreamMetadata* metadata) + { + using namespace FlacNamespace; + const FLAC__StreamMetadata_StreamInfo& info = metadata->data.stream_info; + + unsigned char buffer [FLAC__STREAM_METADATA_STREAMINFO_LENGTH]; + const unsigned int channelsMinus1 = info.channels - 1; + const unsigned int bitsMinus1 = info.bits_per_sample - 1; + + packUint32 (info.min_blocksize, buffer, 2); + packUint32 (info.max_blocksize, buffer + 2, 2); + packUint32 (info.min_framesize, buffer + 4, 3); + packUint32 (info.max_framesize, buffer + 7, 3); + buffer[10] = (uint8) ((info.sample_rate >> 12) & 0xff); + buffer[11] = (uint8) ((info.sample_rate >> 4) & 0xff); + buffer[12] = (uint8) (((info.sample_rate & 0x0f) << 4) | (channelsMinus1 << 1) | (bitsMinus1 >> 4)); + buffer[13] = (FLAC__byte) (((bitsMinus1 & 0x0f) << 4) | (unsigned int) ((info.total_samples >> 32) & 0x0f)); + packUint32 ((FLAC__uint32) info.total_samples, buffer + 14, 4); + memcpy (buffer + 18, info.md5sum, 16); + + const bool seekOk = output->setPosition (4); + (void) seekOk; + + // if this fails, you've given it an output stream that can't seek! It needs + // to be able to seek back to write the header + jassert (seekOk); + + output->writeIntBigEndian (FLAC__STREAM_METADATA_STREAMINFO_LENGTH); + output->write (buffer, FLAC__STREAM_METADATA_STREAMINFO_LENGTH); + } + + //============================================================================== + static FlacNamespace::FLAC__StreamEncoderWriteStatus encodeWriteCallback (const FlacNamespace::FLAC__StreamEncoder*, + const FlacNamespace::FLAC__byte buffer[], + size_t bytes, + unsigned int /*samples*/, + unsigned int /*current_frame*/, + void* client_data) + { + using namespace FlacNamespace; + return static_cast (client_data)->writeData (buffer, (int) bytes) + ? FLAC__STREAM_ENCODER_WRITE_STATUS_OK + : FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; + } + + static FlacNamespace::FLAC__StreamEncoderSeekStatus encodeSeekCallback (const FlacNamespace::FLAC__StreamEncoder*, FlacNamespace::FLAC__uint64, void*) + { + using namespace FlacNamespace; + return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; + } + + static FlacNamespace::FLAC__StreamEncoderTellStatus encodeTellCallback (const FlacNamespace::FLAC__StreamEncoder*, FlacNamespace::FLAC__uint64* absolute_byte_offset, void* client_data) + { + using namespace FlacNamespace; + if (client_data == nullptr) + return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; + + *absolute_byte_offset = (FLAC__uint64) static_cast (client_data)->output->getPosition(); + return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + } + + static void encodeMetadataCallback (const FlacNamespace::FLAC__StreamEncoder*, const FlacNamespace::FLAC__StreamMetadata* metadata, void* client_data) + { + static_cast (client_data)->writeMetaData (metadata); + } + + bool ok; + +private: + FlacNamespace::FLAC__StreamEncoder* encoder; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacWriter) +}; + + +//============================================================================== +FlacAudioFormat::FlacAudioFormat() + : AudioFormat (flacFormatName, ".flac") +{ +} + +FlacAudioFormat::~FlacAudioFormat() +{ +} + +Array FlacAudioFormat::getPossibleSampleRates() +{ + const int rates[] = { 8000, 11025, 12000, 16000, 22050, 32000, 44100, 48000, + 88200, 96000, 176400, 192000, 352800, 384000 }; + + return Array (rates, numElementsInArray (rates)); +} + +Array FlacAudioFormat::getPossibleBitDepths() +{ + const int depths[] = { 16, 24 }; + + return Array (depths, numElementsInArray (depths)); +} + +bool FlacAudioFormat::canDoStereo() { return true; } +bool FlacAudioFormat::canDoMono() { return true; } +bool FlacAudioFormat::isCompressed() { return true; } + +AudioFormatReader* FlacAudioFormat::createReaderFor (InputStream* in, const bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new FlacReader (in)); + + if (r->sampleRate > 0) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +AudioFormatWriter* FlacAudioFormat::createWriterFor (OutputStream* out, + double sampleRate, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& /*metadataValues*/, + int qualityOptionIndex) +{ + if (getPossibleBitDepths().contains (bitsPerSample)) + { + ScopedPointer w (new FlacWriter (out, sampleRate, numberOfChannels, + (uint32) bitsPerSample, qualityOptionIndex)); + if (w->ok) + return w.release(); + } + + return nullptr; +} + +StringArray FlacAudioFormat::getQualityOptions() +{ + static const char* options[] = { "0 (Fastest)", "1", "2", "3", "4", "5 (Default)","6", "7", "8 (Highest quality)", 0 }; + return StringArray (options); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h new file mode 100644 index 0000000000..20bf094f9e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h @@ -0,0 +1,65 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_FLAC || defined (DOXYGEN) + +//============================================================================== +/** + Reads and writes the lossless-compression FLAC audio format. + + To compile this, you'll need to set the JUCE_USE_FLAC flag. + + @see AudioFormat +*/ +class JUCE_API FlacAudioFormat : public AudioFormat +{ +public: + //============================================================================== + FlacAudioFormat(); + ~FlacAudioFormat(); + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + bool isCompressed() override; + StringArray getQualityOptions() override; + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) override; + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) override; +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacAudioFormat) +}; + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp new file mode 100644 index 0000000000..8a5263cb12 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp @@ -0,0 +1,222 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_LAME_AUDIO_FORMAT + +class LAMEEncoderAudioFormat::Writer : public AudioFormatWriter +{ +public: + Writer (OutputStream* destStream, const String& formatName, + const File& appFile, int vbr, int cbr, + double sampleRate, unsigned int numberOfChannels, + unsigned int bitsPerSample, const StringPairArray& metadata) + : AudioFormatWriter (destStream, formatName, sampleRate, + numberOfChannels, bitsPerSample), + vbrLevel (vbr), cbrBitrate (cbr), + tempWav (".wav") + { + WavAudioFormat wavFormat; + + if (FileOutputStream* out = tempWav.getFile().createOutputStream()) + { + writer = wavFormat.createWriterFor (out, sampleRate, numChannels, + bitsPerSample, metadata, 0); + + args.add (appFile.getFullPathName()); + + args.add ("--quiet"); + + if (cbrBitrate == 0) + { + args.add ("--vbr-new"); + args.add ("-V"); + args.add (String (vbrLevel)); + } + else + { + args.add ("--cbr"); + args.add ("-b"); + args.add (String (cbrBitrate)); + } + + addMetadataArg (metadata, "id3title", "--tt"); + addMetadataArg (metadata, "id3artist", "--ta"); + addMetadataArg (metadata, "id3album", "--tl"); + addMetadataArg (metadata, "id3comment", "--tc"); + addMetadataArg (metadata, "id3date", "--ty"); + addMetadataArg (metadata, "id3genre", "--tg"); + addMetadataArg (metadata, "id3trackNumber", "--tn"); + } + } + + void addMetadataArg (const StringPairArray& metadata, const char* key, const char* lameFlag) + { + const String value (metadata.getValue (key, String())); + + if (value.isNotEmpty()) + { + args.add (lameFlag); + args.add (value); + } + } + + ~Writer() + { + if (writer != nullptr) + { + writer = nullptr; + + if (! convertToMP3()) + convertToMP3(); // try again + } + } + + bool write (const int** samplesToWrite, int numSamples) + { + return writer != nullptr && writer->write (samplesToWrite, numSamples); + } + +private: + int vbrLevel, cbrBitrate; + TemporaryFile tempWav; + ScopedPointer writer; + StringArray args; + + bool runLameChildProcess (const TemporaryFile& tempMP3, const StringArray& processArgs) const + { + ChildProcess cp; + + if (cp.start (processArgs)) + { + const String childOutput (cp.readAllProcessOutput()); + DBG (childOutput); (void) childOutput; + + cp.waitForProcessToFinish (10000); + return tempMP3.getFile().getSize() > 0; + } + + return false; + } + + bool convertToMP3() const + { + TemporaryFile tempMP3 (".mp3"); + + StringArray args2 (args); + args2.add (tempWav.getFile().getFullPathName()); + args2.add (tempMP3.getFile().getFullPathName()); + + DBG (args2.joinIntoString (" ")); + + if (runLameChildProcess (tempMP3, args2)) + { + FileInputStream fis (tempMP3.getFile()); + + if (fis.openedOk() && output->writeFromInputStream (fis, -1) > 0) + { + output->flush(); + return true; + } + } + + return false; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Writer) +}; + +//============================================================================== +LAMEEncoderAudioFormat::LAMEEncoderAudioFormat (const File& lameApplication) + : AudioFormat ("MP3 file", ".mp3"), + lameApp (lameApplication) +{ +} + +LAMEEncoderAudioFormat::~LAMEEncoderAudioFormat() +{ +} + +bool LAMEEncoderAudioFormat::canHandleFile (const File&) +{ + return false; +} + +Array LAMEEncoderAudioFormat::getPossibleSampleRates() +{ + const int rates[] = { 32000, 44100, 48000, 0 }; + return Array (rates); +} + +Array LAMEEncoderAudioFormat::getPossibleBitDepths() +{ + const int depths[] = { 16, 0 }; + return Array (depths); +} + +bool LAMEEncoderAudioFormat::canDoStereo() { return true; } +bool LAMEEncoderAudioFormat::canDoMono() { return true; } +bool LAMEEncoderAudioFormat::isCompressed() { return true; } + +StringArray LAMEEncoderAudioFormat::getQualityOptions() +{ + static const char* vbrOptions[] = { "VBR quality 0 (best)", "VBR quality 1", "VBR quality 2", "VBR quality 3", + "VBR quality 4 (normal)", "VBR quality 5", "VBR quality 6", "VBR quality 7", + "VBR quality 8", "VBR quality 9 (smallest)", nullptr }; + StringArray opts (vbrOptions); + + const int cbrRates[] = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 }; + + for (int i = 0; i < numElementsInArray (cbrRates); ++i) + opts.add (String (cbrRates[i]) + " Kb/s CBR"); + + return opts; +} + +AudioFormatReader* LAMEEncoderAudioFormat::createReaderFor (InputStream*, const bool) +{ + return nullptr; +} + +AudioFormatWriter* LAMEEncoderAudioFormat::createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) +{ + int vbr = 4; + int cbr = 0; + + const String qual (getQualityOptions() [qualityOptionIndex]); + + if (qual.contains ("VBR")) + vbr = qual.retainCharacters ("0123456789").getIntValue(); + else + cbr = qual.getIntValue(); + + return new Writer (streamToWriteTo, getFormatName(), lameApp, vbr, cbr, + sampleRateToUse, numberOfChannels, bitsPerSample, metadataValues); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h new file mode 100644 index 0000000000..92e581b083 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h @@ -0,0 +1,71 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_LAME_AUDIO_FORMAT || defined (DOXYGEN) + +//============================================================================== +/** + An AudioFormat class which can use an installed version of the LAME mp3 + encoder to encode a file. + + This format can't read MP3s, it just writes them. Internally, the + AudioFormatWriter object that is returned writes the incoming audio data + to a temporary WAV file, and then when the writer is deleted, it invokes + the LAME executable to convert the data to an MP3, whose data is then + piped into the original OutputStream that was used when first creating + the writer. + + @see AudioFormat +*/ +class JUCE_API LAMEEncoderAudioFormat : public AudioFormat +{ +public: + /** Creates a LAMEEncoderAudioFormat that expects to find a working LAME + executable at the location given. + */ + LAMEEncoderAudioFormat (const File& lameExecutableToUse); + ~LAMEEncoderAudioFormat(); + + bool canHandleFile (const File&); + Array getPossibleSampleRates(); + Array getPossibleBitDepths(); + bool canDoStereo(); + bool canDoMono(); + bool isCompressed(); + StringArray getQualityOptions(); + + AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails); + + AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, + unsigned int numberOfChannels, int bitsPerSample, + const StringPairArray& metadataValues, int qualityOptionIndex); + +private: + File lameApp; + class Writer; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LAMEEncoderAudioFormat) +}; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp new file mode 100644 index 0000000000..219c93f709 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp @@ -0,0 +1,3162 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +/* + IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and + to compile this MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, + you are agreeing that Raw Material Software is in no way responsible for any patent, + copyright, or other legal issues that you may suffer as a result. + + The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party + intellectual property. If you wish to use it, please seek your own independent advice about the + legality of doing so. If you are not willing to accept full responsibility for the consequences + of using this code, then do not enable the JUCE_USE_MP3AUDIOFORMAT setting. +*/ +#if JUCE_USE_MP3AUDIOFORMAT + +namespace MP3Decoder +{ + +struct AllocationTable { int16 bits, d; }; + +const struct AllocationTable allocTable0[] = +{ + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767} +}; + +const struct AllocationTable allocTable1[] = +{ + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767} +}; + +const struct AllocationTable allocTable2[] = +{ + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63} +}; + +const struct AllocationTable allocTable3[] = +{ + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63} +}; + +const struct AllocationTable allocTable4[] = +{ + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9} +}; + +struct BandInfoStruct +{ + int16 longIndex[23]; + int16 longDiff[22]; + int16 shortIndex[14]; + int16 shortDiff[13]; +}; + +const BandInfoStruct bandInfo[9] = +{ + { {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576}, + {4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158}, + {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 40 * 3, 52 * 3, 66 * 3, 84 * 3, 106 * 3, 136 * 3, 192 * 3}, + {4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56} }, + + { {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576}, + {4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192}, + {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 28 * 3, 38 * 3, 50 * 3, 64 * 3, 80 * 3, 100 * 3, 126 * 3, 192 * 3}, + {4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66} }, + + { {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576}, + {4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26}, + {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 42 * 3, 58 * 3, 78 * 3, 104 * 3, 138 * 3, 180 * 3, 192 * 3}, + {4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12} }, + + { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 }, + {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 24 * 3, 32 * 3, 42 * 3, 56 * 3, 74 * 3, 100 * 3, 132 * 3, 174 * 3, 192 * 3}, + {4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18 } }, + + { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576}, + {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 }, + {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, 80 * 3, 104 * 3, 136 * 3, 180 * 3, 192 * 3}, + {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12 } }, + + { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 }, + {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, 80 * 3, 104 * 3, 134 * 3, 174 * 3, 192 * 3}, + {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 } }, + + { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54}, + {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576}, + {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18} }, + + { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54}, + {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576}, + {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18} }, + + { {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576}, + {12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2}, + {0, 24, 48, 72, 108, 156, 216, 288, 372, 480, 486, 492, 498, 576}, + {8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26} } +}; + +const double decodeWindow[] = +{ + 0.000000000, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000030518, + -0.000030518, -0.000030518, -0.000030518, -0.000045776, -0.000045776, -0.000061035, -0.000061035, -0.000076294, + -0.000076294, -0.000091553, -0.000106812, -0.000106812, -0.000122070, -0.000137329, -0.000152588, -0.000167847, + -0.000198364, -0.000213623, -0.000244141, -0.000259399, -0.000289917, -0.000320435, -0.000366211, -0.000396729, + -0.000442505, -0.000473022, -0.000534058, -0.000579834, -0.000625610, -0.000686646, -0.000747681, -0.000808716, + -0.000885010, -0.000961304, -0.001037598, -0.001113892, -0.001205444, -0.001296997, -0.001388550, -0.001480103, + -0.001586914, -0.001693726, -0.001785278, -0.001907349, -0.002014160, -0.002120972, -0.002243042, -0.002349854, + -0.002456665, -0.002578735, -0.002685547, -0.002792358, -0.002899170, -0.002990723, -0.003082275, -0.003173828, + -0.003250122, -0.003326416, -0.003387451, -0.003433228, -0.003463745, -0.003479004, -0.003479004, -0.003463745, + -0.003417969, -0.003372192, -0.003280640, -0.003173828, -0.003051758, -0.002883911, -0.002700806, -0.002487183, + -0.002227783, -0.001937866, -0.001617432, -0.001266479, -0.000869751, -0.000442505, 0.000030518, 0.000549316, + 0.001098633, 0.001693726, 0.002334595, 0.003005981, 0.003723145, 0.004486084, 0.005294800, 0.006118774, + 0.007003784, 0.007919312, 0.008865356, 0.009841919, 0.010848999, 0.011886597, 0.012939453, 0.014022827, + 0.015121460, 0.016235352, 0.017349243, 0.018463135, 0.019577026, 0.020690918, 0.021789551, 0.022857666, + 0.023910522, 0.024932861, 0.025909424, 0.026840210, 0.027725220, 0.028533936, 0.029281616, 0.029937744, + 0.030532837, 0.031005859, 0.031387329, 0.031661987, 0.031814575, 0.031845093, 0.031738281, 0.031478882, + 0.031082153, 0.030517578, 0.029785156, 0.028884888, 0.027801514, 0.026535034, 0.025085449, 0.023422241, + 0.021575928, 0.019531250, 0.017257690, 0.014801025, 0.012115479, 0.009231567, 0.006134033, 0.002822876, + -0.000686646, -0.004394531, -0.008316040, -0.012420654, -0.016708374, -0.021179199, -0.025817871, -0.030609131, + -0.035552979, -0.040634155, -0.045837402, -0.051132202, -0.056533813, -0.061996460, -0.067520142, -0.073059082, + -0.078628540, -0.084182739, -0.089706421, -0.095169067, -0.100540161, -0.105819702, -0.110946655, -0.115921021, + -0.120697021, -0.125259399, -0.129562378, -0.133590698, -0.137298584, -0.140670776, -0.143676758, -0.146255493, + -0.148422241, -0.150115967, -0.151306152, -0.151962280, -0.152069092, -0.151596069, -0.150497437, -0.148773193, + -0.146362305, -0.143264771, -0.139450073, -0.134887695, -0.129577637, -0.123474121, -0.116577148, -0.108856201, + -0.100311279, -0.090927124, -0.080688477, -0.069595337, -0.057617187, -0.044784546, -0.031082153, -0.016510010, + -0.001068115, 0.015228271, 0.032379150, 0.050354004, 0.069168091, 0.088775635, 0.109161377, 0.130310059, + 0.152206421, 0.174789429, 0.198059082, 0.221984863, 0.246505737, 0.271591187, 0.297210693, 0.323318481, + 0.349868774, 0.376800537, 0.404083252, 0.431655884, 0.459472656, 0.487472534, 0.515609741, 0.543823242, + 0.572036743, 0.600219727, 0.628295898, 0.656219482, 0.683914185, 0.711318970, 0.738372803, 0.765029907, + 0.791213989, 0.816864014, 0.841949463, 0.866363525, 0.890090942, 0.913055420, 0.935195923, 0.956481934, + 0.976852417, 0.996246338, 1.014617920, 1.031936646, 1.048156738, 1.063217163, 1.077117920, 1.089782715, + 1.101211548, 1.111373901, 1.120223999, 1.127746582, 1.133926392, 1.138763428, 1.142211914, 1.144287109, + 1.144989014 +}; + +const int16 huffmanTab0[] = { 0 }; +const int16 huffmanTab1[] = { -5,-3,-1,17,1,16,0 }; +const int16 huffmanTab2[] = { -15,-11,-9,-5,-3,-1,34,2,18,-1,33,32,17,-1,1,16,0 }; +const int16 huffmanTab3[] = { -13,-11,-9,-5,-3,-1,34,2,18,-1,33,32,16,17,-1,1,0 }; +const int16 huffmanTab5[] = { -29,-25,-23,-15,-7,-5,-3,-1,51,35,50,49,-3,-1,19,3,-1,48,34,-3,-1,18,33,-1,2,32,17,-1,1,16,0 }; +const int16 huffmanTab6[] = { -25,-19,-13,-9,-5,-3,-1,51,3,35,-1,50,48,-1,19,49,-3,-1,34,2,18,-3,-1,33,32,1,-1,17,-1,16,0 }; + +const int16 huffmanTab7[] = +{ + -69,-65,-57,-39,-29,-17,-11,-7,-3,-1,85,69,-1,84,83,-1,53,68,-3,-1,37,82,21,-5,-1,81,-1,5,52,-1,80,-1,67,51, + -5,-3,-1,36,66,20,-1,65,64,-11,-7,-3,-1,4,35,-1,50,3,-1,19,49,-3,-1,48,34,18,-5,-1,33,-1,2,32,17,-1,1,16,0 +}; + +const int16 huffmanTab8[] = +{ + -65,-63,-59,-45,-31,-19,-13,-7,-5,-3,-1,85,84,69,83,-3,-1,53,68,37,-3,-1,82,5,21,-5,-1,81,-1,52,67,-3,-1,80, + 51,36,-5,-3,-1,66,20,65,-3,-1,4,64,-1,35,50,-9,-7,-3,-1,19,49,-1,3,48,34,-1,2,32,-1,18,33,17,-3,-1,1,16,0 +}; + +const int16 huffmanTab9[] = +{ + -63,-53,-41,-29,-19,-11,-5,-3,-1,85,69,53,-1,83,-1,84,5,-3,-1,68,37,-1,82,21,-3,-1,81,52,-1,67,-1,80,4,-7,-3, + -1,36,66,-1,51,64,-1,20,65,-5,-3,-1,35,50,19,-1,49,-1,3,48,-5,-3,-1,34,2,18,-1,33,32,-3,-1,17,1,-1,16,0 +}; + +const int16 huffmanTab10[] = +{ + -125,-121,-111,-83,-55,-35,-21,-13,-7,-3,-1,119,103,-1,118,87,-3,-1,117,102,71,-3,-1,116,86,-1,101,55,-9,-3, + -1,115,70,-3,-1,85,84,99,-1,39,114,-11,-5,-3,-1,100,7,112,-1,98,-1,69,53,-5,-1,6,-1,83,68,23,-17,-5,-1,113, + -1,54,38,-5,-3,-1,37,82,21,-1,81,-1,52,67,-3,-1,22,97,-1,96,-1,5,80,-19,-11,-7,-3,-1,36,66,-1,51,4,-1,20, + 65,-3,-1,64,35,-1,50,3,-3,-1,19,49,-1,48,34,-7,-3,-1,18,33,-1,2,32,17,-1,1,16,0 +}; + +const int16 huffmanTab11[] = +{ + -121,-113,-89,-59,-43,-27,-17,-7,-3,-1,119,103,-1,118,117,-3,-1,102,71,-1,116,-1,87,85,-5,-3,-1,86,101,55, + -1,115,70,-9,-7,-3,-1,69,84,-1,53,83,39,-1,114,-1,100,7,-5,-1,113,-1,23,112,-3,-1,54,99,-1,96,-1,68,37,-13, + -7,-5,-3,-1,82,5,21,98,-3,-1,38,6,22,-5,-1,97,-1,81,52,-5,-1,80,-1,67,51,-1,36,66,-15,-11,-7,-3,-1,20,65, + -1,4,64,-1,35,50,-1,19,49,-5,-3,-1,3,48,34,33,-5,-1,18,-1,2,32,17,-3,-1,1,16,0 +}; + +const int16 huffmanTab12[] = +{ + -115,-99,-73,-45,-27,-17,-9,-5,-3,-1,119,103,118,-1,87,117,-3,-1,102,71,-1,116,101,-3,-1,86,55,-3,-1,115, + 85,39,-7,-3,-1,114,70,-1,100,23,-5,-1,113,-1,7,112,-1,54,99,-13,-9,-3,-1,69,84,-1,68,-1,6,5,-1,38,98,-5, + -1,97,-1,22,96,-3,-1,53,83,-1,37,82,-17,-7,-3,-1,21,81,-1,52,67,-5,-3,-1,80,4,36,-1,66,20,-3,-1,51,65,-1, + 35,50,-11,-7,-5,-3,-1,64,3,48,19,-1,49,34,-1,18,33,-7,-5,-3,-1,2,32,0,17,-1,1,16 +}; + +const int16 huffmanTab13[] = +{ + -509,-503,-475,-405,-333,-265,-205,-153,-115,-83,-53,-35,-21,-13,-9,-7,-5,-3,-1,254,252,253,237,255,-1,239,223, + -3,-1,238,207,-1,222,191,-9,-3,-1,251,206,-1,220,-1,175,233,-1,236,221,-9,-5,-3,-1,250,205,190,-1,235,159,-3, + -1,249,234,-1,189,219,-17,-9,-3,-1,143,248,-1,204,-1,174,158,-5,-1,142,-1,127,126,247,-5,-1,218,-1,173,188,-3, + -1,203,246,111,-15,-7,-3,-1,232,95,-1,157,217,-3,-1,245,231,-1,172,187,-9,-3,-1,79,244,-3,-1,202,230,243,-1, + 63,-1,141,216,-21,-9,-3,-1,47,242,-3,-1,110,156,15,-5,-3,-1,201,94,171,-3,-1,125,215,78,-11,-5,-3,-1,200,214, + 62,-1,185,-1,155,170,-1,31,241,-23,-13,-5,-1,240,-1,186,229,-3,-1,228,140,-1,109,227,-5,-1,226,-1,46,14,-1,30, + 225,-15,-7,-3,-1,224,93,-1,213,124,-3,-1,199,77,-1,139,184,-7,-3,-1,212,154,-1,169,108,-1,198,61,-37,-21,-9,-5, + -3,-1,211,123,45,-1,210,29,-5,-1,183,-1,92,197,-3,-1,153,122,195,-7,-5,-3,-1,167,151,75,209,-3,-1,13,208,-1, + 138,168,-11,-7,-3,-1,76,196,-1,107,182,-1,60,44,-3,-1,194,91,-3,-1,181,137,28,-43,-23,-11,-5,-1,193,-1,152,12, + -1,192,-1,180,106,-5,-3,-1,166,121,59,-1,179,-1,136,90,-11,-5,-1,43,-1,165,105,-1,164,-1,120,135,-5,-1,148,-1, + 119,118,178,-11,-3,-1,27,177,-3,-1,11,176,-1,150,74,-7,-3,-1,58,163,-1,89,149,-1,42,162,-47,-23,-9,-3,-1,26, + 161,-3,-1,10,104,160,-5,-3,-1,134,73,147,-3,-1,57,88,-1,133,103,-9,-3,-1,41,146,-3,-1,87,117,56,-5,-1,131,-1, + 102,71,-3,-1,116,86,-1,101,115,-11,-3,-1,25,145,-3,-1,9,144,-1,72,132,-7,-5,-1,114,-1,70,100,40,-1,130,24,-41, + -27,-11,-5,-3,-1,55,39,23,-1,113,-1,85,7,-7,-3,-1,112,54,-1,99,69,-3,-1,84,38,-1,98,53,-5,-1,129,-1,8,128,-3, + -1,22,97,-1,6,96,-13,-9,-5,-3,-1,83,68,37,-1,82,5,-1,21,81,-7,-3,-1,52,67,-1,80,36,-3,-1,66,51,20,-19,-11, + -5,-1,65,-1,4,64,-3,-1,35,50,19,-3,-1,49,3,-1,48,34,-3,-1,18,33,-1,2,32,-3,-1,17,1,16,0 +}; + +const int16 huffmanTab15[] = +{ + -495,-445,-355,-263,-183,-115,-77,-43,-27,-13,-7,-3,-1,255,239,-1,254,223,-1,238,-1,253,207,-7,-3,-1,252,222,-1, + 237,191,-1,251,-1,206,236,-7,-3,-1,221,175,-1,250,190,-3,-1,235,205,-1,220,159,-15,-7,-3,-1,249,234,-1,189,219, + -3,-1,143,248,-1,204,158,-7,-3,-1,233,127,-1,247,173,-3,-1,218,188,-1,111,-1,174,15,-19,-11,-3,-1,203,246, + -3,-1,142,232,-1,95,157,-3,-1,245,126,-1,231,172,-9,-3,-1,202,187,-3,-1,217,141,79,-3,-1,244,63,-1,243,216, + -33,-17,-9,-3,-1,230,47,-1,242,-1,110,240,-3,-1,31,241,-1,156,201,-7,-3,-1,94,171,-1,186,229,-3,-1,125,215, + -1,78,228,-15,-7,-3,-1,140,200,-1,62,109,-3,-1,214,227,-1,155,185,-7,-3,-1,46,170,-1,226,30,-5,-1,225,-1,14, + 224,-1,93,213,-45,-25,-13,-7,-3,-1,124,199,-1,77,139,-1,212,-1,184,154,-7,-3,-1,169,108,-1,198,61,-1,211,210, + -9,-5,-3,-1,45,13,29,-1,123,183,-5,-1,209,-1,92,208,-1,197,138,-17,-7,-3,-1,168,76,-1,196,107,-5,-1,182,-1, + 153,12,-1,60,195,-9,-3,-1,122,167,-1,166,-1,192,11,-1,194,-1,44,91,-55,-29,-15,-7,-3,-1,181,28,-1,137,152,-3, + -1,193,75,-1,180,106,-5,-3,-1,59,121,179,-3,-1,151,136,-1,43,90,-11,-5,-1,178,-1,165,27,-1,177,-1,176,105,-7, + -3,-1,150,74,-1,164,120,-3,-1,135,58,163,-17,-7,-3,-1,89,149,-1,42,162,-3,-1,26,161,-3,-1,10,160,104,-7,-3, + -1,134,73,-1,148,57,-5,-1,147,-1,119,9,-1,88,133,-53,-29,-13,-7,-3,-1,41,103,-1,118,146,-1,145,-1,25,144,-7, + -3,-1,72,132,-1,87,117,-3,-1,56,131,-1,102,71,-7,-3,-1,40,130,-1,24,129,-7,-3,-1,116,8,-1,128,86,-3,-1,101, + 55,-1,115,70,-17,-7,-3,-1,39,114,-1,100,23,-3,-1,85,113,-3,-1,7,112,54,-7,-3,-1,99,69,-1,84,38,-3,-1,98,22, + -3,-1,6,96,53,-33,-19,-9,-5,-1,97,-1,83,68,-1,37,82,-3,-1,21,81,-3,-1,5,80,52,-7,-3,-1,67,36,-1,66,51,-1, + 65,-1,20,4,-9,-3,-1,35,50,-3,-1,64,3,19,-3,-1,49,48,34,-9,-7,-3,-1,18,33,-1,2,32,17,-3,-1,1,16,0 +}; + +const int16 huffmanTab16[] = +{ + -509,-503,-461,-323,-103,-37,-27,-15,-7,-3,-1,239,254,-1,223,253,-3,-1,207,252,-1,191,251,-5,-1,175,-1,250,159, + -3,-1,249,248,143,-7,-3,-1,127,247,-1,111,246,255,-9,-5,-3,-1,95,245,79,-1,244,243,-53,-1,240,-1,63,-29,-19, + -13,-7,-5,-1,206,-1,236,221,222,-1,233,-1,234,217,-1,238,-1,237,235,-3,-1,190,205,-3,-1,220,219,174,-11,-5, + -1,204,-1,173,218,-3,-1,126,172,202,-5,-3,-1,201,125,94,189,242,-93,-5,-3,-1,47,15,31,-1,241,-49,-25,-13, + -5,-1,158,-1,188,203,-3,-1,142,232,-1,157,231,-7,-3,-1,187,141,-1,216,110,-1,230,156,-13,-7,-3,-1,171,186, + -1,229,215,-1,78,-1,228,140,-3,-1,200,62,-1,109,-1,214,155,-19,-11,-5,-3,-1,185,170,225,-1,212,-1,184,169, + -5,-1,123,-1,183,208,227,-7,-3,-1,14,224,-1,93,213,-3,-1,124,199,-1,77,139,-75,-45,-27,-13,-7,-3,-1,154, + 108,-1,198,61,-3,-1,92,197,13,-7,-3,-1,138,168,-1,153,76,-3,-1,182,122,60,-11,-5,-3,-1,91,137,28,-1,192,-1, + 152,121,-1,226,-1,46,30,-15,-7,-3,-1,211,45,-1,210,209,-5,-1,59,-1,151,136,29,-7,-3,-1,196,107,-1,195,167,-1, + 44,-1,194,181,-23,-13,-7,-3,-1,193,12,-1,75,180,-3,-1,106,166,179,-5,-3,-1,90,165,43,-1,178,27,-13,-5,-1,177, + -1,11,176,-3,-1,105,150,-1,74,164,-5,-3,-1,120,135,163,-3,-1,58,89,42,-97,-57,-33,-19,-11,-5,-3,-1,149,104,161, + -3,-1,134,119,148,-5,-3,-1,73,87,103,162,-5,-1,26,-1,10,160,-3,-1,57,147,-1,88,133,-9,-3,-1,41,146,-3,-1,118, + 9,25,-5,-1,145,-1,144,72,-3,-1,132,117,-1,56,131,-21,-11,-5,-3,-1,102,40,130,-3,-1,71,116,24,-3,-1,129,128,-3, + -1,8,86,55,-9,-5,-1,115,-1,101,70,-1,39,114,-5,-3,-1,100,85,7,23,-23,-13,-5,-1,113,-1,112,54,-3,-1,99,69,-1, + 84,38,-3,-1,98,22,-1,97,-1,6,96,-9,-5,-1,83,-1,53,68,-1,37,82,-1,81,-1,21,5,-33,-23,-13,-7,-3,-1,52,67,-1,80, + 36,-3,-1,66,51,20,-5,-1,65,-1,4,64,-1,35,50,-3,-1,19,49,-3,-1,3,48,34,-3,-1,18,33,-1,2,32,-3,-1,17,1,16,0 +}; + +const int16 huffmanTab24[] = +{ + -451,-117,-43,-25,-15,-7,-3,-1,239,254,-1,223,253,-3,-1,207,252,-1,191,251,-5,-1,250,-1,175,159,-1,249,248,-9, + -5,-3,-1,143,127,247,-1,111,246,-3,-1,95,245,-1,79,244,-71,-7,-3,-1,63,243,-1,47,242,-5,-1,241,-1,31,240,-25,-9, + -1,15,-3,-1,238,222,-1,237,206,-7,-3,-1,236,221,-1,190,235,-3,-1,205,220,-1,174,234,-15,-7,-3,-1,189,219,-1,204, + 158,-3,-1,233,173,-1,218,188,-7,-3,-1,203,142,-1,232,157,-3,-1,217,126,-1,231,172,255,-235,-143,-77,-45,-25,-15, + -7,-3,-1,202,187,-1,141,216,-5,-3,-1,14,224,13,230,-5,-3,-1,110,156,201,-1,94,186,-9,-5,-1,229,-1,171,125,-1,215, + 228,-3,-1,140,200,-3,-1,78,46,62,-15,-7,-3,-1,109,214,-1,227,155,-3,-1,185,170,-1,226,30,-7,-3,-1,225,93,-1,213,124, + -3,-1,199,77,-1,139,184,-31,-15,-7,-3,-1,212,154,-1,169,108,-3,-1,198,61,-1,211,45,-7,-3,-1,210,29,-1,123,183,-3,-1, + 209,92,-1,197,138,-17,-7,-3,-1,168,153,-1,76,196,-3,-1,107,182,-3,-1,208,12,60,-7,-3,-1,195,122,-1,167,44,-3,-1,194, + 91,-1,181,28,-57,-35,-19,-7,-3,-1,137,152,-1,193,75,-5,-3,-1,192,11,59,-3,-1,176,10,26,-5,-1,180,-1,106,166,-3,-1,121, + 151,-3,-1,160,9,144,-9,-3,-1,179,136,-3,-1,43,90,178,-7,-3,-1,165,27,-1,177,105,-1,150,164,-17,-9,-5,-3,-1,74,120,135, + -1,58,163,-3,-1,89,149,-1,42,162,-7,-3,-1,161,104,-1,134,119,-3,-1,73,148,-1,57,147,-63,-31,-15,-7,-3,-1,88,133,-1,41, + 103,-3,-1,118,146,-1,25,145,-7,-3,-1,72,132,-1,87,117,-3,-1,56,131,-1,102,40,-17,-7,-3,-1,130,24,-1,71,116,-5,-1,129, + -1,8,128,-1,86,101,-7,-5,-1,23,-1,7,112,115,-3,-1,55,39,114,-15,-7,-3,-1,70,100,-1,85,113,-3,-1,54,99,-1,69,84,-7,-3, + -1,38,98,-1,22,97,-5,-3,-1,6,96,53,-1,83,68,-51,-37,-23,-15,-9,-3,-1,37,82,-1,21,-1,5,80,-1,81,-1,52,67,-3,-1,36,66, + -1,51,20,-9,-5,-1,65,-1,4,64,-1,35,50,-1,19,49,-7,-5,-3,-1,3,48,34,18,-1,33,-1,2,32,-3,-1,17,1,-1,16,0 +}; + +struct BitsToTableMap +{ + uint32 bits; + const int16* table; +}; + +const BitsToTableMap huffmanTables1[] = +{ + { 0, huffmanTab0 }, { 0, huffmanTab1 }, { 0, huffmanTab2 }, { 0, huffmanTab3 }, + { 0, huffmanTab0 }, { 0, huffmanTab5 }, { 0, huffmanTab6 }, { 0, huffmanTab7 }, + { 0, huffmanTab8 }, { 0, huffmanTab9 }, { 0, huffmanTab10 }, { 0, huffmanTab11 }, + { 0, huffmanTab12 }, { 0, huffmanTab13 }, { 0, huffmanTab0 }, { 0, huffmanTab15 }, + { 1, huffmanTab16 }, { 2, huffmanTab16 }, { 3, huffmanTab16 }, { 4, huffmanTab16 }, + { 6, huffmanTab16 }, { 8, huffmanTab16 }, { 10, huffmanTab16 }, { 13, huffmanTab16 }, + { 4, huffmanTab24 }, { 5, huffmanTab24 }, { 6, huffmanTab24 }, { 7, huffmanTab24 }, + { 8, huffmanTab24 }, { 9, huffmanTab24 }, { 11, huffmanTab24 }, { 13, huffmanTab24 } +}; + +const int16 huffmanTabC0[] = { -29,-21,-13,-7,-3,-1,11,15,-1,13,14,-3,-1,7,5,9,-3,-1,6,3,-1,10,12,-3,-1,2,1,-1,4,8,0 }; +const int16 huffmanTabC1[] = { -15,-7,-3,-1,15,14,-1,13,12,-3,-1,11,10,-1,9,8,-7,-3,-1,7,6,-1,5,4,-3,-1,3,2,-1,1,0 }; + +const BitsToTableMap huffmanTables2[] = { { 0, huffmanTabC0 }, { 0, huffmanTabC1 } }; + +//============================================================================== +struct VBRTagData +{ + bool read (const uint8* data) noexcept + { + flags = 0; + + const int layer = (data[1] >> 1) & 3; + if (layer != 1) + return false; + + const int type = (data[1] >> 3) & 1; + const int sampleRateIndex = (data[2] >> 2) & 3; + const int mode = (data[3] >> 6) & 3; + + static const int bitRates[3][16] = + { + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1 }, // MPEG2 + { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1 }, // MPEG1 + { 0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1 }, // MPEG 2.5 + }; + + const int bitrate = bitRates[type][((data[2] >> 4) & 15)]; + + const int sampleRates[3][4] = + { + { 22050, 24000, 16000, -1 }, // MPEG2 + { 44100, 48000, 32000, -1 }, // MPEG1 + { 11025, 12000, 8000, -1 }, // MPEG2.5 + }; + + if ((data[1] >> 4) == 0xe) + sampleRate = sampleRates[2][sampleRateIndex]; + else + sampleRate = sampleRates[type][sampleRateIndex]; + + data += type != 0 ? (mode != 3 ? (32 + 4) : (17 + 4)) + : (mode != 3 ? (17 + 4) : (9 + 4)); + + if (! isVbrTag (data)) + return false; + + data += 4; + flags = ByteOrder::bigEndianInt (data); + data += 4; + + if (flags & 1) + { + frames = ByteOrder::bigEndianInt (data); + data += 4; + } + + if (flags & 2) + { + bytes = ByteOrder::bigEndianInt (data); + data += 4; + } + + if (flags & 4) + { + if (toc != nullptr) + for (int i = 0; i < 100; ++i) + toc[i] = data[i]; + + data += 100; + } + + vbrScale = -1; + + if (flags & 8) + vbrScale = (int) ByteOrder::bigEndianInt (data); + + headersize = ((type + 1) * 72000 * bitrate) / sampleRate; + return true; + } + + uint8 toc[100]; + int sampleRate, vbrScale, headersize; + unsigned int flags, frames, bytes; + +private: + static bool isVbrTag (const uint8* const d) noexcept + { + return (d[0] == 'X' && d[1] == 'i' && d[2] == 'n' && d[3] == 'g') + || (d[0] == 'I' && d[1] == 'n' && d[2] == 'f' && d[3] == 'o'); + } +}; + +//============================================================================== +struct MP3Frame +{ + MP3Frame() + { + zeromem (this, sizeof (MP3Frame)); + single = -1; + } + + void selectLayer2Table() + { + static const int translate[3][2][16] = + { + { { 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, { 0, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } }, + { { 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { { 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, { 0, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } } + }; + + static const AllocationTable* const tables[] = { allocTable0, allocTable1, allocTable2, allocTable3, allocTable4 }; + static const int limits[] = { 27, 30, 8, 12, 30 }; + + const int index = lsf ? 4 : translate[sampleRateIndex][2 - numChannels][bitrateIndex]; + layer2SubBandLimit = limits [index]; + allocationTable = tables [index]; + } + + int getFrequency() const noexcept + { + const int frequencies[] = { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000 }; + return frequencies [sampleRateIndex]; + } + + void decodeHeader (const uint32 header) + { + jassert (((header >> 10) & 3) != 3); + + mpeg25 = (header & (1 << 20)) == 0; + lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1); + layer = 4 - ((header >> 17) & 3); + sampleRateIndex = mpeg25 ? (6 + ((header >> 10) & 3)) : ((int) ((header >> 10) & 3) + (lsf * 3)); + crc16FollowsHeader = ((header >> 16) & 1) == 0; + bitrateIndex = (header >> 12) & 15; + padding = (header >> 9) & 1; + mode = (header >> 6) & 3; + modeExt = (header >> 4) & 3; + //extension = (header >> 8) & 1; + //copyright = (header >> 3) & 1; + //original = (header >> 2) & 1; + //emphasis = header & 3; + numChannels = (mode == 3) ? 1 : 2; + + static const int frameSizes [2][3][16] = + { + { { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 }, + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 }, + { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } }, + + { { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256 }, + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 }, + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 } } + }; + + if (bitrateIndex == 0) + { + jassertfalse; // This means the file is using "free format". Apparently very few decoders + // support this mode, and this one certainly doesn't handle it correctly! + frameSize = 0; + } + else + { + switch (layer) + { + case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break; + case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break; + case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break; + default: break; + } + } + } + + int layer, frameSize, numChannels, single; + int lsf; // 0 = mpeg-1, 1 = mpeg-2/LSF + bool mpeg25; // true = mpeg-2.5, false = mpeg-1/2 + bool crc16FollowsHeader; + int bitrateIndex, sampleRateIndex, padding; + int mode, modeExt, layer2SubBandLimit; + enum { downSampleLimit = 32 }; + const AllocationTable* allocationTable; +}; + +//============================================================================== +struct Constants +{ + Constants() + { + cosTables[0] = cos64; cosTables[1] = cos32; cosTables[2] = cos16; cosTables[3] = cos8; cosTables[4] = cos4; + initDecodeTables(); + initLayer2Tables(); + initLayer3Tables(); + } + + const uint8* getGroupTable (const int16 d1, const uint32 index) const noexcept + { + switch (d1) + { + case 3: return &group3tab [3 * jmin (index, 3u * 3u * 3u)]; + case 5: return &group5tab [3 * jmin (index, 5u * 5u * 5u)]; + case 9: return &group9tab [3 * jmin (index, 9u * 9u * 9u)]; + default: break; + } + + static const uint8 dummy[] = { 0, 0, 0 }; + return dummy; + } + + float muls[27][64]; + float nToThe4Over3[8207]; + float antiAliasingCa[8], antiAliasingCs[8]; + float win[4][36]; + float win1[4][36]; + float powToGains[256 + 118 + 4]; + int longLimit[9][23]; + int shortLimit[9][14]; + float tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16]; + float pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16]; + int* map[9][3]; + int* mapEnd[9][3]; + uint32 nLength2[512]; + uint32 iLength2[256]; + float decodeWin[512 + 32]; + float* cosTables[5]; + +private: + int mapbuf0[9][152]; + int mapbuf1[9][156]; + int mapbuf2[9][44]; + float cos64[16], cos32[8], cos16[4], cos8[2], cos4[1]; + uint8 group3tab [32 * 3]; + uint8 group5tab [128 * 3]; + uint8 group9tab [1024 * 3]; + + void initDecodeTables() + { + int i, j, scaleval = -1; + float* table = decodeWin; + + for (i = 0; i < 5; ++i) + { + int kr = 0x10 >> i; + int divv = 0x40 >> i; + float* costab = cosTables[i]; + + for (int k = 0; k < kr; ++k) + costab[k] = (float) (1.0 / (2.0 * cos (double_Pi * (k * 2 + 1) / divv))); + } + + for (i = 0, j = 0; i < 256; ++i, ++j, table += 32) + { + if (table < decodeWin + 512 + 16) + table[16] = table[0] = (float) (decodeWindow[j] * scaleval); + if (i % 32 == 31) + table -= 1023; + if (i % 64 == 63) + scaleval = -scaleval; + } + + for (; i < 512; ++i, --j, table += 32) + { + if (table < decodeWin + 512 + 16) + table[16] = table[0] = (float) (decodeWindow[j] * scaleval); + + if (i % 32 == 31) table -= 1023; + if (i % 64 == 63) scaleval = -scaleval; + } + } + + void initLayer2Tables() + { + static const uint8 base[3][9] = + { + { 1, 0, 2 }, + { 17, 18, 0, 19, 20 }, + { 21, 1, 22, 23, 0, 24, 25, 2, 26 } + }; + + static const int tableLengths[] = { 3, 5, 9 }; + static uint8* tables[] = { group3tab, group5tab, group9tab }; + + for (int i = 0; i < 3; ++i) + { + uint8* table = tables[i]; + const int len = tableLengths[i]; + + for (int j = 0; j < len; ++j) + for (int k = 0; k < len; ++k) + for (int l = 0; l < len; ++l) + { + *table++ = base[i][l]; + *table++ = base[i][k]; + *table++ = base[i][j]; + } + } + + for (int k = 0; k < 27; ++k) + { + static const double multipliers[] = + { + 0, -2.0 / 3.0, 2.0 / 3.0, 2.0 / 7.0, 2.0 / 15.0, 2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0, + 2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0, 2.0 / 8191.0, 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0, + -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, -8.0 / 9.0, -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0 + }; + + float* table = muls[k]; + for (int j = 3, i = 0; i < 63; ++i, --j) + *table++ = (float) (multipliers[k] * pow (2.0, j / 3.0)); + *table++ = 0; + } + } + + void initLayer3Tables() + { + int i, j; + for (i = -256; i < 118 + 4; ++i) + powToGains[i + 256] = (float) pow (2.0, -0.25 * (i + 210)); + + for (i = 0; i < 8207; ++i) + nToThe4Over3[i] = (float) pow ((double) i, 4.0 / 3.0); + + for (i = 0; i < 8; ++i) + { + static double Ci[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }; + const double sq = sqrt (1.0 + Ci[i] * Ci[i]); + antiAliasingCs[i] = (float) (1.0 / sq); + antiAliasingCa[i] = (float) (Ci[i] / sq); + } + + for (i = 0; i < 18; ++i) + { + win[0][i] = win[1][i] = (float) (0.5 * sin (double_Pi / 72.0 * (2 * i + 1)) / cos (double_Pi * (2 * i + 19) / 72.0)); + win[0][i + 18] = win[3][i + 18] = (float) (0.5 * sin (double_Pi / 72.0 * (2 * (i + 18) + 1)) / cos (double_Pi * (2 * (i + 18) + 19) / 72.0)); + } + + const double piOver72 = double_Pi; + + for (i = 0; i < 6; ++i) + { + win[1][i + 18] = (float) (0.5 / cos (piOver72 * (2 * (i + 18) + 19))); + win[3][i + 12] = (float) (0.5 / cos (piOver72 * (2 * (i + 12) + 19))); + win[1][i + 24] = (float) (0.5 * sin (double_Pi / 24.0 * (2 * i + 13)) / cos (piOver72 * (2 * (i + 24) + 19))); + win[1][i + 30] = win[3][i] = 0; + win[3][i + 6] = (float) (0.5 * sin (double_Pi / 24.0 * (2 * i + 1)) / cos (piOver72 * (2 * (i + 6) + 19))); + } + + for (i = 0; i < 12; ++i) + win[2][i] = (float) (0.5 * sin (double_Pi / 24.0 * (2 * i + 1)) / cos (double_Pi * (2 * i + 7) / 24.0)); + + for (j = 0; j < 4; ++j) + { + static const int len[4] = { 36, 36, 12, 36 }; + for (i = 0; i < len[j]; i += 2) win1[j][i] = win[j][i]; + for (i = 1; i < len[j]; i += 2) win1[j][i] = -win[j][i]; + } + + const double sqrt2 = 1.41421356237309504880168872420969808; + + for (i = 0; i < 16; ++i) + { + const double t = tan (i * double_Pi / 12.0); + tan1_1[i] = (float) (t / (1.0 + t)); + tan2_1[i] = (float) (1.0 / (1.0 + t)); + tan1_2[i] = (float) (sqrt2 * t / (1.0 + t)); + tan2_2[i] = (float) (sqrt2 / (1.0 + t)); + + for (j = 0; j < 2; ++j) + { + double p1 = 1.0, p2 = 1.0; + + if (i > 0) + { + const double base = pow (2.0, -0.25 * (j + 1)); + + if (i & 1) + p1 = pow (base, (i + 1) * 0.5); + else + p2 = pow (base, i * 0.5); + } + + pow1_1[j][i] = (float) p1; + pow2_1[j][i] = (float) p2; + pow1_2[j][i] = (float) (sqrt2 * p1); + pow2_2[j][i] = (float) (sqrt2 * p2); + } + } + + for (j = 0; j < 9; ++j) + { + const BandInfoStruct& bi = bandInfo[j]; + int cb; + int* mp = map[j][0] = mapbuf0[j]; + const int16* bdf = bi.longDiff; + + for (i = 0, cb = 0; cb < 8; ++cb, i += *bdf++) + { + *mp++ = (*bdf) >> 1; + *mp++ = i; + *mp++ = 3; + *mp++ = cb; + } + bdf = bi.shortDiff + 3; + + for (cb = 3; cb < 13; ++cb) + { + const int l = (*bdf++) >> 1; + + for (int lwin = 0; lwin < 3; ++lwin) + { + *mp++ = l; + *mp++ = i + lwin; + *mp++ = lwin; + *mp++ = cb; + } + i += 6 * l; + } + + mapEnd[j][0] = mp; + mp = map[j][1] = mapbuf1[j]; + bdf = bi.shortDiff; + + for (i = 0, cb = 0; cb < 13; ++cb) + { + const int l = (*bdf++) >> 1; + for (int lwin = 0; lwin < 3; ++lwin) + { + *mp++ = l; + *mp++ = i + lwin; + *mp++ = lwin; + *mp++ = cb; + } + i += 6 * l; + } + mapEnd[j][1] = mp; + + mp = map[j][2] = mapbuf2[j]; + bdf = bi.longDiff; + for (cb = 0; cb < 22; ++cb) + { + *mp++ = (*bdf++) >> 1; + *mp++ = cb; + } + mapEnd[j][2] = mp; + + } + + for (j = 0; j < 9; ++j) + { + for (i = 0; i < 23; ++i) longLimit[j][i] = jmin (32, (bandInfo[j].longIndex[i] - 1 + 8) / 18 + 1); + for (i = 0; i < 14; ++i) shortLimit[j][i] = jmin (32, (bandInfo[j].shortIndex[i] - 1) / 18 + 1); + } + + for (i = 0; i < 5; ++i) + for (j = 0; j < 6; ++j) + for (int k = 0; k < 6; ++k) + { + const int n = k + j * 6 + i * 36; + iLength2[n] = (unsigned int) (i | (j << 3) | (k << 6) | (3 << 12)); + } + + for (i = 0; i < 4; ++i) + for (j = 0; j < 4; ++j) + for (int k = 0; k < 4; ++k) + { + const int n = k + j * 4 + i * 16; + iLength2[n + 180] = (unsigned int) (i | (j << 3) | (k << 6) | (4 << 12)); + } + + for (i = 0; i < 4; ++i) + for (j = 0; j < 3; ++j) + { + const int n = j + i * 3; + iLength2[n + 244] = (unsigned int) (i | (j << 3) | (5 << 12)); + nLength2[n + 500] = (unsigned int) (i | (j << 3) | (2 << 12) | (1 << 15)); + } + + for (i = 0; i < 5; ++i) + for (j = 0; j < 5; ++j) + for (int k = 0; k < 4; ++k) + for (int l = 0; l < 4; ++l) + { + const int n = l + k * 4 + j * 16 + i * 80; + nLength2[n] = (unsigned int) (i | (j << 3) | (k << 6) | (l << 9) | (0 << 12)); + } + + for (i = 0; i < 5; ++i) + for (j = 0; j < 5; ++j) + for (int k = 0; k < 4; ++k) + { + const int n = k + j * 4 + i * 20; + nLength2[n + 400] = (unsigned int) (i | (j << 3) | (k << 6) | (1 << 12)); + } + } +}; + +static const Constants constants; + + +//============================================================================== +struct Layer3SideInfo +{ + struct Info + { + void doAntialias (float xr[32][18]) const noexcept + { + float* xr1 = xr[1]; + int sb; + + if (blockType == 2) + { + if (mixedBlockFlag == 0) + return; + + sb = 1; + } + else + sb = (int) maxb - 1; + + for (; sb != 0; --sb, xr1 += 10) + { + const float* cs = constants.antiAliasingCs; + const float* ca = constants.antiAliasingCa; + float* xr2 = xr1; + + for (int ss = 7; ss >= 0; --ss) + { + const float bu = *--xr2, bd = *xr1; + *xr2 = (bu * *cs) - (bd * *ca); + *xr1++ = (bd * *cs++) + (bu * *ca++); + } + } + } + + void doIStereo (float xrBuffer[2][32][18], const int* const scaleFactors, + const int sampleRate, const bool msStereo, const int lsf) const noexcept + { + float (*xr) [32 * 18] = (float (*) [32 * 18]) xrBuffer; + const BandInfoStruct& bi = bandInfo[sampleRate]; + const float* tabl1, *tabl2; + + if (lsf != 0) + { + const int p = scaleFactorCompression & 1; + if (msStereo) + { + tabl1 = constants.pow1_2[p]; + tabl2 = constants.pow2_2[p]; + } + else + { + tabl1 = constants.pow1_1[p]; + tabl2 = constants.pow2_1[p]; + } + } + else + { + if (msStereo) + { + tabl1 = constants.tan1_2; + tabl2 = constants.tan2_2; + } + else + { + tabl1 = constants.tan1_1; + tabl2 = constants.tan2_1; + } + } + + if (blockType == 2) + { + bool doL = mixedBlockFlag != 0; + + for (uint32 lwin = 0; lwin < 3; ++lwin) + { + uint32 sfb = maxBand[lwin]; + doL = doL && (sfb <= 3); + + for (; sfb < 12; ++sfb) + { + const int p = scaleFactors[sfb * 3 + lwin - mixedBlockFlag]; + if (p != 7) + { + const float t1 = tabl1[p]; + const float t2 = tabl2[p]; + int sb = bi.shortDiff[sfb]; + uint32 index = (uint32) sb + lwin; + + for (; sb > 0; --sb, index += 3) + { + float v = xr[0][index]; + xr[0][index] = v * t1; + xr[1][index] = v * t2; + } + } + } + + const int p = scaleFactors[11 * 3 + lwin - mixedBlockFlag]; + + if (p != 7) + { + const float t1 = tabl1[p]; + const float t2 = tabl2[p]; + int sb = bi.shortDiff[12]; + uint32 index = (uint32) sb + lwin; + + for (; sb > 0; --sb, index += 3) + { + float v = xr[0][index]; + xr[0][index] = v * t1; + xr[1][index] = v * t2; + } + } + } + + if (doL) + { + int index = bi.longIndex[maxBandl]; + + for (uint32 sfb = maxBandl; sfb < 8; ++sfb) + { + int sb = bi.longDiff[sfb]; + const int p = scaleFactors[sfb]; + + if (p != 7) + { + const float t1 = tabl1[p]; + const float t2 = tabl2[p]; + + for (; sb > 0; --sb, ++index) + { + float v = xr[0][index]; + xr[0][index] = v * t1; + xr[1][index] = v * t2; + } + } + else + index += sb; + } + } + } + else + { + int index = bi.longIndex[maxBandl]; + + for (uint32 sfb = maxBandl; sfb < 21; ++sfb) + { + int sb = bi.longDiff[sfb]; + const int p = scaleFactors[sfb]; + + if (p != 7) + { + const float t1 = tabl1[p]; + const float t2 = tabl2[p]; + + for (; sb > 0; --sb, ++index) + { + const float v = xr[0][index]; + xr[0][index] = v * t1; + xr[1][index] = v * t2; + } + } + else + index += sb; + } + + const int p = scaleFactors[20]; + if (p != 7) + { + const float t1 = tabl1[p], t2 = tabl2[p]; + + for (int sb = bi.longDiff[21]; sb > 0; --sb, ++index) + { + const float v = xr[0][index]; + xr[0][index] = v * t1; + xr[1][index] = v * t2; + } + } + } + } + + int scfsi; + uint32 part2_3Length, bigValues; + uint32 scaleFactorCompression, blockType, mixedBlockFlag; + uint32 tableSelect[3]; + uint32 maxBand[3]; + uint32 maxBandl, maxb, region1Start, region2Start; + uint32 preflag, scaleFactorScale, count1TableSelect; + const float* fullGain[3]; + const float* pow2gain; + }; + + struct InfoPair { Info gr[2]; }; + InfoPair ch[2]; + + uint32 mainDataStart, privateBits; +}; + +//============================================================================== +namespace DCT +{ + enum { SBLIMIT = 32 }; + static const float cos6_1 = 0.866025388f; + static const float cos6_2 = 0.5f; + static const float cos9[] = { 1.0f, 0.98480773f, 0.939692616f, 0.866025388f, 0.766044438f, 0.642787635f, 0.5f, 0.342020154f, 0.173648179f }; + static const float cos36[] = { 0.501909912f, 0.517638087f, 0.551688969f, 0.610387266f, 0.707106769f, 0.871723413f, 1.18310082f, 1.93185163f, 5.73685646f }; + static const float cos12[] = { 0.517638087f, 0.707106769f, 1.93185163f }; + + inline void dct36_0 (const int v, float* const ts, float* const out1, float* const out2, + const float* const wintab, float sum0, const float sum1) noexcept + { + const float tmp = sum0 + sum1; + out2[9 + v] = tmp * wintab[27 + v]; + out2[8 - v] = tmp * wintab[26 - v]; + sum0 -= sum1; + ts[SBLIMIT * (8 - v)] = out1[8 - v] + sum0 * wintab[8 - v]; + ts[SBLIMIT * (9 + v)] = out1[9 + v] + sum0 * wintab[9 + v]; + } + + inline void dct36_1 (const int v, float* const ts, float* const out1, float* const out2, const float* const wintab, + const float tmp1a, const float tmp1b, const float tmp2a, const float tmp2b) noexcept + { + dct36_0 (v, ts, out1, out2, wintab, tmp1a + tmp2a, (tmp1b + tmp2b) * cos36[v]); + } + + inline void dct36_2 (const int v, float* const ts, float* const out1, float* const out2, const float* const wintab, + const float tmp1a, const float tmp1b, const float tmp2a, const float tmp2b) noexcept + { + dct36_0 (v, ts, out1, out2, wintab, tmp2a - tmp1a, (tmp2b - tmp1b) * cos36[v]); + } + + static void dct36 (float* const in, float* const out1, float* const out2, const float* const wintab, float* const ts) noexcept + { + in[17] += in[16]; in[16] += in[15]; in[15] += in[14]; in[14] += in[13]; in[13] += in[12]; + in[12] += in[11]; in[11] += in[10]; in[10] += in[9]; in[9] += in[8]; in[8] += in[7]; + in[7] += in[6]; in[6] += in[5]; in[5] += in[4]; in[4] += in[3]; in[3] += in[2]; + in[2] += in[1]; in[1] += in[0]; in[17] += in[15]; in[15] += in[13]; in[13] += in[11]; + in[11] += in[9]; in[9] += in[7]; in[7] += in[5]; in[5] += in[3]; in[3] += in[1]; + + const float ta33 = in[6] * cos9[3]; + const float ta66 = in[12] * cos9[6]; + const float tb33 = in[7] * cos9[3]; + const float tb66 = in[13] * cos9[6]; + + { + const float tmp1a = in[2] * cos9[1] + ta33 + in[10] * cos9[5] + in[14] * cos9[7]; + const float tmp1b = in[3] * cos9[1] + tb33 + in[11] * cos9[5] + in[15] * cos9[7]; + const float tmp2a = in[0] + in[4] * cos9[2] + in[8] * cos9[4] + ta66 + in[16] * cos9[8]; + const float tmp2b = in[1] + in[5] * cos9[2] + in[9] * cos9[4] + tb66 + in[17] * cos9[8]; + dct36_1 (0, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + dct36_2 (8, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + } + + { + const float tmp1a = (in[2] - in[10] - in[14]) * cos9[3]; + const float tmp1b = (in[3] - in[11] - in[15]) * cos9[3]; + const float tmp2a = (in[4] - in[8] - in[16]) * cos9[6] - in[12] + in[0]; + const float tmp2b = (in[5] - in[9] - in[17]) * cos9[6] - in[13] + in[1]; + dct36_1 (1, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + dct36_2 (7, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + } + + { + const float tmp1a = in[2] * cos9[5] - ta33 - in[10] * cos9[7] + in[14] * cos9[1]; + const float tmp1b = in[3] * cos9[5] - tb33 - in[11] * cos9[7] + in[15] * cos9[1]; + const float tmp2a = in[0] - in[4] * cos9[8] - in[8] * cos9[2] + ta66 + in[16] * cos9[4]; + const float tmp2b = in[1] - in[5] * cos9[8] - in[9] * cos9[2] + tb66 + in[17] * cos9[4]; + dct36_1 (2, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + dct36_2 (6, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + } + + { + const float tmp1a = in[2] * cos9[7] - ta33 + in[10] * cos9[1] - in[14] * cos9[5]; + const float tmp1b = in[3] * cos9[7] - tb33 + in[11] * cos9[1] - in[15] * cos9[5]; + const float tmp2a = in[0] - in[4] * cos9[4] + in[8] * cos9[8] + ta66 - in[16] * cos9[2]; + const float tmp2b = in[1] - in[5] * cos9[4] + in[9] * cos9[8] + tb66 - in[17] * cos9[2]; + dct36_1 (3, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + dct36_2 (5, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); + } + + const float sum0 = in[0] - in[4] + in[8] - in[12] + in[16]; + const float sum1 = (in[1] - in[5] + in[9] - in[13] + in[17]) * cos36[4]; + dct36_0 (4, ts, out1, out2, wintab, sum0, sum1); + } + + struct DCT12Inputs + { + float in0, in1, in2, in3, in4, in5; + + inline DCT12Inputs (const float* const in) noexcept + { + in5 = in[5*3] + (in4 = in[4*3]); + in4 += (in3 = in[3*3]); + in3 += (in2 = in[2*3]); + in2 += (in1 = in[1*3]); + in1 += (in0 = in[0*3]); + in5 += in3; in3 += in1; + in2 *= cos6_1; + in3 *= cos6_1; + } + + inline void process() noexcept + { + in0 += in4 * cos6_2; + in4 = in0 + in2; in0 -= in2; + in1 += in5 * cos6_2; + in5 = (in1 + in3) * cos12[0]; + in1 = (in1 - in3) * cos12[2]; + in3 = in4 + in5; in4 -= in5; + in2 = in0 + in1; in0 -= in1; + } + }; + + static void dct12 (const float* in, float* const out1, float* const out2, const float* wi, float* ts) noexcept + { + { + ts[0] = out1[0]; + ts[SBLIMIT * 1] = out1[1]; + ts[SBLIMIT * 2] = out1[2]; + ts[SBLIMIT * 3] = out1[3]; + ts[SBLIMIT * 4] = out1[4]; + ts[SBLIMIT * 5] = out1[5]; + + DCT12Inputs inputs (in); + + { + float tmp1 = (inputs.in0 - inputs.in4); + const float tmp2 = (inputs.in1 - inputs.in5) * cos12[1]; + const float tmp0 = tmp1 + tmp2; + tmp1 -= tmp2; + + ts[16 * SBLIMIT] = out1[16] + tmp0 * wi[10]; + ts[13 * SBLIMIT] = out1[13] + tmp0 * wi[7]; + ts[7 * SBLIMIT] = out1[7] + tmp1 * wi[1]; + ts[10 * SBLIMIT] = out1[10] + tmp1 * wi[4]; + } + + inputs.process(); + + ts[17 * SBLIMIT] = out1[17] + inputs.in2 * wi[11]; + ts[12 * SBLIMIT] = out1[12] + inputs.in2 * wi[6]; + ts[14 * SBLIMIT] = out1[14] + inputs.in3 * wi[8]; + ts[15 * SBLIMIT] = out1[15] + inputs.in3 * wi[9]; + + ts[6 * SBLIMIT] = out1[6] + inputs.in0 * wi[0]; + ts[11 * SBLIMIT] = out1[11] + inputs.in0 * wi[5]; + ts[8 * SBLIMIT] = out1[8] + inputs.in4 * wi[2]; + ts[9 * SBLIMIT] = out1[9] + inputs.in4 * wi[3]; + } + + { + DCT12Inputs inputs (++in); + float tmp1 = (inputs.in0 - inputs.in4); + const float tmp2 = (inputs.in1 - inputs.in5) * cos12[1]; + const float tmp0 = tmp1 + tmp2; + tmp1 -= tmp2; + out2[4] = tmp0 * wi[10]; + out2[1] = tmp0 * wi[7]; + ts[13 * SBLIMIT] += tmp1 * wi[1]; + ts[16 * SBLIMIT] += tmp1 * wi[4]; + + inputs.process(); + + out2[5] = inputs.in2 * wi[11]; + out2[0] = inputs.in2 * wi[6]; + out2[2] = inputs.in3 * wi[8]; + out2[3] = inputs.in3 * wi[9]; + ts[12 * SBLIMIT] += inputs.in0 * wi[0]; + ts[17 * SBLIMIT] += inputs.in0 * wi[5]; + ts[14 * SBLIMIT] += inputs.in4 * wi[2]; + ts[15 * SBLIMIT] += inputs.in4 * wi[5 - 2]; + } + + { + DCT12Inputs inputs (++in); + out2[12] = out2[13] = out2[14] = out2[15] = out2[16] = out2[17] = 0; + + float tmp1 = (inputs.in0 - inputs.in4); + const float tmp2 = (inputs.in1 - inputs.in5) * cos12[1]; + const float tmp0 = tmp1 + tmp2; + tmp1 -= tmp2; + + out2[10] = tmp0 * wi[10]; + out2[7] = tmp0 * wi[7]; + out2[1] += tmp1 * wi[1]; + out2[4] += tmp1 * wi[4]; + + inputs.process(); + + out2[11] = inputs.in2 * wi[11]; + out2[6] = inputs.in2 * wi[6]; + out2[8] = inputs.in3 * wi[8]; + out2[9] = inputs.in3 * wi[9]; + out2[0] += inputs.in0 * wi[0]; + out2[5] += inputs.in0 * wi[5]; + out2[2] += inputs.in4 * wi[2]; + out2[3] += inputs.in4 * wi[3]; + } + } + + static void dct64 (float* const out0, float* const out1, float* const b1, float* const b2, const float* const samples) noexcept + { + { + const float* const costab = constants.cosTables[0]; + b1[0x00] = samples[0x00] + samples[0x1F]; b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; + b1[0x01] = samples[0x01] + samples[0x1E]; b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; + b1[0x02] = samples[0x02] + samples[0x1D]; b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; + b1[0x03] = samples[0x03] + samples[0x1C]; b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; + b1[0x04] = samples[0x04] + samples[0x1B]; b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; + b1[0x05] = samples[0x05] + samples[0x1A]; b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; + b1[0x06] = samples[0x06] + samples[0x19]; b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; + b1[0x07] = samples[0x07] + samples[0x18]; b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; + b1[0x08] = samples[0x08] + samples[0x17]; b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; + b1[0x09] = samples[0x09] + samples[0x16]; b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; + b1[0x0A] = samples[0x0A] + samples[0x15]; b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; + b1[0x0B] = samples[0x0B] + samples[0x14]; b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; + b1[0x0C] = samples[0x0C] + samples[0x13]; b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; + b1[0x0D] = samples[0x0D] + samples[0x12]; b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; + b1[0x0E] = samples[0x0E] + samples[0x11]; b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; + b1[0x0F] = samples[0x0F] + samples[0x10]; b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; + } + + { + const float* const costab = constants.cosTables[1]; + b2[0x00] = b1[0x00] + b1[0x0F]; b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; + b2[0x01] = b1[0x01] + b1[0x0E]; b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; + b2[0x02] = b1[0x02] + b1[0x0D]; b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; + b2[0x03] = b1[0x03] + b1[0x0C]; b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; + b2[0x04] = b1[0x04] + b1[0x0B]; b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; + b2[0x05] = b1[0x05] + b1[0x0A]; b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; + b2[0x06] = b1[0x06] + b1[0x09]; b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; + b2[0x07] = b1[0x07] + b1[0x08]; b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; + b2[0x10] = b1[0x10] + b1[0x1F]; b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; + b2[0x11] = b1[0x11] + b1[0x1E]; b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; + b2[0x12] = b1[0x12] + b1[0x1D]; b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; + b2[0x13] = b1[0x13] + b1[0x1C]; b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; + b2[0x14] = b1[0x14] + b1[0x1B]; b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; + b2[0x15] = b1[0x15] + b1[0x1A]; b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; + b2[0x16] = b1[0x16] + b1[0x19]; b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; + b2[0x17] = b1[0x17] + b1[0x18]; b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; + } + + { + const float* const costab = constants.cosTables[2]; + b1[0x00] = b2[0x00] + b2[0x07]; b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; + b1[0x01] = b2[0x01] + b2[0x06]; b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; + b1[0x02] = b2[0x02] + b2[0x05]; b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; + b1[0x03] = b2[0x03] + b2[0x04]; b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; + b1[0x08] = b2[0x08] + b2[0x0F]; b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; + b1[0x09] = b2[0x09] + b2[0x0E]; b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; + b1[0x0A] = b2[0x0A] + b2[0x0D]; b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; + b1[0x0B] = b2[0x0B] + b2[0x0C]; b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; + b1[0x10] = b2[0x10] + b2[0x17]; b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; + b1[0x11] = b2[0x11] + b2[0x16]; b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; + b1[0x12] = b2[0x12] + b2[0x15]; b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; + b1[0x13] = b2[0x13] + b2[0x14]; b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; + b1[0x18] = b2[0x18] + b2[0x1F]; b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; + b1[0x19] = b2[0x19] + b2[0x1E]; b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; + b1[0x1A] = b2[0x1A] + b2[0x1D]; b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; + b1[0x1B] = b2[0x1B] + b2[0x1C]; b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; + } + + { + const float cos0 = constants.cosTables[3][0]; + const float cos1 = constants.cosTables[3][1]; + b2[0x00] = b1[0x00] + b1[0x03]; b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; + b2[0x01] = b1[0x01] + b1[0x02]; b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; + b2[0x04] = b1[0x04] + b1[0x07]; b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; + b2[0x05] = b1[0x05] + b1[0x06]; b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; + b2[0x08] = b1[0x08] + b1[0x0B]; b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; + b2[0x09] = b1[0x09] + b1[0x0A]; b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; + b2[0x0C] = b1[0x0C] + b1[0x0F]; b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; + b2[0x0D] = b1[0x0D] + b1[0x0E]; b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; + b2[0x10] = b1[0x10] + b1[0x13]; b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; + b2[0x11] = b1[0x11] + b1[0x12]; b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; + b2[0x14] = b1[0x14] + b1[0x17]; b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; + b2[0x15] = b1[0x15] + b1[0x16]; b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; + b2[0x18] = b1[0x18] + b1[0x1B]; b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; + b2[0x19] = b1[0x19] + b1[0x1A]; b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; + b2[0x1C] = b1[0x1C] + b1[0x1F]; b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; + b2[0x1D] = b1[0x1D] + b1[0x1E]; b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; + } + + { + const float cos0 = constants.cosTables[4][0]; + b1[0x00] = b2[0x00] + b2[0x01]; b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; + b1[0x02] = b2[0x02] + b2[0x03]; b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; b1[0x02] += b1[0x03]; + b1[0x04] = b2[0x04] + b2[0x05]; b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; + b1[0x06] = b2[0x06] + b2[0x07]; b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; + b1[0x06] += b1[0x07]; b1[0x04] += b1[0x06]; b1[0x06] += b1[0x05]; b1[0x05] += b1[0x07]; + b1[0x08] = b2[0x08] + b2[0x09]; b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; + b1[0x0A] = b2[0x0A] + b2[0x0B]; b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; b1[0x0A] += b1[0x0B]; + b1[0x0C] = b2[0x0C] + b2[0x0D]; b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; + b1[0x0E] = b2[0x0E] + b2[0x0F]; b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; + b1[0x0E] += b1[0x0F]; b1[0x0C] += b1[0x0E]; b1[0x0E] += b1[0x0D]; b1[0x0D] += b1[0x0F]; + b1[0x10] = b2[0x10] + b2[0x11]; b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; + b1[0x12] = b2[0x12] + b2[0x13]; b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; b1[0x12] += b1[0x13]; + b1[0x14] = b2[0x14] + b2[0x15]; b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; + b1[0x16] = b2[0x16] + b2[0x17]; b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; + b1[0x16] += b1[0x17]; b1[0x14] += b1[0x16]; b1[0x16] += b1[0x15]; b1[0x15] += b1[0x17]; + b1[0x18] = b2[0x18] + b2[0x19]; b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; + b1[0x1A] = b2[0x1A] + b2[0x1B]; b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; b1[0x1A] += b1[0x1B]; + b1[0x1C] = b2[0x1C] + b2[0x1D]; b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; + b1[0x1E] = b2[0x1E] + b2[0x1F]; b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; + b1[0x1E] += b1[0x1F]; b1[0x1C] += b1[0x1E]; b1[0x1E] += b1[0x1D]; b1[0x1D] += b1[0x1F]; + } + + out0[0x10 * 16] = b1[0x00]; out0[0x10 * 12] = b1[0x04]; out0[0x10 * 8] = b1[0x02]; out0[0x10 * 4] = b1[0x06]; + out0[0] = b1[0x01]; out1[0] = b1[0x01]; out1[0x10 * 4] = b1[0x05]; out1[0x10 * 8] = b1[0x03]; + out1[0x10 * 12] = b1[0x07]; + + b1[0x08] += b1[0x0C]; out0[0x10 * 14] = b1[0x08]; b1[0x0C] += b1[0x0a]; out0[0x10 * 10] = b1[0x0C]; + b1[0x0A] += b1[0x0E]; out0[0x10 * 6] = b1[0x0A]; b1[0x0E] += b1[0x09]; out0[0x10 * 2] = b1[0x0E]; + b1[0x09] += b1[0x0D]; out1[0x10 * 2] = b1[0x09]; b1[0x0D] += b1[0x0B]; out1[0x10 * 6] = b1[0x0D]; + b1[0x0B] += b1[0x0F]; out1[0x10 * 10] = b1[0x0B]; out1[0x10 * 14] = b1[0x0F]; + + b1[0x18] += b1[0x1C]; out0[0x10 * 15] = b1[0x10] + b1[0x18]; out0[0x10 * 13] = b1[0x18] + b1[0x14]; + b1[0x1C] += b1[0x1a]; out0[0x10 * 11] = b1[0x14] + b1[0x1C]; out0[0x10 * 9] = b1[0x1C] + b1[0x12]; + b1[0x1A] += b1[0x1E]; out0[0x10 * 7] = b1[0x12] + b1[0x1A]; out0[0x10 * 5] = b1[0x1A] + b1[0x16]; + b1[0x1E] += b1[0x19]; out0[0x10 * 3] = b1[0x16] + b1[0x1E]; out0[0x10 * 1] = b1[0x1E] + b1[0x11]; + b1[0x19] += b1[0x1D]; out1[0x10 * 1] = b1[0x11] + b1[0x19]; out1[0x10 * 3] = b1[0x19] + b1[0x15]; + b1[0x1D] += b1[0x1B]; out1[0x10 * 5] = b1[0x15] + b1[0x1D]; out1[0x10 * 7] = b1[0x1D] + b1[0x13]; + b1[0x1B] += b1[0x1F]; out1[0x10 * 9] = b1[0x13] + b1[0x1B]; out1[0x10 * 11] = b1[0x1B] + b1[0x17]; + out1[0x10 * 13] = b1[0x17] + b1[0x1F]; out1[0x10 * 15] = b1[0x1F]; + } + + static void dct64 (float* const a, float* const b, const float* const c) noexcept + { + float temp[64]; + dct64 (a, b, temp, temp + 32, c); + } +} + +//============================================================================== +struct MP3Stream +{ + MP3Stream (InputStream& source) + : stream (source, 8192), + numFrames (0), currentFrameIndex (0), vbrHeaderFound (false) + { + reset(); + } + + int decodeNextBlock (float* const out0, float* const out1, int& done) + { + if (! headerParsed) + { + int nextFrameOffset = scanForNextFrameHeader (false); + + if (lastFrameSize == -1 || needToSyncBitStream) + { + needToSyncBitStream = false; + readVBRHeader(); + + if (vbrHeaderFound) + return 1; + } + + if (nextFrameOffset < 0) + return -1; + + if (nextFrameOffset > 0) + { + int size; + wasFreeFormat = false; + needToSyncBitStream = true; + size = (int) (bufferPointer - (bufferSpace[bufferSpaceIndex] + 512)); + + if (size > 2880) + { + size = 0; + bufferPointer = bufferSpace[bufferSpaceIndex] + 512; + } + + const int toSkip = (size + nextFrameOffset) - 2880; + + if (toSkip > 0) + { + stream.skipNextBytes (toSkip); + nextFrameOffset -= toSkip; + } + + stream.read (bufferPointer, nextFrameOffset); + lastFrameSize += nextFrameOffset; + } + + frame.decodeHeader ((uint32) stream.readIntBigEndian()); + headerParsed = true; + frameSize = frame.frameSize; + isFreeFormat = (frameSize == 0); + sideInfoSize = frame.lsf != 0 ? ((frame.numChannels == 1) ? 9 : 17) + : ((frame.numChannels == 1) ? 17 : 32); + + if (frame.crc16FollowsHeader) + sideInfoSize += 2; + + bufferSpaceIndex = 1 - bufferSpaceIndex; + bufferPointer = bufferSpace[bufferSpaceIndex] + 512; + bitIndex = 0; + + if (lastFrameSize < 0) + return 1; + } + + if (! sideParsed) + { + if (frame.layer == 3) + { + stream.read (bufferPointer, sideInfoSize); + + if (frame.crc16FollowsHeader) + getBits (16); + + const int bits = jmax (0, decodeLayer3SideInfo()); + dataSize = (bits + 7) / 8; + + if (! isFreeFormat) + dataSize = jmin (dataSize, frame.frameSize - sideInfoSize); + } + else + { + dataSize = frame.frameSize; + sideInfoSize = 0; + } + + sideParsed = true; + } + + int result = 1; + + if (! dataParsed) + { + stream.read (bufferPointer, dataSize); + + if (out0 != nullptr) + { + if (frame.layer < 3 && frame.crc16FollowsHeader) + getBits (16); + + switch (frame.layer) + { + case 1: decodeLayer1Frame (out0, out1, done); break; + case 2: decodeLayer2Frame (out0, out1, done); break; + case 3: decodeLayer3Frame (out0, out1, done); break; + default: break; + } + } + + bufferPointer = bufferSpace[bufferSpaceIndex] + 512 + sideInfoSize + dataSize; + dataParsed = true; + result = 0; + } + + if (isFreeFormat) + { + if (wasFreeFormat) + { + frameSize = lastFrameSizeNoPadding + frame.padding; + } + else + { + const int nextFrameOffset = scanForNextFrameHeader (true); + + wasFreeFormat = isFreeFormat; + + if (nextFrameOffset < 0) + { + lastFrameSize = frameSize; + return result; + } + + frameSize = nextFrameOffset + sideInfoSize + dataSize; + lastFrameSizeNoPadding = frameSize - frame.padding; + } + } + + if (result == 0) + return result; + + int bytes = frameSize - (sideInfoSize + dataSize); + + if (bytes > 0) + { + const int toSkip = bytes - 512; + + if (toSkip > 0) + { + stream.skipNextBytes (toSkip); + bytes -= toSkip; + frameSize -= toSkip; + } + + stream.read (bufferPointer, bytes); + bufferPointer += bytes; + } + + lastFrameSize = frameSize; + wasFreeFormat = isFreeFormat; + frameSize = 0; + headerParsed = sideParsed = dataParsed = false; + return result; + } + + bool seek (int frameIndex) + { + frameIndex = jmax (0, frameIndex); + + while (frameIndex >= frameStreamPositions.size() * storedStartPosInterval) + { + int dummy = 0; + const int result = decodeNextBlock (nullptr, nullptr, dummy); + + if (result < 0) + return false; + + if (result > 0) + break; + } + + frameIndex = jmin (frameIndex & ~(storedStartPosInterval - 1), + frameStreamPositions.size() * storedStartPosInterval - 1); + stream.setPosition (frameStreamPositions.getUnchecked (frameIndex / storedStartPosInterval)); + currentFrameIndex = frameIndex; + reset(); + return true; + } + + MP3Frame frame; + VBRTagData vbrTagData; + BufferedInputStream stream; + int numFrames, currentFrameIndex; + bool vbrHeaderFound; + +private: + bool headerParsed, sideParsed, dataParsed, needToSyncBitStream; + bool isFreeFormat, wasFreeFormat; + int sideInfoSize, dataSize; + int frameSize, lastFrameSize, lastFrameSizeNoPadding; + int bufferSpaceIndex; + Layer3SideInfo sideinfo; + uint8 bufferSpace[2][2880 + 1024]; + uint8* bufferPointer; + int bitIndex, synthBo; + float hybridBlock[2][2][32 * 18]; + int hybridBlockIndex[2]; + float synthBuffers[2][2][0x110]; + float hybridIn[2][32][18]; + float hybridOut[2][18][32]; + + void reset() noexcept + { + headerParsed = sideParsed = dataParsed = isFreeFormat = wasFreeFormat = false; + lastFrameSize = -1; + needToSyncBitStream = true; + frameSize = sideInfoSize = dataSize = frameSize = bitIndex = 0; + lastFrameSizeNoPadding = bufferSpaceIndex = 0; + bufferPointer = bufferSpace[bufferSpaceIndex] + 512; + synthBo = 1; + + zerostruct (sideinfo); + zeromem (bufferSpace, sizeof (bufferSpace)); + zeromem (hybridBlock, sizeof (hybridBlock)); + zeromem (hybridBlockIndex, sizeof (hybridBlockIndex)); + zeromem (synthBuffers, sizeof (synthBuffers)); + } + + enum { storedStartPosInterval = 4 }; + Array frameStreamPositions; + + struct SideInfoLayer1 + { + uint8 allocation[32][2]; + uint8 scaleFactor[32][2]; + }; + + struct SideInfoLayer2 + { + uint8 allocation[32][2]; + uint8 scaleFactor[32][2][3]; + }; + + static bool isValidHeader (const uint32 header, const int oldLayer) noexcept + { + const int newLayer = 4 - ((header >> 17) & 3); + + return (header & 0xffe00000) == 0xffe00000 + && newLayer != 4 + && (oldLayer <= 0 || newLayer == oldLayer) + && ((header >> 12) & 15) != 15 + && ((header >> 10) & 3) != 3 + && (header & 3) != 2; + } + + bool rollBackBufferPointer (int backstep) noexcept + { + if (lastFrameSize < 0 && backstep > 0) + return false; + + const uint8* oldBuffer = bufferSpace[1 - bufferSpaceIndex] + 512; + bufferPointer -= backstep; + + if (backstep != 0) + memcpy (bufferPointer, oldBuffer + lastFrameSize - backstep, (size_t) backstep); + + bitIndex = 0; + return true; + } + + uint32 getBits (const int numBits) noexcept + { + if (numBits <= 0 || bufferPointer == nullptr) + return 0; + + const uint32 result = ((((((bufferPointer[0] << 8) | bufferPointer[1]) << 8) + | bufferPointer[2]) << bitIndex) & 0xffffff) >> (24 - numBits); + bitIndex += numBits; + bufferPointer += (bitIndex >> 3); + bitIndex &= 7; + return result; + } + + uint32 getOneBit() noexcept + { + const uint8 result = (uint8) (*bufferPointer << bitIndex); + ++bitIndex; + bufferPointer += (bitIndex >> 3); + bitIndex &= 7; + return result >> 7; + } + + uint32 getBitsUnchecked (const int numBits) noexcept + { + const uint32 result = ((((bufferPointer[0] << 8) | bufferPointer[1]) << bitIndex) & 0xffff) >> (16 - numBits); + bitIndex += numBits; + bufferPointer += (bitIndex >> 3); + bitIndex &= 7; + return result; + } + + inline uint8 getBitsUint8 (const int numBits) noexcept { return (uint8) getBitsUnchecked (numBits); } + inline uint16 getBitsUint16 (const int numBits) noexcept { return (uint16) getBitsUnchecked (numBits); } + + int scanForNextFrameHeader (const bool checkTypeAgainstLastFrame) noexcept + { + const int64 oldPos = stream.getPosition(); + int offset = -3; + uint32 header = 0; + + for (;;) + { + if (stream.isExhausted() || stream.getPosition() > oldPos + 32768) + { + offset = -1; + break; + } + + header = (header << 8) | (uint8) stream.readByte(); + + if (offset >= 0 && isValidHeader (header, frame.layer)) + { + if (! checkTypeAgainstLastFrame) + break; + + const bool mpeg25 = (header & (1 << 20)) == 0; + const uint32 lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1); + const uint32 sampleRateIndex = mpeg25 ? (6 + ((header >> 10) & 3)) : (((header >> 10) & 3) + (lsf * 3)); + const uint32 mode = (header >> 6) & 3; + const uint32 numChannels = (mode == 3) ? 1 : 2; + + if (numChannels == (uint32) frame.numChannels && lsf == (uint32) frame.lsf + && mpeg25 == frame.mpeg25 && sampleRateIndex == (uint32) frame.sampleRateIndex) + break; + } + + ++offset; + } + + if (offset >= 0) + { + if ((currentFrameIndex & (storedStartPosInterval - 1)) == 0) + frameStreamPositions.set (currentFrameIndex / storedStartPosInterval, oldPos + offset); + + ++currentFrameIndex; + } + + stream.setPosition (oldPos); + return offset; + } + + void readVBRHeader() + { + int64 oldPos = stream.getPosition(); + uint8 xing[194]; + stream.read (xing, sizeof (xing)); + + vbrHeaderFound = vbrTagData.read (xing); + + if (vbrHeaderFound) + { + numFrames = (int) vbrTagData.frames; + oldPos += jmax (vbrTagData.headersize, 1); + } + + stream.setPosition (oldPos); + } + + void decodeLayer1Frame (float* const pcm0, float* const pcm1, int& samplesDone) noexcept + { + float fraction[2][32]; + SideInfoLayer1 si; + layer1Step1 (si); + const int single = (frame.numChannels == 1 || frame.single == 3) ? 0 : frame.single; + + if (single >= 0) + { + for (int i = 0; i < 12; ++i) + { + layer1Step2 (si, fraction); + synthesise (fraction[single], 0, pcm0, samplesDone); + } + } + else + { + for (int i = 0; i < 12; ++i) + { + layer1Step2 (si, fraction); + synthesiseStereo (fraction[0], fraction[1], pcm0, pcm1, samplesDone); + } + } + } + + void decodeLayer2Frame (float* const pcm0, float* const pcm1, int& samplesDone) + { + float fraction[2][4][32]; + frame.selectLayer2Table(); + SideInfoLayer2 si; + layer2Step1 (si); + const int single = (frame.numChannels == 1 || frame.single == 3) ? 0 : frame.single; + + if (single >= 0) + { + for (int i = 0; i < 12; ++i) + { + layer2Step2 (si, i >> 2, fraction); + for (int j = 0; j < 3; ++j) + synthesise (fraction[single][j], 0, pcm0, samplesDone); + } + } + else + { + for (int i = 0; i < 12; ++i) + { + layer2Step2 (si, i >> 2, fraction); + for (int j = 0; j < 3; ++j) + synthesiseStereo (fraction[0][j], fraction[1][j], pcm0, pcm1, samplesDone); + } + } + } + + void decodeLayer3Frame (float* const pcm0, float* const pcm1, int& samplesDone) noexcept + { + if (! rollBackBufferPointer ((int) sideinfo.mainDataStart)) + return; + + const int single = frame.numChannels == 1 ? 0 : frame.single; + const int numChans = (frame.numChannels == 1 || single >= 0) ? 1 : 2; + const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0; + const bool iStereo = (frame.mode == 1) && (frame.modeExt & 1) != 0; + const int granules = frame.lsf ? 1 : 2; + int scaleFactors[2][39]; + + for (int gr = 0; gr < granules; ++gr) + { + { + Layer3SideInfo::Info& granule = sideinfo.ch[0].gr[gr]; + const int part2bits = frame.lsf ? getLayer3ScaleFactors2 (scaleFactors[0], granule, 0) + : getLayer3ScaleFactors1 (scaleFactors[0], granule); + + if (layer3DequantizeSample (hybridIn[0], scaleFactors[0], granule, frame.sampleRateIndex, part2bits)) + return; + } + + if (frame.numChannels == 2) + { + Layer3SideInfo::Info& granule = sideinfo.ch[1].gr[gr]; + const int part2bits = frame.lsf ? getLayer3ScaleFactors2 (scaleFactors[1], granule, iStereo) + : getLayer3ScaleFactors1 (scaleFactors[1], granule); + + if (layer3DequantizeSample (hybridIn[1], scaleFactors[1], granule, frame.sampleRateIndex, part2bits)) + return; + + if (msStereo) + { + for (int i = 0; i < 32 * 18; ++i) + { + const float tmp0 = ((const float*) hybridIn[0]) [i]; + const float tmp1 = ((const float*) hybridIn[1]) [i]; + ((float*) hybridIn[1]) [i] = tmp0 - tmp1; + ((float*) hybridIn[0]) [i] = tmp0 + tmp1; + } + } + + if (iStereo) + granule.doIStereo (hybridIn, scaleFactors[1], frame.sampleRateIndex, msStereo, frame.lsf); + + if (msStereo || iStereo || single == 3) + { + if (granule.maxb > sideinfo.ch[0].gr[gr].maxb) + sideinfo.ch[0].gr[gr].maxb = granule.maxb; + else + granule.maxb = sideinfo.ch[0].gr[gr].maxb; + } + + switch (single) + { + case 3: + { + float* in0 = (float*) hybridIn[0]; + const float* in1 = (const float*) hybridIn[1]; + for (int i = 0; i < (int) (18 * granule.maxb); ++i, ++in0) + *in0 = (*in0 + *in1++); + } + break; + + case 1: + { + float* in0 = (float*) hybridIn[0]; + const float* in1 = (const float*) hybridIn[1]; + for (int i = 0; i < (int) (18 * granule.maxb); ++i) + *in0++ = *in1++; + } + break; + } + } + + for (int ch = 0; ch < numChans; ++ch) + { + const Layer3SideInfo::Info& granule = sideinfo.ch[ch].gr[gr]; + granule.doAntialias (hybridIn[ch]); + layer3Hybrid (hybridIn[ch], hybridOut[ch], ch, granule); + } + + for (int ss = 0; ss < 18; ++ss) + { + if (single >= 0) + synthesise (hybridOut[0][ss], 0, pcm0, samplesDone); + else + synthesiseStereo (hybridOut[0][ss], hybridOut[1][ss], pcm0, pcm1, samplesDone); + } + } + } + + int decodeLayer3SideInfo() noexcept + { + const int numChannels = frame.numChannels; + const int sampleRate = frame.sampleRateIndex; + const int single = (numChannels == 1) ? 0 : frame.single; + const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0; + const int granules = frame.lsf ? 1 : 2; + + if (frame.lsf == 0) + getLayer3SideInfo1 (numChannels, msStereo, sampleRate, single); + else + getLayer3SideInfo2 (numChannels, msStereo, sampleRate, single); + + int databits = 0; + for (int gr = 0; gr < granules; ++gr) + for (int ch = 0; ch < numChannels; ++ch) + databits += sideinfo.ch[ch].gr[gr].part2_3Length; + + return databits - 8 * (int) sideinfo.mainDataStart; + } + + void layer1Step1 (SideInfoLayer1& si) noexcept + { + zerostruct (si); + int i, jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : 32; + + if (frame.numChannels == 2) + { + for (i = 0; i < jsbound; ++i) + { + si.allocation[i][0] = getBitsUint8 (4); + si.allocation[i][1] = getBitsUint8 (4); + } + + for (i = jsbound; i < 32; ++i) + si.allocation[i][0] = si.allocation[i][1] = getBitsUint8 (4); + + for (i = 0; i < 32; ++i) + { + si.scaleFactor[i][0] = si.allocation[i][0] ? getBitsUint8 (6) : 0; + si.scaleFactor[i][1] = si.allocation[i][1] ? getBitsUint8 (6) : 0; + } + } + else + { + for (i = 0; i < 32; ++i) + si.allocation[i][0] = getBitsUint8 (4); + + for (i = 0; i < 32; ++i) + si.scaleFactor[i][0] = si.allocation[i][0] ? getBitsUint8 (6) : 0; + } + } + + void layer1Step2 (SideInfoLayer1& si, float fraction[2][32]) noexcept + { + if (frame.numChannels == 2) + { + int i, jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : 32; + + for (i = 0; i < jsbound; ++i) + { + const uint8 n0 = si.allocation[i][0]; + const uint8 n1 = si.allocation[i][1]; + fraction[0][i] = n0 > 0 ? (float) (((-1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0; + fraction[1][i] = n1 > 0 ? (float) (((-1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0; + } + + for (i = jsbound; i < 32; ++i) + { + const uint8 n = si.allocation[i][0]; + + if (n > 0) + { + const uint32 w = ((uint32) (-1 << n) + getBitsUint16 (n + 1) + 1); + fraction[0][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][0]]); + fraction[1][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][1]]); + } + else + fraction[0][i] = fraction[1][i] = 0; + } + } + else + { + for (int i = 0; i < 32; ++i) + { + const uint8 n = si.allocation[i][0]; + const uint8 j = si.scaleFactor[i][0]; + + if (n > 0) + fraction[0][i] = (float) (((-1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]); + else + fraction[0][i] = 0; + } + } + } + + void layer2Step1 (SideInfoLayer2& si) noexcept + { + zerostruct (si); + const int sblimit = frame.layer2SubBandLimit; + const int jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : frame.layer2SubBandLimit; + const AllocationTable* allocTable = frame.allocationTable; + uint8 scfsi[32][2]; + + if (frame.numChannels == 2) + { + for (int i = 0; i < jsbound; ++i) + { + const int16 step = allocTable->bits; + allocTable += (1 << step); + si.allocation[i][0] = getBitsUint8 (step); + si.allocation[i][1] = getBitsUint8 (step); + } + + for (int i = jsbound; i < sblimit; ++i) + { + const int16 step = allocTable->bits; + const uint8 b0 = getBitsUint8 (step); + allocTable += (1 << step); + si.allocation[i][0] = b0; + si.allocation[i][1] = b0; + } + + for (int i = 0; i < sblimit; ++i) + { + scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0; + scfsi[i][1] = si.allocation[i][1] ? getBitsUint8 (2) : 0; + } + } + else + { + for (int i = 0; i < sblimit; ++i) + { + const int16 step = allocTable->bits; + allocTable += (1 << step); + si.allocation[i][0] = getBitsUint8 (step); + } + + for (int i = 0; i < sblimit; ++i) + scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0; + } + + for (int i = 0; i < sblimit; ++i) + { + for (int ch = 0; ch < frame.numChannels; ++ch) + { + uint8 s0 = 0, s1 = 0, s2 = 0; + + if (si.allocation[i][ch]) + { + switch (scfsi[i][ch]) + { + case 0: + s0 = getBitsUint8 (6); + s1 = getBitsUint8 (6); + s2 = getBitsUint8 (6); + break; + case 1: + s1 = s0 = getBitsUint8 (6); + s2 = getBitsUint8 (6); + break; + case 2: + s2 = s1 = s0 = getBitsUint8 (6); + break; + case 3: + s0 = getBitsUint8 (6); + s2 = s1 = getBitsUint8 (6); + break; + default: + break; + } + } + + si.scaleFactor[i][ch][0] = s0; + si.scaleFactor[i][ch][1] = s1; + si.scaleFactor[i][ch][2] = s2; + } + } + } + + void layer2Step2 (SideInfoLayer2& si, const int gr, float fraction[2][4][32]) noexcept + { + const AllocationTable* allocTable = frame.allocationTable; + const int jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : frame.layer2SubBandLimit; + + for (int i = 0; i < jsbound; ++i) + { + const int16 step = allocTable->bits; + + for (int ch = 0; ch < frame.numChannels; ++ch) + { + const uint8 ba = si.allocation[i][ch]; + if (ba != 0) + { + const uint8 x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]); + const AllocationTable* const alloc2 = allocTable + ba; + const int16 k = jmin ((int16) 16, alloc2->bits); + const int16 d1 = alloc2->d; + + if (d1 < 0) + { + const double cm = constants.muls[k][x1]; + fraction[ch][0][i] = (float) (((int) getBits (k) + d1) * cm); + fraction[ch][1][i] = (float) (((int) getBits (k) + d1) * cm); + fraction[ch][2][i] = (float) (((int) getBits (k) + d1) * cm); + } + else + { + const uint8* const tab = constants.getGroupTable (d1, getBits (k)); + fraction[ch][0][i] = (float) constants.muls[tab[0]][x1]; + fraction[ch][1][i] = (float) constants.muls[tab[1]][x1]; + fraction[ch][2][i] = (float) constants.muls[tab[2]][x1]; + } + } + else + { + fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0; + } + } + + allocTable += (1 << step); + } + + for (int i = jsbound; i < frame.layer2SubBandLimit; ++i) + { + const int16 step = allocTable->bits; + const uint8 ba = si.allocation[i][0]; + + if (ba != 0) + { + const AllocationTable* const alloc2 = allocTable + ba; + int16 k = alloc2->bits; + int16 d1 = alloc2->d; + k = (k <= 16) ? k : 16; + + if (d1 < 0) + { + const int v0 = (int) getBits (k); + const int v1 = (int) getBits (k); + const int v2 = (int) getBits (k); + + for (int ch = 0; ch < frame.numChannels; ++ch) + { + const uint8 x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]); + const double cm = constants.muls[k][x1]; + fraction[ch][0][i] = (float) ((v0 + d1) * cm); + fraction[ch][1][i] = (float) ((v1 + d1) * cm); + fraction[ch][2][i] = (float) ((v2 + d1) * cm); + } + } + else + { + const uint8* const tab = constants.getGroupTable (d1, getBits (k)); + const uint8 k0 = tab[0]; + const uint8 k1 = tab[1]; + const uint8 k2 = tab[2]; + + for (int ch = 0; ch < frame.numChannels; ++ch) + { + const uint8 x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]); + fraction[ch][0][i] = (float) constants.muls[k0][x1]; + fraction[ch][1][i] = (float) constants.muls[k1][x1]; + fraction[ch][2][i] = (float) constants.muls[k2][x1]; + } + } + } + else + { + fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = 0; + fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0; + } + allocTable += (1 << step); + } + + for (int ch = 0; ch < frame.numChannels; ++ch) + for (int i = frame.layer2SubBandLimit; i < 32; ++i) + fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0; + } + + void getLayer3SideInfo1 (const int stereo, const bool msStereo, const int sampleRate, const int single) noexcept + { + const int powdiff = (single == 3) ? 4 : 0; + sideinfo.mainDataStart = getBits (9); + sideinfo.privateBits = getBitsUnchecked (stereo == 1 ? 5 : 3); + + for (int ch = 0; ch < stereo; ++ch) + { + sideinfo.ch[ch].gr[0].scfsi = -1; + sideinfo.ch[ch].gr[1].scfsi = (int) getBitsUnchecked (4); + } + + for (int gr = 0; gr < 2; ++gr) + { + for (int ch = 0; ch < stereo; ++ch) + { + Layer3SideInfo::Info& granule = sideinfo.ch[ch].gr[gr]; + + granule.part2_3Length = getBits (12); + granule.bigValues = jmin (288u, getBitsUnchecked (9)); + + const int qss = (int) getBitsUnchecked (8); + granule.pow2gain = constants.powToGains + 256 - qss + powdiff; + + if (msStereo) + granule.pow2gain += 2; + + granule.scaleFactorCompression = getBitsUnchecked (4); + + if (getOneBit()) + { + granule.blockType = getBitsUnchecked (2); + granule.mixedBlockFlag = getOneBit(); + granule.tableSelect[0] = getBitsUnchecked (5); + granule.tableSelect[1] = getBitsUnchecked (5); + granule.tableSelect[2] = 0; + + for (int i = 0; i < 3; ++i) + { + const uint32 sbg = (getBitsUnchecked (3) << 3); + granule.fullGain[i] = granule.pow2gain + sbg; + } + + granule.region1Start = 36 >> 1; + granule.region2Start = 576 >> 1; + } + else + { + for (int i = 0; i < 3; ++i) + granule.tableSelect[i] = getBitsUnchecked (5); + + const int r0c = (int) getBitsUnchecked (4); + const int r1c = (int) getBitsUnchecked (3); + const int region0index = jmin (22, r0c + 1); + const int region1index = jmin (22, r0c + 1 + r1c + 1); + + granule.region1Start = (uint32) (bandInfo[sampleRate].longIndex[region0index] >> 1); + granule.region2Start = (uint32) (bandInfo[sampleRate].longIndex[region1index] >> 1); + granule.blockType = 0; + granule.mixedBlockFlag = 0; + } + + granule.preflag = getOneBit(); + granule.scaleFactorScale = getOneBit(); + granule.count1TableSelect = getOneBit(); + } + } + } + + void getLayer3SideInfo2 (const int stereo, const bool msStereo, const int sampleRate, const int single) noexcept + { + const int powdiff = (single == 3) ? 4 : 0; + sideinfo.mainDataStart = getBits (8); + sideinfo.privateBits = stereo == 1 ? getOneBit() : getBitsUnchecked (2); + + for (int ch = 0; ch < stereo; ++ch) + { + Layer3SideInfo::Info& granule = sideinfo.ch[ch].gr[0]; + + granule.part2_3Length = getBits (12); + granule.bigValues = jmin (288u, getBitsUnchecked (9)); + + const uint32 qss = getBitsUnchecked (8); + granule.pow2gain = constants.powToGains + 256 - qss + powdiff; + + if (msStereo) + granule.pow2gain += 2; + + granule.scaleFactorCompression = getBits (9); + + if (getOneBit()) + { + granule.blockType = getBitsUnchecked (2); + granule.mixedBlockFlag = getOneBit(); + granule.tableSelect[0] = getBitsUnchecked (5); + granule.tableSelect[1] = getBitsUnchecked (5); + granule.tableSelect[2] = 0; + + for (int i = 0; i < 3; ++i) + { + const uint32 sbg = (getBitsUnchecked (3) << 3); + granule.fullGain[i] = granule.pow2gain + sbg; + } + + if (granule.blockType == 0) + {} + + if (granule.blockType == 2) + granule.region1Start = sampleRate == 8 ? 36 : (36 >> 1); + else + granule.region1Start = sampleRate == 8 ? (108 >> 1) : (54 >> 1); + + granule.region2Start = 576 >> 1; + } + else + { + for (int i = 0; i < 3; ++i) + granule.tableSelect[i] = getBitsUnchecked (5); + + const int r0c = (int) getBitsUnchecked (4); + const int r1c = (int) getBitsUnchecked (3); + const int region0index = jmin (22, r0c + 1); + const int region1index = jmin (22, r0c + 1 + r1c + 1); + + granule.region1Start = (uint32) (bandInfo[sampleRate].longIndex[region0index] >> 1); + granule.region2Start = (uint32) (bandInfo[sampleRate].longIndex[region1index] >> 1); + granule.blockType = 0; + granule.mixedBlockFlag = 0; + } + granule.scaleFactorScale = getOneBit(); + granule.count1TableSelect = getOneBit(); + } + } + + int getLayer3ScaleFactors1 (int* scf, const Layer3SideInfo::Info& granule) noexcept + { + static const uint8 lengths[2][16] = + { + { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, + { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 } + }; + + int numBits; + const int num0 = lengths[0][granule.scaleFactorCompression]; + const int num1 = lengths[1][granule.scaleFactorCompression]; + + if (granule.blockType == 2) + { + int i = 18; + numBits = (num0 + num1) * 18; + + if (granule.mixedBlockFlag) + { + for (int j = 8; --j >= 0;) *scf++ = (int) getBitsUnchecked (num0); + numBits -= num0; + i = 9; + } + + for (; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); + for (i = 18; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1); + + *scf++ = 0; + *scf++ = 0; + *scf++ = 0; + } + else + { + const int scfsi = granule.scfsi; + + if (scfsi < 0) + { + for (int i = 11; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); + for (int j = 10; --j >= 0;) *scf++ = (int) getBitsUnchecked (num1); + numBits = (num0 + num1) * 10 + num0; + } + else + { + numBits = 0; + if ((scfsi & 8) == 0) + { + for (int i = 6; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); + numBits += num0 * 6; + } + else + scf += 6; + + if ((scfsi & 4) == 0) + { + for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); + numBits += num0 * 5; + } + else + scf += 5; + + if ((scfsi & 2) == 0) + { + for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1); + numBits += num1 * 5; + } + else + scf += 5; + + if ((scfsi & 1) == 0) + { + for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1); + numBits += num1 * 5; + } + else + scf += 5; + } + + *scf = 0; + } + + return numBits; + } + + int getLayer3ScaleFactors2 (int* scf, Layer3SideInfo::Info& granule, const bool iStereo) noexcept + { + static const uint8 scaleTable[3][6][4] = + { + { { 6, 5, 5, 5 }, { 6, 5, 7, 3 }, { 11, 10, 0, 0 }, { 7, 7, 7, 0 }, { 6, 6, 6, 3 }, { 8, 8, 5, 0 } }, + { { 9, 9, 9, 9 }, { 9, 9, 12, 6 }, { 18, 18, 0, 0 }, { 12, 12, 12, 0 }, { 12, 9, 9, 6 }, { 15, 12, 9, 0 } }, + { { 6, 9, 9, 9 }, { 6, 9, 12, 6 }, { 15, 18, 0, 0 }, { 6, 15, 12, 0 }, { 6, 12, 9, 6 }, { 6, 18, 9, 0 } } + }; + + uint32 len = iStereo ? constants.iLength2 [granule.scaleFactorCompression >> 1] + : constants.nLength2 [granule.scaleFactorCompression]; + + granule.preflag = (len >> 15) & 1; + + int n = 0; + if (granule.blockType == 2) + { + ++n; + if (granule.mixedBlockFlag) + ++n; + } + + const uint8* const data = scaleTable[n][(len >> 12) & 7]; + int i, numBits = 0; + + for (i = 0; i < 4; ++i) + { + int num = len & 7; + len >>= 3; + + if (num) + { + for (int j = 0; j < (int) (data[i]); ++j) + *scf++ = (int) getBitsUnchecked (num); + + numBits += data[i] * num; + } + else + { + for (int j = 0; j < (int) (data[i]); ++j) + *scf++ = 0; + } + } + + n = (n << 1) + 1; + for (i = 0; i < n; ++i) + *scf++ = 0; + + return numBits; + } + + bool layer3DequantizeSample (float xr[32][18], int* scf, Layer3SideInfo::Info& granule, int sampleRate, int part2bits) noexcept + { + const uint32 shift = 1 + granule.scaleFactorScale; + float* xrpnt = (float*) xr; + int part2remain = (int) granule.part2_3Length - part2bits; + + zeromem (xrpnt, sizeof (float) * (size_t) (&xr[32][0] - xrpnt)); + + const int bv = (int) granule.bigValues; + const int region1 = (int) granule.region1Start; + const int region2 = (int) granule.region2Start; + int l3 = ((576 >> 1) - bv) >> 1; + int l[3]; + + if (bv <= region1) + { + l[0] = bv; + l[1] = 0; + l[2] = 0; + } + else + { + l[0] = region1; + if (bv <= region2) + { + l[1] = bv - l[0]; + l[2] = 0; + } + else + { + l[1] = region2 - l[0]; + l[2] = bv - region2; + } + } + + for (int i = 0; i < 3; ++i) + if (l[i] < 0) + l[i] = 0; + + if (granule.blockType == 2) + { + int max[4]; + int step = 0, lwin = 0, cb = 0, mc = 0; + float v = 0; + int* map; + int* mapEnd; + + if (granule.mixedBlockFlag) + { + max[3] = -1; + max[0] = max[1] = max[2] = 2; + map = constants.map [sampleRate][0]; + mapEnd = constants.mapEnd [sampleRate][0]; + } + else + { + max[0] = max[1] = max[2] = max[3] = -1; + map = constants.map [sampleRate][1]; + mapEnd = constants.mapEnd [sampleRate][1]; + } + + for (int i = 0; i < 2; ++i) + { + const BitsToTableMap* h = huffmanTables1 + granule.tableSelect[i]; + + for (int lp = l[i]; lp != 0; --lp, --mc) + { + int x, y; + if (mc == 0) + { + mc = *map++; + xrpnt = ((float*) xr) + (*map++); + lwin = *map++; + cb = *map++; + + if (lwin == 3) + { + v = granule.pow2gain[ (*scf++) << shift]; + step = 1; + } + else + { + v = granule.fullGain[lwin][ (*scf++) << shift]; + step = 3; + } + } + + const int16* val = h->table; + + while ((y = *val++) < 0) + { + if (getOneBit()) + val -= y; + + --part2remain; + } + + x = y >> 4; + y &= 15; + + if (x == 15) + { + max[lwin] = cb; + part2remain -= h->bits + 1; + x += getBits ((int) h->bits); + *xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); + } + else if (x) + { + max[lwin] = cb; + *xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); + --part2remain; + } + else + *xrpnt = 0; + + xrpnt += step; + + if (y == 15) + { + max[lwin] = cb; + part2remain -= h->bits + 1; + y += getBits ((int) h->bits); + *xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); + } + else if (y) + { + max[lwin] = cb; + *xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); + --part2remain; + } + else + *xrpnt = 0; + + xrpnt += step; + } + } + + for (; l3 && (part2remain > 0); --l3) + { + const BitsToTableMap* h = huffmanTables2 + granule.count1TableSelect; + const int16* val = h->table; + int16 a; + + while ((a = *val++) < 0) + { + if (part2remain <= 0) + { + a = 0; + break; + } + + --part2remain; + if (getOneBit()) + val -= a; + } + + for (int i = 0; i < 4; ++i) + { + if ((i & 1) == 0) + { + if (mc == 0) + { + mc = *map++; + xrpnt = ((float*) xr) + (*map++); + lwin = *map++; + cb = *map++; + + if (lwin == 3) + { + v = granule.pow2gain[ (*scf++) << shift]; + step = 1; + } + else + { + v = granule.fullGain[lwin][ (*scf++) << shift]; + step = 3; + } + } + + --mc; + } + + if ((a & (8 >> i))) + { + max[lwin] = cb; + if (part2remain == 0) + break; + + --part2remain; + *xrpnt = getOneBit() ? -v : v; + } + else + *xrpnt = 0; + + xrpnt += step; + } + } + + while (map < mapEnd) + { + if (mc == 0) + { + mc = *map++; + xrpnt = ((float*) xr) + *map++; + step = (*map++ == 3) ? 1 : 3; + ++map; + } + + --mc; + *xrpnt = 0; xrpnt += step; + *xrpnt = 0; xrpnt += step; + } + + granule.maxBand[0] = (uint32) (max[0] + 1); + granule.maxBand[1] = (uint32) (max[1] + 1); + granule.maxBand[2] = (uint32) (max[2] + 1); + granule.maxBandl = (uint32) (max[3] + 1); + + const int rmax = jmax (max[0], max[1], max[3]) + 1; + granule.maxb = rmax ? (uint32) constants.shortLimit[sampleRate][rmax] + : (uint32) constants.longLimit[sampleRate][max[3] + 1]; + } + else + { + static const int pretab1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }; + static const int pretab2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + const int* pretab = (const int*) (granule.preflag ? pretab1 : pretab2); + int max = -1, cb = 0, mc = 0; + int* map = constants.map [sampleRate][2]; + float v = 0; + + for (int i = 0; i < 3; ++i) + { + const BitsToTableMap* h = huffmanTables1 + granule.tableSelect[i]; + + for (int lp = l[i]; lp != 0; --lp, --mc) + { + if (mc == 0) + { + mc = *map++; + v = granule.pow2gain [((*scf++) + (*pretab++)) << shift]; + cb = *map++; + } + + const int16* val = h->table; + int y; + + while ((y = *val++) < 0) + { + if (getOneBit()) val -= y; + --part2remain; + } + + int x = y >> 4; + y &= 15; + + if (x == 15) + { + max = cb; + part2remain -= h->bits + 1; + x += getBits ((int) h->bits); + *xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); + } + else if (x) + { + max = cb; + *xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); + --part2remain; + } + else + *xrpnt++ = 0; + + if (y == 15) + { + max = cb; + part2remain -= h->bits + 1; + y += getBits ((int) h->bits); + *xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); + } + else if (y) + { + max = cb; + *xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); + --part2remain; + } + else + *xrpnt++ = 0; + } + } + + for (; l3 && part2remain > 0; --l3) + { + const BitsToTableMap* h = huffmanTables2 + granule.count1TableSelect; + const int16* values = h->table; + int16 a; + + while ((a = *values++) < 0) + { + if (part2remain <= 0) + { + a = 0; + break; + } + + --part2remain; + if (getOneBit()) + values -= a; + } + + for (int i = 0; i < 4; ++i) + { + if ((i & 1) == 0) + { + if (mc == 0) + { + mc = *map++; + cb = *map++; + v = granule.pow2gain [((*scf++) + (*pretab++)) << shift]; + } + --mc; + } + + if ((a & (0x8 >> i))) + { + max = cb; + + if (part2remain <= 0) + break; + + --part2remain; + *xrpnt++ = getOneBit() ? -v : v; + } + else + *xrpnt++ = 0; + } + } + + zeromem (xrpnt, sizeof (float) * (size_t) (&xr[32][0] - xrpnt)); + + granule.maxBandl = (uint32) (max + 1); + granule.maxb = (uint32) constants.longLimit[sampleRate][granule.maxBandl]; + } + + while (part2remain > 16) + { + getBits (16); + part2remain -= 16; + } + + if (part2remain > 0) + getBits (part2remain); + else if (part2remain < 0) + return true; + + return false; + } + + void layer3Hybrid (float fsIn[32][18], float tsOut[18][32], int ch, const Layer3SideInfo::Info& granule) noexcept + { + float* ts = (float*) tsOut; + float* rawout1, *rawout2; + int sb = 0; + + { + int b = hybridBlockIndex[ch]; + rawout1 = hybridBlock[b][ch]; + b = 1 - b; + rawout2 = hybridBlock[b][ch]; + hybridBlockIndex[ch] = b; + } + + if (granule.mixedBlockFlag) + { + sb = 2; + DCT::dct36 (fsIn[0], rawout1, rawout2, constants.win[0], ts); + DCT::dct36 (fsIn[1], rawout1 + 18, rawout2 + 18, constants.win1[0], ts + 1); + rawout1 += 36; + rawout2 += 36; + ts += 2; + } + + const uint32 bt = granule.blockType; + if (bt == 2) + { + for (; sb < (int) granule.maxb; sb += 2, ts += 2, rawout1 += 36, rawout2 += 36) + { + DCT::dct12 (fsIn[sb], rawout1, rawout2, constants.win[2], ts); + DCT::dct12 (fsIn[sb + 1], rawout1 + 18, rawout2 + 18, constants.win1[2], ts + 1); + } + } + else + { + for (; sb < (int) granule.maxb; sb += 2, ts += 2, rawout1 += 36, rawout2 += 36) + { + DCT::dct36 (fsIn[sb], rawout1, rawout2, constants.win[bt], ts); + DCT::dct36 (fsIn[sb + 1], rawout1 + 18, rawout2 + 18, constants.win1[bt], ts + 1); + } + } + + for (; sb < 32; ++sb, ++ts) + { + for (int i = 0; i < 18; ++i) + { + ts[i * 32] = *rawout1++; + *rawout2++ = 0; + } + } + } + + void synthesiseStereo (const float* bandPtr0, const float* bandPtr1, float* out0, float* out1, int& samplesDone) noexcept + { + int dummy = samplesDone; + synthesise (bandPtr0, 0, out0, dummy); + synthesise (bandPtr1, 1, out1, samplesDone); + } + + void synthesise (const float* bandPtr, const int channel, float* out, int& samplesDone) + { + out += samplesDone; + const int bo = channel == 0 ? ((synthBo - 1) & 15) : synthBo; + float (*buf)[0x110] = synthBuffers[channel]; + float* b0; + int j, bo1 = bo; + + if (bo & 1) + { + b0 = buf[0]; + DCT::dct64 (buf[1] + ((bo + 1) & 15), buf[0] + bo, bandPtr); + } + else + { + ++bo1; + b0 = buf[1]; + DCT::dct64 (buf[0] + bo, buf[1] + bo1, bandPtr); + } + + synthBo = bo; + const float* window = constants.decodeWin + 16 - bo1; + + for (j = 16; j != 0; --j, b0 += 16, window += 32) + { + float sum = window[0] * b0[0]; sum -= window[1] * b0[1]; + sum += window[2] * b0[2]; sum -= window[3] * b0[3]; + sum += window[4] * b0[4]; sum -= window[5] * b0[5]; + sum += window[6] * b0[6]; sum -= window[7] * b0[7]; + sum += window[8] * b0[8]; sum -= window[9] * b0[9]; + sum += window[10] * b0[10]; sum -= window[11] * b0[11]; + sum += window[12] * b0[12]; sum -= window[13] * b0[13]; + sum += window[14] * b0[14]; sum -= window[15] * b0[15]; + *out++ = sum; + } + + { + float sum = window[0] * b0[0]; sum += window[2] * b0[2]; + sum += window[4] * b0[4]; sum += window[6] * b0[6]; + sum += window[8] * b0[8]; sum += window[10] * b0[10]; + sum += window[12] * b0[12]; sum += window[14] * b0[14]; + *out++ = sum; + b0 -= 16; window -= 32; + window += bo1 << 1; + } + + for (j = 15; j != 0; --j, b0 -= 16, window -= 32) + { + float sum = -window[-1] * b0[0]; sum -= window[-2] * b0[1]; + sum -= window[-3] * b0[2]; sum -= window[-4] * b0[3]; + sum -= window[-5] * b0[4]; sum -= window[-6] * b0[5]; + sum -= window[-7] * b0[6]; sum -= window[-8] * b0[7]; + sum -= window[-9] * b0[8]; sum -= window[-10] * b0[9]; + sum -= window[-11] * b0[10]; sum -= window[-12] * b0[11]; + sum -= window[-13] * b0[12]; sum -= window[-14] * b0[13]; + sum -= window[-15] * b0[14]; sum -= window[0] * b0[15]; + *out++ = sum; + } + + samplesDone += 32; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Stream) +}; + +//============================================================================== +static const char* const mp3FormatName = "MP3 file"; + +//============================================================================== +class MP3Reader : public AudioFormatReader +{ +public: + MP3Reader (InputStream* const in) + : AudioFormatReader (in, mp3FormatName), + stream (*in), currentPosition (0), + decodedStart (0), decodedEnd (0) + { + skipID3(); + const int64 streamPos = stream.stream.getPosition(); + + if (readNextBlock()) + { + bitsPerSample = 32; + usesFloatingPointData = true; + sampleRate = stream.frame.getFrequency(); + numChannels = (unsigned int) stream.frame.numChannels; + lengthInSamples = findLength (streamPos); + } + } + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + jassert (destSamples != nullptr); + + if (currentPosition != startSampleInFile) + { + if (! stream.seek ((int) (startSampleInFile / 1152 - 1))) + { + currentPosition = -1; + createEmptyDecodedData(); + } + else + { + decodedStart = decodedEnd = 0; + const int64 streamPos = stream.currentFrameIndex * 1152; + int toSkip = (int) (startSampleInFile - streamPos); + jassert (toSkip >= 0); + + while (toSkip > 0) + { + if (! readNextBlock()) + { + createEmptyDecodedData(); + break; + } + + const int numReady = decodedEnd - decodedStart; + + if (numReady > toSkip) + { + decodedStart += toSkip; + break; + } + + toSkip -= numReady; + } + + currentPosition = startSampleInFile; + } + } + + while (numSamples > 0) + { + if (decodedEnd <= decodedStart && ! readNextBlock()) + { + for (int i = numDestChannels; --i >= 0;) + if (destSamples[i] != nullptr) + zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (float) * (size_t) numSamples); + + return false; + } + + const int numToCopy = jmin (decodedEnd - decodedStart, numSamples); + float* const* const dst = reinterpret_cast (destSamples); + memcpy (dst[0] + startOffsetInDestBuffer, decoded0 + decodedStart, sizeof (float) * (size_t) numToCopy); + + if (numDestChannels > 1 && dst[1] != nullptr) + memcpy (dst[1] + startOffsetInDestBuffer, (numChannels < 2 ? decoded0 : decoded1) + decodedStart, sizeof (float) * (size_t) numToCopy); + + startOffsetInDestBuffer += numToCopy; + decodedStart += numToCopy; + currentPosition += numToCopy; + numSamples -= numToCopy; + } + + return true; + } + +private: + MP3Stream stream; + int64 currentPosition; + enum { decodedDataSize = 1152 }; + float decoded0 [decodedDataSize], decoded1 [decodedDataSize]; + int decodedStart, decodedEnd; + + void createEmptyDecodedData() noexcept + { + zeromem (decoded0, sizeof (decoded0)); + zeromem (decoded1, sizeof (decoded1)); + decodedStart = 0; + decodedEnd = decodedDataSize; + } + + bool readNextBlock() + { + for (int attempts = 10; --attempts >= 0;) + { + int samplesDone = 0; + const int result = stream.decodeNextBlock (decoded0, decoded1, samplesDone); + + if (result > 0 && stream.stream.isExhausted()) + { + createEmptyDecodedData(); + return true; + } + + if (result <= 0) + { + decodedStart = 0; + decodedEnd = samplesDone; + return result == 0; + } + } + + return false; + } + + void skipID3() + { + const int64 originalPosition = stream.stream.getPosition(); + const uint32 firstWord = (uint32) stream.stream.readInt(); + + if ((firstWord & 0xffffff) == 0x334449) + { + uint8 buffer[6]; + + if (stream.stream.read (buffer, 6) == 6 + && buffer[0] != 0xff + && ((buffer[2] | buffer[3] | buffer[4] | buffer[5]) & 0x80) == 0) + { + const uint32 length = (((uint32) buffer[2]) << 21) + | (((uint32) buffer[3]) << 14) + | (((uint32) buffer[4]) << 7) + | ((uint32) buffer[5]); + + stream.stream.skipNextBytes (length); + return; + } + } + + stream.stream.setPosition (originalPosition); + } + + int64 findLength (int64 streamStartPos) + { + int64 numFrames = stream.numFrames; + + if (numFrames <= 0) + { + const int64 streamSize = stream.stream.getTotalLength(); + + if (streamSize > 0) + { + const int bytesPerFrame = stream.frame.frameSize + 4; + + if (bytesPerFrame == 417 || bytesPerFrame == 418) + numFrames = roundToInt ((streamSize - streamStartPos) / 417.95918); // more accurate for 128k + else + numFrames = (streamSize - streamStartPos) / bytesPerFrame; + } + } + + return numFrames * 1152; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Reader) +}; + +} + +//============================================================================== +MP3AudioFormat::MP3AudioFormat() : AudioFormat (MP3Decoder::mp3FormatName, ".mp3") {} +MP3AudioFormat::~MP3AudioFormat() {} + +Array MP3AudioFormat::getPossibleSampleRates() { return Array(); } +Array MP3AudioFormat::getPossibleBitDepths() { return Array(); } +bool MP3AudioFormat::canDoStereo() { return true; } +bool MP3AudioFormat::canDoMono() { return true; } +bool MP3AudioFormat::isCompressed() { return true; } +StringArray MP3AudioFormat::getQualityOptions() { return StringArray(); } + +AudioFormatReader* MP3AudioFormat::createReaderFor (InputStream* sourceStream, const bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new MP3Decoder::MP3Reader (sourceStream)); + + if (r->lengthInSamples > 0) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +AudioFormatWriter* MP3AudioFormat::createWriterFor (OutputStream*, double /*sampleRateToUse*/, + unsigned int /*numberOfChannels*/, int /*bitsPerSample*/, + const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/) +{ + return nullptr; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h new file mode 100644 index 0000000000..e89c05db3a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h @@ -0,0 +1,64 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_MP3AUDIOFORMAT || DOXYGEN + +//============================================================================== +/** + Software-based MP3 decoding format (doesn't currently provide an encoder). + + IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and + to compile the MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, + you are agreeing that Raw Material Software is in no way responsible for any patent, + copyright, or other legal issues that you may suffer as a result. + + The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party + intellectual property. If you wish to use it, please seek your own independent advice about the + legality of doing so. If you are not willing to accept full responsibility for the consequences + of using this code, then do not enable the JUCE_USE_MP3AUDIOFORMAT setting. +*/ +class MP3AudioFormat : public AudioFormat +{ +public: + //============================================================================== + MP3AudioFormat(); + ~MP3AudioFormat(); + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + bool isCompressed() override; + StringArray getQualityOptions() override; + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; + + AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, + unsigned int numberOfChannels, int bitsPerSample, + const StringPairArray& metadataValues, int qualityOptionIndex) override; +}; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp new file mode 100644 index 0000000000..7cc12a4891 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp @@ -0,0 +1,532 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_OGGVORBIS + +#if JUCE_MAC && ! defined (__MACOSX__) + #define __MACOSX__ 1 +#endif + +namespace OggVorbisNamespace +{ +#if JUCE_INCLUDE_OGGVORBIS_CODE || ! defined (JUCE_INCLUDE_OGGVORBIS_CODE) + #if JUCE_MSVC + #pragma warning (push) + #pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4305 4189 4706 4995 4365) + #endif + + #if JUCE_CLANG + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wconversion" + #pragma clang diagnostic ignored "-Wshadow" + #pragma clang diagnostic ignored "-Wdeprecated-register" + #endif + + #include "oggvorbis/vorbisenc.h" + #include "oggvorbis/codec.h" + #include "oggvorbis/vorbisfile.h" + + #include "oggvorbis/bitwise.c" + #include "oggvorbis/framing.c" + #include "oggvorbis/libvorbis-1.3.2/lib/analysis.c" + #include "oggvorbis/libvorbis-1.3.2/lib/bitrate.c" + #include "oggvorbis/libvorbis-1.3.2/lib/block.c" + #include "oggvorbis/libvorbis-1.3.2/lib/codebook.c" + #include "oggvorbis/libvorbis-1.3.2/lib/envelope.c" + #include "oggvorbis/libvorbis-1.3.2/lib/floor0.c" + #include "oggvorbis/libvorbis-1.3.2/lib/floor1.c" + #include "oggvorbis/libvorbis-1.3.2/lib/info.c" + #include "oggvorbis/libvorbis-1.3.2/lib/lpc.c" + #include "oggvorbis/libvorbis-1.3.2/lib/lsp.c" + #include "oggvorbis/libvorbis-1.3.2/lib/mapping0.c" + #include "oggvorbis/libvorbis-1.3.2/lib/mdct.c" + #include "oggvorbis/libvorbis-1.3.2/lib/psy.c" + #include "oggvorbis/libvorbis-1.3.2/lib/registry.c" + #include "oggvorbis/libvorbis-1.3.2/lib/res0.c" + #include "oggvorbis/libvorbis-1.3.2/lib/sharedbook.c" + #include "oggvorbis/libvorbis-1.3.2/lib/smallft.c" + #include "oggvorbis/libvorbis-1.3.2/lib/synthesis.c" + #include "oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c" + #include "oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c" + #include "oggvorbis/libvorbis-1.3.2/lib/window.c" + + #if JUCE_MSVC + #pragma warning (pop) + #endif + + #if JUCE_CLANG + #pragma clang diagnostic pop + #endif +#else + #include + #include + #include +#endif +} + +#undef max +#undef min + +//============================================================================== +static const char* const oggFormatName = "Ogg-Vorbis file"; + +const char* const OggVorbisAudioFormat::encoderName = "encoder"; +const char* const OggVorbisAudioFormat::id3title = "id3title"; +const char* const OggVorbisAudioFormat::id3artist = "id3artist"; +const char* const OggVorbisAudioFormat::id3album = "id3album"; +const char* const OggVorbisAudioFormat::id3comment = "id3comment"; +const char* const OggVorbisAudioFormat::id3date = "id3date"; +const char* const OggVorbisAudioFormat::id3genre = "id3genre"; +const char* const OggVorbisAudioFormat::id3trackNumber = "id3trackNumber"; + + +//============================================================================== +class OggReader : public AudioFormatReader +{ +public: + OggReader (InputStream* const inp) + : AudioFormatReader (inp, oggFormatName), + reservoirStart (0), + samplesInReservoir (0) + { + using namespace OggVorbisNamespace; + sampleRate = 0; + usesFloatingPointData = true; + + callbacks.read_func = &oggReadCallback; + callbacks.seek_func = &oggSeekCallback; + callbacks.close_func = &oggCloseCallback; + callbacks.tell_func = &oggTellCallback; + + const int err = ov_open_callbacks (input, &ovFile, 0, 0, callbacks); + + if (err == 0) + { + vorbis_info* info = ov_info (&ovFile, -1); + + vorbis_comment* const comment = ov_comment (&ovFile, -1); + addMetadataItem (comment, "ENCODER", OggVorbisAudioFormat::encoderName); + addMetadataItem (comment, "TITLE", OggVorbisAudioFormat::id3title); + addMetadataItem (comment, "ARTIST", OggVorbisAudioFormat::id3artist); + addMetadataItem (comment, "ALBUM", OggVorbisAudioFormat::id3album); + addMetadataItem (comment, "COMMENT", OggVorbisAudioFormat::id3comment); + addMetadataItem (comment, "DATE", OggVorbisAudioFormat::id3date); + addMetadataItem (comment, "GENRE", OggVorbisAudioFormat::id3genre); + addMetadataItem (comment, "TRACKNUMBER", OggVorbisAudioFormat::id3trackNumber); + + lengthInSamples = (uint32) ov_pcm_total (&ovFile, -1); + numChannels = (unsigned int) info->channels; + bitsPerSample = 16; + sampleRate = info->rate; + + reservoir.setSize ((int) numChannels, (int) jmin (lengthInSamples, (int64) 4096)); + } + } + + ~OggReader() + { + OggVorbisNamespace::ov_clear (&ovFile); + } + + void addMetadataItem (OggVorbisNamespace::vorbis_comment* comment, const char* name, const char* metadataName) + { + if (const char* value = vorbis_comment_query (comment, name, 0)) + metadataValues.set (metadataName, value); + } + + //============================================================================== + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + while (numSamples > 0) + { + const int numAvailable = (int) (reservoirStart + samplesInReservoir - startSampleInFile); + + if (startSampleInFile >= reservoirStart && numAvailable > 0) + { + // got a few samples overlapping, so use them before seeking.. + + const int numToUse = jmin (numSamples, numAvailable); + + for (int i = jmin (numDestChannels, reservoir.getNumChannels()); --i >= 0;) + if (destSamples[i] != nullptr) + memcpy (destSamples[i] + startOffsetInDestBuffer, + reservoir.getReadPointer (i, (int) (startSampleInFile - reservoirStart)), + sizeof (float) * (size_t) numToUse); + + startSampleInFile += numToUse; + numSamples -= numToUse; + startOffsetInDestBuffer += numToUse; + + if (numSamples == 0) + break; + } + + if (startSampleInFile < reservoirStart + || startSampleInFile + numSamples > reservoirStart + samplesInReservoir) + { + // buffer miss, so refill the reservoir + int bitStream = 0; + + reservoirStart = jmax (0, (int) startSampleInFile); + samplesInReservoir = reservoir.getNumSamples(); + + if (reservoirStart != (int) OggVorbisNamespace::ov_pcm_tell (&ovFile)) + OggVorbisNamespace::ov_pcm_seek (&ovFile, reservoirStart); + + int offset = 0; + int numToRead = samplesInReservoir; + + while (numToRead > 0) + { + float** dataIn = nullptr; + + const long samps = OggVorbisNamespace::ov_read_float (&ovFile, &dataIn, numToRead, &bitStream); + if (samps <= 0) + break; + + jassert (samps <= numToRead); + + for (int i = jmin ((int) numChannels, reservoir.getNumChannels()); --i >= 0;) + memcpy (reservoir.getWritePointer (i, offset), dataIn[i], sizeof (float) * (size_t) samps); + + numToRead -= samps; + offset += samps; + } + + if (numToRead > 0) + reservoir.clear (offset, numToRead); + } + } + + if (numSamples > 0) + { + for (int i = numDestChannels; --i >= 0;) + if (destSamples[i] != nullptr) + zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); + } + + return true; + } + + //============================================================================== + static size_t oggReadCallback (void* ptr, size_t size, size_t nmemb, void* datasource) + { + return (size_t) (static_cast (datasource)->read (ptr, (int) (size * nmemb))) / size; + } + + static int oggSeekCallback (void* datasource, OggVorbisNamespace::ogg_int64_t offset, int whence) + { + InputStream* const in = static_cast (datasource); + + if (whence == SEEK_CUR) + offset += in->getPosition(); + else if (whence == SEEK_END) + offset += in->getTotalLength(); + + in->setPosition (offset); + return 0; + } + + static int oggCloseCallback (void*) + { + return 0; + } + + static long oggTellCallback (void* datasource) + { + return (long) static_cast (datasource)->getPosition(); + } + +private: + OggVorbisNamespace::OggVorbis_File ovFile; + OggVorbisNamespace::ov_callbacks callbacks; + AudioSampleBuffer reservoir; + int reservoirStart, samplesInReservoir; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggReader) +}; + +//============================================================================== +class OggWriter : public AudioFormatWriter +{ +public: + OggWriter (OutputStream* const out, + const double sampleRate_, + const unsigned int numChannels_, + const unsigned int bitsPerSample_, + const int qualityIndex, + const StringPairArray& metadata) + : AudioFormatWriter (out, oggFormatName, sampleRate_, numChannels_, bitsPerSample_), + ok (false) + { + using namespace OggVorbisNamespace; + + vorbis_info_init (&vi); + + if (vorbis_encode_init_vbr (&vi, (int) numChannels_, (int) sampleRate_, + jlimit (0.0f, 1.0f, qualityIndex * 0.1f)) == 0) + { + vorbis_comment_init (&vc); + + addMetadata (metadata, OggVorbisAudioFormat::encoderName, "ENCODER"); + addMetadata (metadata, OggVorbisAudioFormat::id3title, "TITLE"); + addMetadata (metadata, OggVorbisAudioFormat::id3artist, "ARTIST"); + addMetadata (metadata, OggVorbisAudioFormat::id3album, "ALBUM"); + addMetadata (metadata, OggVorbisAudioFormat::id3comment, "COMMENT"); + addMetadata (metadata, OggVorbisAudioFormat::id3date, "DATE"); + addMetadata (metadata, OggVorbisAudioFormat::id3genre, "GENRE"); + addMetadata (metadata, OggVorbisAudioFormat::id3trackNumber, "TRACKNUMBER"); + + vorbis_analysis_init (&vd, &vi); + vorbis_block_init (&vd, &vb); + + ogg_stream_init (&os, Random::getSystemRandom().nextInt()); + + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + vorbis_analysis_headerout (&vd, &vc, &header, &header_comm, &header_code); + + ogg_stream_packetin (&os, &header); + ogg_stream_packetin (&os, &header_comm); + ogg_stream_packetin (&os, &header_code); + + for (;;) + { + if (ogg_stream_flush (&os, &og) == 0) + break; + + output->write (og.header, (size_t) og.header_len); + output->write (og.body, (size_t) og.body_len); + } + + ok = true; + } + } + + ~OggWriter() + { + using namespace OggVorbisNamespace; + if (ok) + { + // write a zero-length packet to show ogg that we're finished.. + writeSamples (0); + + ogg_stream_clear (&os); + vorbis_block_clear (&vb); + vorbis_dsp_clear (&vd); + vorbis_comment_clear (&vc); + + vorbis_info_clear (&vi); + output->flush(); + } + else + { + vorbis_info_clear (&vi); + output = nullptr; // to stop the base class deleting this, as it needs to be returned + // to the caller of createWriter() + } + } + + //============================================================================== + bool write (const int** samplesToWrite, int numSamples) override + { + if (ok) + { + using namespace OggVorbisNamespace; + + if (numSamples > 0) + { + const double gain = 1.0 / 0x80000000u; + float** const vorbisBuffer = vorbis_analysis_buffer (&vd, numSamples); + + for (int i = (int) numChannels; --i >= 0;) + { + float* const dst = vorbisBuffer[i]; + const int* const src = samplesToWrite [i]; + + if (src != nullptr && dst != nullptr) + { + for (int j = 0; j < numSamples; ++j) + dst[j] = (float) (src[j] * gain); + } + } + } + + writeSamples (numSamples); + } + + return ok; + } + + void writeSamples (int numSamples) + { + using namespace OggVorbisNamespace; + + vorbis_analysis_wrote (&vd, numSamples); + + while (vorbis_analysis_blockout (&vd, &vb) == 1) + { + vorbis_analysis (&vb, 0); + vorbis_bitrate_addblock (&vb); + + while (vorbis_bitrate_flushpacket (&vd, &op)) + { + ogg_stream_packetin (&os, &op); + + for (;;) + { + if (ogg_stream_pageout (&os, &og) == 0) + break; + + output->write (og.header, (size_t) og.header_len); + output->write (og.body, (size_t) og.body_len); + + if (ogg_page_eos (&og)) + break; + } + } + } + } + + bool ok; + +private: + OggVorbisNamespace::ogg_stream_state os; + OggVorbisNamespace::ogg_page og; + OggVorbisNamespace::ogg_packet op; + OggVorbisNamespace::vorbis_info vi; + OggVorbisNamespace::vorbis_comment vc; + OggVorbisNamespace::vorbis_dsp_state vd; + OggVorbisNamespace::vorbis_block vb; + + void addMetadata (const StringPairArray& metadata, const char* name, const char* vorbisName) + { + const String s (metadata [name]); + + if (s.isNotEmpty()) + vorbis_comment_add_tag (&vc, vorbisName, const_cast (s.toRawUTF8())); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggWriter) +}; + + +//============================================================================== +OggVorbisAudioFormat::OggVorbisAudioFormat() : AudioFormat (oggFormatName, ".ogg") +{ +} + +OggVorbisAudioFormat::~OggVorbisAudioFormat() +{ +} + +Array OggVorbisAudioFormat::getPossibleSampleRates() +{ + const int rates[] = { 8000, 11025, 12000, 16000, 22050, 32000, + 44100, 48000, 88200, 96000, 176400, 192000 }; + + return Array (rates, numElementsInArray (rates)); +} + +Array OggVorbisAudioFormat::getPossibleBitDepths() +{ + const int depths[] = { 32 }; + + return Array (depths, numElementsInArray (depths)); +} + +bool OggVorbisAudioFormat::canDoStereo() { return true; } +bool OggVorbisAudioFormat::canDoMono() { return true; } +bool OggVorbisAudioFormat::isCompressed() { return true; } + +AudioFormatReader* OggVorbisAudioFormat::createReaderFor (InputStream* in, const bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new OggReader (in)); + + if (r->sampleRate > 0) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +AudioFormatWriter* OggVorbisAudioFormat::createWriterFor (OutputStream* out, + double sampleRate, + unsigned int numChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) +{ + ScopedPointer w (new OggWriter (out, sampleRate, numChannels, + (unsigned int) bitsPerSample, qualityOptionIndex, metadataValues)); + + return w->ok ? w.release() : nullptr; +} + +StringArray OggVorbisAudioFormat::getQualityOptions() +{ + static const char* options[] = { "64 kbps", "80 kbps", "96 kbps", "112 kbps", "128 kbps", "160 kbps", + "192 kbps", "224 kbps", "256 kbps", "320 kbps", "500 kbps", 0 }; + return StringArray (options); +} + +int OggVorbisAudioFormat::estimateOggFileQuality (const File& source) +{ + if (FileInputStream* const in = source.createInputStream()) + { + ScopedPointer r (createReaderFor (in, true)); + + if (r != nullptr) + { + const double lengthSecs = r->lengthInSamples / r->sampleRate; + const int approxBitsPerSecond = (int) (source.getSize() * 8 / lengthSecs); + + const StringArray qualities (getQualityOptions()); + int bestIndex = 0; + int bestDiff = 10000; + + for (int i = qualities.size(); --i >= 0;) + { + const int diff = std::abs (qualities[i].getIntValue() - approxBitsPerSecond); + + if (diff < bestDiff) + { + bestDiff = diff; + bestIndex = i; + } + } + + return bestIndex; + } + } + + return 0; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h new file mode 100644 index 0000000000..03bc3fb6d6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h @@ -0,0 +1,93 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_USE_OGGVORBIS || defined (DOXYGEN) + +//============================================================================== +/** + Reads and writes the Ogg-Vorbis audio format. + + To compile this, you'll need to set the JUCE_USE_OGGVORBIS flag. + + @see AudioFormat, +*/ +class JUCE_API OggVorbisAudioFormat : public AudioFormat +{ +public: + //============================================================================== + OggVorbisAudioFormat(); + ~OggVorbisAudioFormat(); + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + bool isCompressed() override; + StringArray getQualityOptions() override; + + //============================================================================== + /** Tries to estimate the quality level of an ogg file based on its size. + + If it can't read the file for some reason, this will just return 1 (medium quality), + otherwise it will return the approximate quality setting that would have been used + to create the file. + + @see getQualityOptions + */ + int estimateOggFileQuality (const File& source); + + //============================================================================== + /** Metadata property name used by the Ogg writer - if you set a string for this + value, it will be written into the ogg file as the name of the encoder app. + + @see createWriterFor + */ + static const char* const encoderName; + + static const char* const id3title; /**< Metadata key for setting an ID3 title. */ + static const char* const id3artist; /**< Metadata key for setting an ID3 artist name. */ + static const char* const id3album; /**< Metadata key for setting an ID3 album. */ + static const char* const id3comment; /**< Metadata key for setting an ID3 comment. */ + static const char* const id3date; /**< Metadata key for setting an ID3 date. */ + static const char* const id3genre; /**< Metadata key for setting an ID3 genre. */ + static const char* const id3trackNumber; /**< Metadata key for setting an ID3 track number. */ + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) override; + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) override; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggVorbisAudioFormat) +}; + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp new file mode 100644 index 0000000000..17a06da616 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp @@ -0,0 +1,391 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_QUICKTIME && ! (JUCE_64BIT || JUCE_IOS) + +} // (juce namespace) + +#if ! JUCE_WINDOWS + #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) + #define Component CarbonDummyCompName + #include + #include + #include + #include + #include + #undef Point + #undef Component +#else + #if JUCE_MSVC + #pragma warning (push) + #pragma warning (disable : 4100) + #endif + + /* If you've got an include error here, you probably need to install the QuickTime SDK and + add its header directory to your include path. + + Alternatively, if you don't need any QuickTime services, just set the JUCE_QUICKTIME flag to 0. + */ + #undef SIZE_MAX + #include + #include + #include + #include + #include + #undef SIZE_MAX + + #if JUCE_MSVC + #pragma warning (pop) + #endif +#endif + +namespace juce +{ + +bool juce_OpenQuickTimeMovieFromStream (InputStream* input, Movie& movie, Handle& dataHandle); + +static const char* const quickTimeFormatName = "QuickTime file"; + +//============================================================================== +class QTAudioReader : public AudioFormatReader +{ +public: + QTAudioReader (InputStream* const input_, const int trackNum_) + : AudioFormatReader (input_, quickTimeFormatName), + ok (false), + movie (0), + trackNum (trackNum_), + lastSampleRead (0), + lastThreadId (0), + extractor (0), + dataHandle (0) + { + JUCE_AUTORELEASEPOOL + { + bufferList.calloc (256, 1); + + #if JUCE_WINDOWS + if (InitializeQTML (0) != noErr) + return; + #endif + + if (EnterMovies() != noErr) + return; + + bool opened = juce_OpenQuickTimeMovieFromStream (input_, movie, dataHandle); + + if (! opened) + return; + + { + const int numTracks = GetMovieTrackCount (movie); + int trackCount = 0; + + for (int i = 1; i <= numTracks; ++i) + { + track = GetMovieIndTrack (movie, i); + media = GetTrackMedia (track); + + OSType mediaType; + GetMediaHandlerDescription (media, &mediaType, 0, 0); + + if (mediaType == SoundMediaType + && trackCount++ == trackNum_) + { + ok = true; + break; + } + } + } + + if (! ok) + return; + + ok = false; + + lengthInSamples = GetMediaDecodeDuration (media); + usesFloatingPointData = false; + + samplesPerFrame = (int) (GetMediaDecodeDuration (media) / GetMediaSampleCount (media)); + + trackUnitsPerFrame = GetMovieTimeScale (movie) * samplesPerFrame + / GetMediaTimeScale (media); + + MovieAudioExtractionBegin (movie, 0, &extractor); + + unsigned long output_layout_size; + OSStatus err = MovieAudioExtractionGetPropertyInfo (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, + 0, &output_layout_size, 0); + if (err != noErr) + return; + + HeapBlock qt_audio_channel_layout; + qt_audio_channel_layout.calloc (output_layout_size, 1); + + MovieAudioExtractionGetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, + output_layout_size, qt_audio_channel_layout, 0); + + qt_audio_channel_layout[0].mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; + + MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, + output_layout_size, + qt_audio_channel_layout); + + err = MovieAudioExtractionGetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, + sizeof (inputStreamDesc), + &inputStreamDesc, 0); + if (err != noErr) + return; + + inputStreamDesc.mFormatFlags = kAudioFormatFlagIsSignedInteger + | kAudioFormatFlagIsPacked + | kAudioFormatFlagsNativeEndian; + inputStreamDesc.mBitsPerChannel = sizeof (SInt16) * 8; + inputStreamDesc.mChannelsPerFrame = jmin ((UInt32) 2, inputStreamDesc.mChannelsPerFrame); + inputStreamDesc.mBytesPerFrame = sizeof (SInt16) * inputStreamDesc.mChannelsPerFrame; + inputStreamDesc.mBytesPerPacket = inputStreamDesc.mBytesPerFrame; + + err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, + sizeof (inputStreamDesc), + &inputStreamDesc); + if (err != noErr) + return; + + Boolean allChannelsDiscrete = false; + err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Movie, + kQTMovieAudioExtractionMoviePropertyID_AllChannelsDiscrete, + sizeof (allChannelsDiscrete), + &allChannelsDiscrete); + + if (err != noErr) + return; + + bufferList->mNumberBuffers = 1; + bufferList->mBuffers[0].mNumberChannels = inputStreamDesc.mChannelsPerFrame; + bufferList->mBuffers[0].mDataByteSize = jmax ((UInt32) 4096, (UInt32) (samplesPerFrame * inputStreamDesc.mBytesPerFrame) + 16); + + dataBuffer.malloc (bufferList->mBuffers[0].mDataByteSize); + bufferList->mBuffers[0].mData = dataBuffer; + + sampleRate = inputStreamDesc.mSampleRate; + bitsPerSample = 16; + numChannels = inputStreamDesc.mChannelsPerFrame; + + detachThread(); + ok = true; + } + } + + ~QTAudioReader() + { + JUCE_AUTORELEASEPOOL + { + checkThreadIsAttached(); + + if (dataHandle != nullptr) + DisposeHandle (dataHandle); + + if (extractor != nullptr) + { + MovieAudioExtractionEnd (extractor); + extractor = nullptr; + } + + DisposeMovie (movie); + + #if JUCE_MAC + ExitMoviesOnThread (); + #endif + } + } + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) + { + JUCE_AUTORELEASEPOOL + { + checkThreadIsAttached(); + bool readOk = true; + + while (numSamples > 0) + { + if (lastSampleRead != startSampleInFile) + { + TimeRecord time; + time.scale = (TimeScale) inputStreamDesc.mSampleRate; + time.base = 0; + time.value.hi = 0; + time.value.lo = (UInt32) startSampleInFile; + + OSStatus err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Movie, + kQTMovieAudioExtractionMoviePropertyID_CurrentTime, + sizeof (time), &time); + + if (err != noErr) + { + readOk = false; + break; + } + } + + int framesToDo = jmin (numSamples, (int) (bufferList->mBuffers[0].mDataByteSize / inputStreamDesc.mBytesPerFrame)); + bufferList->mBuffers[0].mDataByteSize = inputStreamDesc.mBytesPerFrame * framesToDo; + + UInt32 outFlags = 0; + UInt32 actualNumFrames = framesToDo; + OSStatus err = MovieAudioExtractionFillBuffer (extractor, &actualNumFrames, bufferList, &outFlags); + if (err != noErr) + { + readOk = false; + break; + } + + lastSampleRead = startSampleInFile + actualNumFrames; + const int samplesReceived = actualNumFrames; + + for (int j = numDestChannels; --j >= 0;) + { + if (destSamples[j] != nullptr) + { + const short* src = ((const short*) bufferList->mBuffers[0].mData) + j; + + for (int i = 0; i < samplesReceived; ++i) + { + destSamples[j][startOffsetInDestBuffer + i] = (*src << 16); + src += numChannels; + } + } + } + + startOffsetInDestBuffer += samplesReceived; + startSampleInFile += samplesReceived; + numSamples -= samplesReceived; + + if (((outFlags & kQTMovieAudioExtractionComplete) != 0 || samplesReceived == 0) && numSamples > 0) + { + for (int j = numDestChannels; --j >= 0;) + if (destSamples[j] != nullptr) + zeromem (destSamples[j] + startOffsetInDestBuffer, sizeof (int) * numSamples); + + break; + } + } + + detachThread(); + return readOk; + } + } + + bool ok; + +private: + Movie movie; + Media media; + Track track; + const int trackNum; + double trackUnitsPerFrame; + int samplesPerFrame; + int64 lastSampleRead; + Thread::ThreadID lastThreadId; + MovieAudioExtractionRef extractor; + AudioStreamBasicDescription inputStreamDesc; + HeapBlock bufferList; + HeapBlock dataBuffer; + Handle dataHandle; + + //============================================================================== + void checkThreadIsAttached() + { + #if JUCE_MAC + if (Thread::getCurrentThreadId() != lastThreadId) + EnterMoviesOnThread (0); + AttachMovieToCurrentThread (movie); + #endif + } + + void detachThread() + { + #if JUCE_MAC + DetachMovieFromCurrentThread (movie); + #endif + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QTAudioReader) +}; + + +//============================================================================== +QuickTimeAudioFormat::QuickTimeAudioFormat() : AudioFormat (quickTimeFormatName, ".mov .mp3 .mp4 .m4a") +{ +} + +QuickTimeAudioFormat::~QuickTimeAudioFormat() +{ +} + +Array QuickTimeAudioFormat::getPossibleSampleRates() { return Array(); } +Array QuickTimeAudioFormat::getPossibleBitDepths() { return Array(); } + +bool QuickTimeAudioFormat::canDoStereo() { return true; } +bool QuickTimeAudioFormat::canDoMono() { return true; } + +//============================================================================== +AudioFormatReader* QuickTimeAudioFormat::createReaderFor (InputStream* sourceStream, + const bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new QTAudioReader (sourceStream, 0)); + + if (r->ok) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = 0; + + return nullptr; +} + +AudioFormatWriter* QuickTimeAudioFormat::createWriterFor (OutputStream* /*streamToWriteTo*/, + double /*sampleRateToUse*/, + unsigned int /*numberOfChannels*/, + int /*bitsPerSample*/, + const StringPairArray& /*metadataValues*/, + int /*qualityOptionIndex*/) +{ + jassertfalse; // not yet implemented! + return nullptr; +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h new file mode 100644 index 0000000000..6ef6a4edb6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h @@ -0,0 +1,69 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_QUICKTIME + +//============================================================================== +/** + Uses QuickTime to read the audio track a movie or media file. + + As well as QuickTime movies, this should also manage to open other audio + files that quicktime can understand, like mp3, m4a, etc. + + @see AudioFormat +*/ +class JUCE_API QuickTimeAudioFormat : public AudioFormat +{ +public: + //============================================================================== + /** Creates a format object. */ + QuickTimeAudioFormat(); + + /** Destructor. */ + ~QuickTimeAudioFormat(); + + //============================================================================== + Array getPossibleSampleRates(); + Array getPossibleBitDepths(); + bool canDoStereo(); + bool canDoMono(); + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails); + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex); + + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QuickTimeAudioFormat) +}; + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp new file mode 100644 index 0000000000..473e7445bc --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -0,0 +1,1471 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +static const char* const wavFormatName = "WAV file"; + +//============================================================================== +const char* const WavAudioFormat::bwavDescription = "bwav description"; +const char* const WavAudioFormat::bwavOriginator = "bwav originator"; +const char* const WavAudioFormat::bwavOriginatorRef = "bwav originator ref"; +const char* const WavAudioFormat::bwavOriginationDate = "bwav origination date"; +const char* const WavAudioFormat::bwavOriginationTime = "bwav origination time"; +const char* const WavAudioFormat::bwavTimeReference = "bwav time reference"; +const char* const WavAudioFormat::bwavCodingHistory = "bwav coding history"; + +StringPairArray WavAudioFormat::createBWAVMetadata (const String& description, + const String& originator, + const String& originatorRef, + const Time date, + const int64 timeReferenceSamples, + const String& codingHistory) +{ + StringPairArray m; + + m.set (bwavDescription, description); + m.set (bwavOriginator, originator); + m.set (bwavOriginatorRef, originatorRef); + m.set (bwavOriginationDate, date.formatted ("%Y-%m-%d")); + m.set (bwavOriginationTime, date.formatted ("%H:%M:%S")); + m.set (bwavTimeReference, String (timeReferenceSamples)); + m.set (bwavCodingHistory, codingHistory); + + return m; +} + +const char* const WavAudioFormat::acidOneShot = "acid one shot"; +const char* const WavAudioFormat::acidRootSet = "acid root set"; +const char* const WavAudioFormat::acidStretch = "acid stretch"; +const char* const WavAudioFormat::acidDiskBased = "acid disk based"; +const char* const WavAudioFormat::acidizerFlag = "acidizer flag"; +const char* const WavAudioFormat::acidRootNote = "acid root note"; +const char* const WavAudioFormat::acidBeats = "acid beats"; +const char* const WavAudioFormat::acidDenominator = "acid denominator"; +const char* const WavAudioFormat::acidNumerator = "acid numerator"; +const char* const WavAudioFormat::acidTempo = "acid tempo"; + +const char* const WavAudioFormat::ISRC = "ISRC"; +const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info"; + +//============================================================================== +namespace WavFileHelpers +{ + inline int chunkName (const char* const name) noexcept { return (int) ByteOrder::littleEndianInt (name); } + inline size_t roundUpSize (size_t sz) noexcept { return (sz + 3) & ~3u; } + + #if JUCE_MSVC + #pragma pack (push, 1) + #endif + + struct BWAVChunk + { + char description [256]; + char originator [32]; + char originatorRef [32]; + char originationDate [10]; + char originationTime [8]; + uint32 timeRefLow; + uint32 timeRefHigh; + uint16 version; + uint8 umid[64]; + uint8 reserved[190]; + char codingHistory[1]; + + void copyTo (StringPairArray& values, const int totalSize) const + { + values.set (WavAudioFormat::bwavDescription, String::fromUTF8 (description, sizeof (description))); + values.set (WavAudioFormat::bwavOriginator, String::fromUTF8 (originator, sizeof (originator))); + values.set (WavAudioFormat::bwavOriginatorRef, String::fromUTF8 (originatorRef, sizeof (originatorRef))); + values.set (WavAudioFormat::bwavOriginationDate, String::fromUTF8 (originationDate, sizeof (originationDate))); + values.set (WavAudioFormat::bwavOriginationTime, String::fromUTF8 (originationTime, sizeof (originationTime))); + + const uint32 timeLow = ByteOrder::swapIfBigEndian (timeRefLow); + const uint32 timeHigh = ByteOrder::swapIfBigEndian (timeRefHigh); + const int64 time = (((int64)timeHigh) << 32) + timeLow; + + values.set (WavAudioFormat::bwavTimeReference, String (time)); + values.set (WavAudioFormat::bwavCodingHistory, + String::fromUTF8 (codingHistory, totalSize - (int) offsetof (BWAVChunk, codingHistory))); + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + MemoryBlock data (roundUpSize (sizeof (BWAVChunk) + values [WavAudioFormat::bwavCodingHistory].getNumBytesAsUTF8())); + data.fillWith (0); + + BWAVChunk* b = (BWAVChunk*) data.getData(); + + // Allow these calls to overwrite an extra byte at the end, which is fine as long + // as they get called in the right order.. + values [WavAudioFormat::bwavDescription] .copyToUTF8 (b->description, 257); + values [WavAudioFormat::bwavOriginator] .copyToUTF8 (b->originator, 33); + values [WavAudioFormat::bwavOriginatorRef] .copyToUTF8 (b->originatorRef, 33); + values [WavAudioFormat::bwavOriginationDate].copyToUTF8 (b->originationDate, 11); + values [WavAudioFormat::bwavOriginationTime].copyToUTF8 (b->originationTime, 9); + + const int64 time = values [WavAudioFormat::bwavTimeReference].getLargeIntValue(); + b->timeRefLow = ByteOrder::swapIfBigEndian ((uint32) (time & 0xffffffff)); + b->timeRefHigh = ByteOrder::swapIfBigEndian ((uint32) (time >> 32)); + + values [WavAudioFormat::bwavCodingHistory].copyToUTF8 (b->codingHistory, 0x7fffffff); + + if (b->description[0] != 0 + || b->originator[0] != 0 + || b->originationDate[0] != 0 + || b->originationTime[0] != 0 + || b->codingHistory[0] != 0 + || time != 0) + { + return data; + } + + return MemoryBlock(); + } + + } JUCE_PACKED; + + //============================================================================== + struct SMPLChunk + { + struct SampleLoop + { + uint32 identifier; + uint32 type; // these are different in AIFF and WAV + uint32 start; + uint32 end; + uint32 fraction; + uint32 playCount; + } JUCE_PACKED; + + uint32 manufacturer; + uint32 product; + uint32 samplePeriod; + uint32 midiUnityNote; + uint32 midiPitchFraction; + uint32 smpteFormat; + uint32 smpteOffset; + uint32 numSampleLoops; + uint32 samplerData; + SampleLoop loops[1]; + + template + static void setValue (StringPairArray& values, NameType name, uint32 val) + { + values.set (name, String (ByteOrder::swapIfBigEndian (val))); + } + + static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val) + { + setValue (values, "Loop" + String (prefix) + name, val); + } + + void copyTo (StringPairArray& values, const int totalSize) const + { + setValue (values, "Manufacturer", manufacturer); + setValue (values, "Product", product); + setValue (values, "SamplePeriod", samplePeriod); + setValue (values, "MidiUnityNote", midiUnityNote); + setValue (values, "MidiPitchFraction", midiPitchFraction); + setValue (values, "SmpteFormat", smpteFormat); + setValue (values, "SmpteOffset", smpteOffset); + setValue (values, "NumSampleLoops", numSampleLoops); + setValue (values, "SamplerData", samplerData); + + for (int i = 0; i < (int) numSampleLoops; ++i) + { + if ((uint8*) (loops + (i + 1)) > ((uint8*) this) + totalSize) + break; + + setValue (values, i, "Identifier", loops[i].identifier); + setValue (values, i, "Type", loops[i].type); + setValue (values, i, "Start", loops[i].start); + setValue (values, i, "End", loops[i].end); + setValue (values, i, "Fraction", loops[i].fraction); + setValue (values, i, "PlayCount", loops[i].playCount); + } + } + + template + static uint32 getValue (const StringPairArray& values, NameType name, const char* def) + { + return ByteOrder::swapIfBigEndian ((uint32) values.getValue (name, def).getIntValue()); + } + + static uint32 getValue (const StringPairArray& values, int prefix, const char* name, const char* def) + { + return getValue (values, "Loop" + String (prefix) + name, def); + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + MemoryBlock data; + const int numLoops = jmin (64, values.getValue ("NumSampleLoops", "0").getIntValue()); + + if (numLoops > 0) + { + data.setSize (roundUpSize (sizeof (SMPLChunk) + (size_t) (numLoops - 1) * sizeof (SampleLoop)), true); + + SMPLChunk* const s = static_cast (data.getData()); + + s->manufacturer = getValue (values, "Manufacturer", "0"); + s->product = getValue (values, "Product", "0"); + s->samplePeriod = getValue (values, "SamplePeriod", "0"); + s->midiUnityNote = getValue (values, "MidiUnityNote", "60"); + s->midiPitchFraction = getValue (values, "MidiPitchFraction", "0"); + s->smpteFormat = getValue (values, "SmpteFormat", "0"); + s->smpteOffset = getValue (values, "SmpteOffset", "0"); + s->numSampleLoops = ByteOrder::swapIfBigEndian ((uint32) numLoops); + s->samplerData = getValue (values, "SamplerData", "0"); + + for (int i = 0; i < numLoops; ++i) + { + SampleLoop& loop = s->loops[i]; + loop.identifier = getValue (values, i, "Identifier", "0"); + loop.type = getValue (values, i, "Type", "0"); + loop.start = getValue (values, i, "Start", "0"); + loop.end = getValue (values, i, "End", "0"); + loop.fraction = getValue (values, i, "Fraction", "0"); + loop.playCount = getValue (values, i, "PlayCount", "0"); + } + } + + return data; + } + } JUCE_PACKED; + + //============================================================================== + struct InstChunk + { + int8 baseNote; + int8 detune; + int8 gain; + int8 lowNote; + int8 highNote; + int8 lowVelocity; + int8 highVelocity; + + static void setValue (StringPairArray& values, const char* name, int val) + { + values.set (name, String (val)); + } + + void copyTo (StringPairArray& values) const + { + setValue (values, "MidiUnityNote", baseNote); + setValue (values, "Detune", detune); + setValue (values, "Gain", gain); + setValue (values, "LowNote", lowNote); + setValue (values, "HighNote", highNote); + setValue (values, "LowVelocity", lowVelocity); + setValue (values, "HighVelocity", highVelocity); + } + + static int8 getValue (const StringPairArray& values, const char* name, const char* def) + { + return (int8) values.getValue (name, def).getIntValue(); + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + MemoryBlock data; + const StringArray& keys = values.getAllKeys(); + + if (keys.contains ("LowNote", true) && keys.contains ("HighNote", true)) + { + data.setSize (8, true); + InstChunk* const inst = static_cast (data.getData()); + + inst->baseNote = getValue (values, "MidiUnityNote", "60"); + inst->detune = getValue (values, "Detune", "0"); + inst->gain = getValue (values, "Gain", "0"); + inst->lowNote = getValue (values, "LowNote", "0"); + inst->highNote = getValue (values, "HighNote", "127"); + inst->lowVelocity = getValue (values, "LowVelocity", "1"); + inst->highVelocity = getValue (values, "HighVelocity", "127"); + } + + return data; + } + } JUCE_PACKED; + + //============================================================================== + struct CueChunk + { + struct Cue + { + uint32 identifier; + uint32 order; + uint32 chunkID; + uint32 chunkStart; + uint32 blockStart; + uint32 offset; + } JUCE_PACKED; + + uint32 numCues; + Cue cues[1]; + + static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val) + { + values.set ("Cue" + String (prefix) + name, String (ByteOrder::swapIfBigEndian (val))); + } + + void copyTo (StringPairArray& values, const int totalSize) const + { + values.set ("NumCuePoints", String (ByteOrder::swapIfBigEndian (numCues))); + + for (int i = 0; i < (int) numCues; ++i) + { + if ((uint8*) (cues + (i + 1)) > ((uint8*) this) + totalSize) + break; + + setValue (values, i, "Identifier", cues[i].identifier); + setValue (values, i, "Order", cues[i].order); + setValue (values, i, "ChunkID", cues[i].chunkID); + setValue (values, i, "ChunkStart", cues[i].chunkStart); + setValue (values, i, "BlockStart", cues[i].blockStart); + setValue (values, i, "Offset", cues[i].offset); + } + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + MemoryBlock data; + const int numCues = values.getValue ("NumCuePoints", "0").getIntValue(); + + if (numCues > 0) + { + data.setSize (roundUpSize (sizeof (CueChunk) + (size_t) (numCues - 1) * sizeof (Cue)), true); + + CueChunk* const c = static_cast (data.getData()); + + c->numCues = ByteOrder::swapIfBigEndian ((uint32) numCues); + + const String dataChunkID (chunkName ("data")); + int nextOrder = 0; + + #if JUCE_DEBUG + Array identifiers; + #endif + + for (int i = 0; i < numCues; ++i) + { + const String prefix ("Cue" + String (i)); + const uint32 identifier = (uint32) values.getValue (prefix + "Identifier", "0").getIntValue(); + + #if JUCE_DEBUG + jassert (! identifiers.contains (identifier)); + identifiers.add (identifier); + #endif + + const int order = values.getValue (prefix + "Order", String (nextOrder)).getIntValue(); + nextOrder = jmax (nextOrder, order) + 1; + + Cue& cue = c->cues[i]; + cue.identifier = ByteOrder::swapIfBigEndian ((uint32) identifier); + cue.order = ByteOrder::swapIfBigEndian ((uint32) order); + cue.chunkID = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkID", dataChunkID).getIntValue()); + cue.chunkStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkStart", "0").getIntValue()); + cue.blockStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "BlockStart", "0").getIntValue()); + cue.offset = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Offset", "0").getIntValue()); + } + } + + return data; + } + + } JUCE_PACKED; + + //============================================================================== + namespace ListChunk + { + static int getValue (const StringPairArray& values, const String& name) + { + return values.getValue (name, "0").getIntValue(); + } + + static int getValue (const StringPairArray& values, const String& prefix, const char* name) + { + return getValue (values, prefix + name); + } + + static void appendLabelOrNoteChunk (const StringPairArray& values, const String& prefix, + const int chunkType, MemoryOutputStream& out) + { + const String label (values.getValue (prefix + "Text", prefix)); + const int labelLength = (int) label.getNumBytesAsUTF8() + 1; + const int chunkLength = 4 + labelLength + (labelLength & 1); + + out.writeInt (chunkType); + out.writeInt (chunkLength); + out.writeInt (getValue (values, prefix, "Identifier")); + out.write (label.toUTF8(), (size_t) labelLength); + + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); + } + + static void appendExtraChunk (const StringPairArray& values, const String& prefix, MemoryOutputStream& out) + { + const String text (values.getValue (prefix + "Text", prefix)); + + const int textLength = (int) text.getNumBytesAsUTF8() + 1; // include null terminator + int chunkLength = textLength + 20 + (textLength & 1); + + out.writeInt (chunkName ("ltxt")); + out.writeInt (chunkLength); + out.writeInt (getValue (values, prefix, "Identifier")); + out.writeInt (getValue (values, prefix, "SampleLength")); + out.writeInt (getValue (values, prefix, "Purpose")); + out.writeShort ((short) getValue (values, prefix, "Country")); + out.writeShort ((short) getValue (values, prefix, "Language")); + out.writeShort ((short) getValue (values, prefix, "Dialect")); + out.writeShort ((short) getValue (values, prefix, "CodePage")); + out.write (text.toUTF8(), (size_t) textLength); + + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + const int numCueLabels = getValue (values, "NumCueLabels"); + const int numCueNotes = getValue (values, "NumCueNotes"); + const int numCueRegions = getValue (values, "NumCueRegions"); + + MemoryOutputStream out; + + if (numCueLabels + numCueNotes + numCueRegions > 0) + { + out.writeInt (chunkName ("adtl")); + + for (int i = 0; i < numCueLabels; ++i) + appendLabelOrNoteChunk (values, "CueLabel" + String (i), chunkName ("labl"), out); + + for (int i = 0; i < numCueNotes; ++i) + appendLabelOrNoteChunk (values, "CueNote" + String (i), chunkName ("note"), out); + + for (int i = 0; i < numCueRegions; ++i) + appendExtraChunk (values, "CueRegion" + String (i), out); + } + + return out.getMemoryBlock(); + } + } + + //============================================================================== + namespace ListInfoChunk + { + static bool writeValue (const StringPairArray& values, MemoryOutputStream& out, const char* paramName) + { + const String value (values.getValue (paramName, String())); + + if (value.isEmpty()) + return false; + + const int valueLength = (int) value.getNumBytesAsUTF8() + 1; + const int chunkLength = valueLength + (valueLength & 1); + + out.writeInt (chunkName (paramName)); + out.writeInt (chunkLength); + out.write (value.toUTF8(), (size_t) valueLength); + + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); + + return true; + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + static const char* params[] = { "INAM", "IART", "IPRD", "IPRT", "ISFT", + "ISRC", "IGNR", "ICMT", "ICOP", "ICRD" }; + + MemoryOutputStream out; + out.writeInt (chunkName ("INFO")); + bool anyParamsDefined = false; + + for (int i = 0; i < numElementsInArray (params); ++i) + if (writeValue (values, out, params[i])) + anyParamsDefined = true; + + return anyParamsDefined ? out.getMemoryBlock() : MemoryBlock(); + } + } + + //============================================================================== + struct AcidChunk + { + /** Reads an acid RIFF chunk from a stream positioned just after the size byte. */ + AcidChunk (InputStream& input, size_t length) + { + zerostruct (*this); + input.read (this, (int) jmin (sizeof (*this), length)); + } + + AcidChunk (const StringPairArray& values) + { + zerostruct (*this); + + flags = getFlagIfPresent (values, WavAudioFormat::acidOneShot, 0x01) + | getFlagIfPresent (values, WavAudioFormat::acidRootSet, 0x02) + | getFlagIfPresent (values, WavAudioFormat::acidStretch, 0x04) + | getFlagIfPresent (values, WavAudioFormat::acidDiskBased, 0x08) + | getFlagIfPresent (values, WavAudioFormat::acidizerFlag, 0x10); + + if (values[WavAudioFormat::acidRootSet].getIntValue() != 0) + rootNote = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidRootNote].getIntValue()); + + numBeats = ByteOrder::swapIfBigEndian ((uint32) values[WavAudioFormat::acidBeats].getIntValue()); + meterDenominator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidDenominator].getIntValue()); + meterNumerator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidNumerator].getIntValue()); + + if (values.containsKey (WavAudioFormat::acidTempo)) + tempo = swapFloatByteOrder (values[WavAudioFormat::acidTempo].getFloatValue()); + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + return AcidChunk (values).toMemoryBlock(); + } + + MemoryBlock toMemoryBlock() const + { + return (flags != 0 || rootNote != 0 || numBeats != 0 || meterDenominator != 0 || meterNumerator != 0) + ? MemoryBlock (this, sizeof (*this)) : MemoryBlock(); + } + + void addToMetadata (StringPairArray& values) const + { + setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01); + setBoolFlag (values, WavAudioFormat::acidRootSet, 0x02); + setBoolFlag (values, WavAudioFormat::acidStretch, 0x04); + setBoolFlag (values, WavAudioFormat::acidDiskBased, 0x08); + setBoolFlag (values, WavAudioFormat::acidizerFlag, 0x10); + + if (flags & 0x02) // root note set + values.set (WavAudioFormat::acidRootNote, String (ByteOrder::swapIfBigEndian (rootNote))); + + values.set (WavAudioFormat::acidBeats, String (ByteOrder::swapIfBigEndian (numBeats))); + values.set (WavAudioFormat::acidDenominator, String (ByteOrder::swapIfBigEndian (meterDenominator))); + values.set (WavAudioFormat::acidNumerator, String (ByteOrder::swapIfBigEndian (meterNumerator))); + values.set (WavAudioFormat::acidTempo, String (swapFloatByteOrder (tempo))); + } + + void setBoolFlag (StringPairArray& values, const char* name, uint32 mask) const + { + values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0"); + } + + static uint32 getFlagIfPresent (const StringPairArray& values, const char* name, uint32 flag) + { + return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0; + } + + static float swapFloatByteOrder (const float x) noexcept + { + #ifdef JUCE_BIG_ENDIAN + union { uint32 asInt; float asFloat; } n; + n.asFloat = x; + n.asInt = ByteOrder::swap (n.asInt); + return n.asFloat; + #else + return x; + #endif + } + + uint32 flags; + uint16 rootNote; + uint16 reserved1; + float reserved2; + uint32 numBeats; + uint16 meterDenominator; + uint16 meterNumerator; + float tempo; + + } JUCE_PACKED; + + //============================================================================== + struct TracktionChunk + { + static MemoryBlock createFrom (const StringPairArray& values) + { + const String s = values[WavAudioFormat::tracktionLoopInfo]; + MemoryBlock data; + + if (s.isNotEmpty()) + { + MemoryOutputStream os (data, false); + os.writeString (s); + } + + return data; + } + }; + + //============================================================================== + namespace AXMLChunk + { + static void addToMetadata (StringPairArray& destValues, const String& source) + { + ScopedPointer xml (XmlDocument::parse (source)); + + if (xml != nullptr && xml->hasTagName ("ebucore:ebuCoreMain")) + { + if (XmlElement* xml2 = xml->getChildByName ("ebucore:coreMetadata")) + { + if (XmlElement* xml3 = xml2->getChildByName ("ebucore:identifier")) + { + if (XmlElement* xml4 = xml3->getChildByName ("dc:identifier")) + { + const String ISRCCode (xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true)); + + if (ISRCCode.isNotEmpty()) + destValues.set (WavAudioFormat::ISRC, ISRCCode); + } + } + } + } + } + + static MemoryBlock createFrom (const StringPairArray& values) + { + const String ISRC (values.getValue (WavAudioFormat::ISRC, String::empty)); + MemoryOutputStream xml; + + if (ISRC.isNotEmpty()) + { + xml << "" + "" + "" + "ISRC:" << ISRC << "" + "" + "" + ""; + + xml.writeRepeatedByte (0, xml.getDataSize()); // ensures even size, null termination and room for future growing + } + + return xml.getMemoryBlock(); + } + }; + + //============================================================================== + struct ExtensibleWavSubFormat + { + uint32 data1; + uint16 data2; + uint16 data3; + uint8 data4[8]; + + bool operator== (const ExtensibleWavSubFormat& other) const noexcept { return memcmp (this, &other, sizeof (*this)) == 0; } + bool operator!= (const ExtensibleWavSubFormat& other) const noexcept { return ! operator== (other); } + + } JUCE_PACKED; + + static const ExtensibleWavSubFormat pcmFormat = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; + static const ExtensibleWavSubFormat IEEEFloatFormat = { 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; + static const ExtensibleWavSubFormat ambisonicFormat = { 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } }; + + struct DataSize64Chunk // chunk ID = 'ds64' if data size > 0xffffffff, 'JUNK' otherwise + { + uint32 riffSizeLow; // low 4 byte size of RF64 block + uint32 riffSizeHigh; // high 4 byte size of RF64 block + uint32 dataSizeLow; // low 4 byte size of data chunk + uint32 dataSizeHigh; // high 4 byte size of data chunk + uint32 sampleCountLow; // low 4 byte sample count of fact chunk + uint32 sampleCountHigh; // high 4 byte sample count of fact chunk + uint32 tableLength; // number of valid entries in array 'table' + } JUCE_PACKED; + + #if JUCE_MSVC + #pragma pack (pop) + #endif +} + +//============================================================================== +class WavAudioFormatReader : public AudioFormatReader +{ +public: + WavAudioFormatReader (InputStream* const in) + : AudioFormatReader (in, wavFormatName), + bwavChunkStart (0), + bwavSize (0), + dataLength (0), + isRF64 (false) + { + using namespace WavFileHelpers; + uint64 len = 0; + uint64 end = 0; + int cueNoteIndex = 0; + int cueLabelIndex = 0; + int cueRegionIndex = 0; + + const int firstChunkType = input->readInt(); + + if (firstChunkType == chunkName ("RF64")) + { + input->skipNextBytes (4); // size is -1 for RF64 + isRF64 = true; + } + else if (firstChunkType == chunkName ("RIFF")) + { + len = (uint64) (uint32) input->readInt(); + end = len + (uint64) input->getPosition(); + } + else + { + return; + } + + const int64 startOfRIFFChunk = input->getPosition(); + + if (input->readInt() == chunkName ("WAVE")) + { + if (isRF64 && input->readInt() == chunkName ("ds64")) + { + const uint32 length = (uint32) input->readInt(); + + if (length < 28) + return; + + const int64 chunkEnd = input->getPosition() + length + (length & 1); + len = (uint64) input->readInt64(); + end = len + (uint64) startOfRIFFChunk; + dataLength = input->readInt64(); + input->setPosition (chunkEnd); + } + + while ((uint64) input->getPosition() < end && ! input->isExhausted()) + { + const int chunkType = input->readInt(); + uint32 length = (uint32) input->readInt(); + const int64 chunkEnd = input->getPosition() + length + (length & 1); + + if (chunkType == chunkName ("fmt ")) + { + // read the format chunk + const unsigned short format = (unsigned short) input->readShort(); + numChannels = (unsigned int) input->readShort(); + sampleRate = input->readInt(); + const int bytesPerSec = input->readInt(); + input->skipNextBytes (2); + bitsPerSample = (unsigned int) (int) input->readShort(); + + if (bitsPerSample > 64) + { + bytesPerFrame = bytesPerSec / (int) sampleRate; + bitsPerSample = 8 * (unsigned int) bytesPerFrame / numChannels; + } + else + { + bytesPerFrame = numChannels * bitsPerSample / 8; + } + + if (format == 3) + { + usesFloatingPointData = true; + } + else if (format == 0xfffe /*WAVE_FORMAT_EXTENSIBLE*/) + { + if (length < 40) // too short + { + bytesPerFrame = 0; + } + else + { + input->skipNextBytes (4); // skip over size and bitsPerSample + metadataValues.set ("ChannelMask", String (input->readInt())); + + ExtensibleWavSubFormat subFormat; + subFormat.data1 = (uint32) input->readInt(); + subFormat.data2 = (uint16) input->readShort(); + subFormat.data3 = (uint16) input->readShort(); + input->read (subFormat.data4, sizeof (subFormat.data4)); + + if (subFormat == IEEEFloatFormat) + usesFloatingPointData = true; + else if (subFormat != pcmFormat && subFormat != ambisonicFormat) + bytesPerFrame = 0; + } + } + else if (format != 1) + { + bytesPerFrame = 0; + } + } + else if (chunkType == chunkName ("data")) + { + if (! isRF64) // data size is expected to be -1, actual data size is in ds64 chunk + dataLength = length; + + dataChunkStart = input->getPosition(); + lengthInSamples = (bytesPerFrame > 0) ? (dataLength / bytesPerFrame) : 0; + } + else if (chunkType == chunkName ("bext")) + { + bwavChunkStart = input->getPosition(); + bwavSize = length; + + HeapBlock bwav; + bwav.calloc (jmax ((size_t) length + 1, sizeof (BWAVChunk)), 1); + input->read (bwav, (int) length); + bwav->copyTo (metadataValues, (int) length); + } + else if (chunkType == chunkName ("smpl")) + { + HeapBlock smpl; + smpl.calloc (jmax ((size_t) length + 1, sizeof (SMPLChunk)), 1); + input->read (smpl, (int) length); + smpl->copyTo (metadataValues, (int) length); + } + else if (chunkType == chunkName ("inst") || chunkType == chunkName ("INST")) // need to check which... + { + HeapBlock inst; + inst.calloc (jmax ((size_t) length + 1, sizeof (InstChunk)), 1); + input->read (inst, (int) length); + inst->copyTo (metadataValues); + } + else if (chunkType == chunkName ("cue ")) + { + HeapBlock cue; + cue.calloc (jmax ((size_t) length + 1, sizeof (CueChunk)), 1); + input->read (cue, (int) length); + cue->copyTo (metadataValues, (int) length); + } + else if (chunkType == chunkName ("axml")) + { + MemoryBlock axml; + input->readIntoMemoryBlock (axml, (ssize_t) length); + AXMLChunk::addToMetadata (metadataValues, axml.toString()); + } + else if (chunkType == chunkName ("LIST")) + { + if (input->readInt() == chunkName ("adtl")) + { + while (input->getPosition() < chunkEnd) + { + const int adtlChunkType = input->readInt(); + const uint32 adtlLength = (uint32) input->readInt(); + const int64 adtlChunkEnd = input->getPosition() + (adtlLength + (adtlLength & 1)); + + if (adtlChunkType == chunkName ("labl") || adtlChunkType == chunkName ("note")) + { + String prefix; + + if (adtlChunkType == chunkName ("labl")) + prefix << "CueLabel" << cueLabelIndex++; + else if (adtlChunkType == chunkName ("note")) + prefix << "CueNote" << cueNoteIndex++; + + const uint32 identifier = (uint32) input->readInt(); + const int stringLength = (int) adtlLength - 4; + + MemoryBlock textBlock; + input->readIntoMemoryBlock (textBlock, stringLength); + + metadataValues.set (prefix + "Identifier", String (identifier)); + metadataValues.set (prefix + "Text", textBlock.toString()); + } + else if (adtlChunkType == chunkName ("ltxt")) + { + const String prefix ("CueRegion" + String (cueRegionIndex++)); + const uint32 identifier = (uint32) input->readInt(); + const uint32 sampleLength = (uint32) input->readInt(); + const uint32 purpose = (uint32) input->readInt(); + const uint16 country = (uint16) input->readInt(); + const uint16 language = (uint16) input->readInt(); + const uint16 dialect = (uint16) input->readInt(); + const uint16 codePage = (uint16) input->readInt(); + const uint32 stringLength = adtlLength - 20; + + MemoryBlock textBlock; + input->readIntoMemoryBlock (textBlock, (int) stringLength); + + metadataValues.set (prefix + "Identifier", String (identifier)); + metadataValues.set (prefix + "SampleLength", String (sampleLength)); + metadataValues.set (prefix + "Purpose", String (purpose)); + metadataValues.set (prefix + "Country", String (country)); + metadataValues.set (prefix + "Language", String (language)); + metadataValues.set (prefix + "Dialect", String (dialect)); + metadataValues.set (prefix + "CodePage", String (codePage)); + metadataValues.set (prefix + "Text", textBlock.toString()); + } + + input->setPosition (adtlChunkEnd); + } + } + } + else if (chunkType == chunkName ("acid")) + { + AcidChunk (*input, length).addToMetadata (metadataValues); + } + else if (chunkType == chunkName ("Trkn")) + { + MemoryBlock tracktion; + input->readIntoMemoryBlock (tracktion, (ssize_t) length); + metadataValues.set (WavAudioFormat::tracktionLoopInfo, tracktion.toString()); + } + else if (chunkEnd <= input->getPosition()) + { + break; + } + + input->setPosition (chunkEnd); + } + } + + if (cueLabelIndex > 0) metadataValues.set ("NumCueLabels", String (cueLabelIndex)); + if (cueNoteIndex > 0) metadataValues.set ("NumCueNotes", String (cueNoteIndex)); + if (cueRegionIndex > 0) metadataValues.set ("NumCueRegions", String (cueRegionIndex)); + if (metadataValues.size() > 0) metadataValues.set ("MetaDataSource", "WAV"); + } + + //============================================================================== + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, lengthInSamples); + + if (numSamples <= 0) + return true; + + input->setPosition (dataChunkStart + startSampleInFile * bytesPerFrame); + + while (numSamples > 0) + { + const int tempBufSize = 480 * 3 * 4; // (keep this a multiple of 3) + char tempBuffer [tempBufSize]; + + const int numThisTime = jmin (tempBufSize / bytesPerFrame, numSamples); + const int bytesRead = input->read (tempBuffer, numThisTime * bytesPerFrame); + + if (bytesRead < numThisTime * bytesPerFrame) + { + jassert (bytesRead >= 0); + zeromem (tempBuffer + bytesRead, (size_t) (numThisTime * bytesPerFrame - bytesRead)); + } + + copySampleData (bitsPerSample, usesFloatingPointData, + destSamples, startOffsetInDestBuffer, numDestChannels, + tempBuffer, (int) numChannels, numThisTime); + + startOffsetInDestBuffer += numThisTime; + numSamples -= numThisTime; + } + + return true; + } + + static void copySampleData (unsigned int bitsPerSample, const bool usesFloatingPointData, + int* const* destSamples, int startOffsetInDestBuffer, int numDestChannels, + const void* sourceData, int numChannels, int numSamples) noexcept + { + switch (bitsPerSample) + { + case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + case 32: if (usesFloatingPointData) ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); + else ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; + default: jassertfalse; break; + } + } + + int64 bwavChunkStart, bwavSize; + int64 dataChunkStart, dataLength; + int bytesPerFrame; + bool isRF64; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormatReader) +}; + +//============================================================================== +class WavAudioFormatWriter : public AudioFormatWriter +{ +public: + WavAudioFormatWriter (OutputStream* const out, const double rate, + const unsigned int numChans, const unsigned int bits, + const StringPairArray& metadataValues) + : AudioFormatWriter (out, wavFormatName, rate, numChans, bits), + lengthInSamples (0), + bytesWritten (0), + writeFailed (false) + { + using namespace WavFileHelpers; + + if (metadataValues.size() > 0) + { + // The meta data should have been santised for the WAV format. + // If it was originally sourced from an AIFF file the MetaDataSource + // key should be removed (or set to "WAV") once this has been done + jassert (metadataValues.getValue ("MetaDataSource", "None") != "AIFF"); + + bwavChunk = BWAVChunk::createFrom (metadataValues); + axmlChunk = AXMLChunk::createFrom (metadataValues); + smplChunk = SMPLChunk::createFrom (metadataValues); + instChunk = InstChunk::createFrom (metadataValues); + cueChunk = CueChunk ::createFrom (metadataValues); + listChunk = ListChunk::createFrom (metadataValues); + listInfoChunk = ListInfoChunk::createFrom (metadataValues); + acidChunk = AcidChunk::createFrom (metadataValues); + trckChunk = TracktionChunk::createFrom (metadataValues); + } + + headerPosition = out->getPosition(); + writeHeader(); + } + + ~WavAudioFormatWriter() + { + writeHeader(); + } + + //============================================================================== + bool write (const int** data, int numSamples) override + { + jassert (numSamples >= 0); + jassert (data != nullptr && *data != nullptr); // the input must contain at least one channel! + + if (writeFailed) + return false; + + const size_t bytes = numChannels * (unsigned int) numSamples * bitsPerSample / 8; + tempBlock.ensureSize (bytes, false); + + switch (bitsPerSample) + { + case 8: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + case 16: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + case 24: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + case 32: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; + default: jassertfalse; break; + } + + if (! output->write (tempBlock.getData(), bytes)) + { + // failed to write to disk, so let's try writing the header. + // If it's just run out of disk space, then if it does manage + // to write the header, we'll still have a useable file.. + writeHeader(); + writeFailed = true; + return false; + } + + bytesWritten += bytes; + lengthInSamples += (uint64) numSamples; + return true; + } + + bool flush() override + { + const int64 lastWritePos = output->getPosition(); + writeHeader(); + + if (output->setPosition (lastWritePos)) + return true; + + // if this fails, you've given it an output stream that can't seek! It needs + // to be able to seek back to write the header + jassertfalse; + return false; + } + +private: + MemoryBlock tempBlock, bwavChunk, axmlChunk, smplChunk, instChunk, cueChunk, listChunk, listInfoChunk, acidChunk, trckChunk; + uint64 lengthInSamples, bytesWritten; + int64 headerPosition; + bool writeFailed; + + static int getChannelMask (const int numChannels) noexcept + { + switch (numChannels) + { + case 1: return 0; + case 2: return 1 + 2; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT + case 3: return 1 + 2 + 4; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER + case 4: return 1 + 2 + 16 + 32; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT + case 5: return 1 + 2 + 4 + 16 + 32; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT + case 6: return 1 + 2 + 4 + 8 + 16 + 32; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT + case 7: return 1 + 2 + 4 + 16 + 32 + 512 + 1024; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT + case 8: return 1 + 2 + 4 + 8 + 16 + 32 + 512 + 1024; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT + default: break; + } + + return 0; + } + + void writeHeader() + { + if ((bytesWritten & 1) != 0) // pad to an even length + output->writeByte (0); + + using namespace WavFileHelpers; + + if (headerPosition != output->getPosition() && ! output->setPosition (headerPosition)) + { + // if this fails, you've given it an output stream that can't seek! It needs to be + // able to seek back to go back and write the header after the data has been written. + jassertfalse; + return; + } + + const size_t bytesPerFrame = numChannels * bitsPerSample / 8; + uint64 audioDataSize = bytesPerFrame * lengthInSamples; + + const bool isRF64 = (bytesWritten >= 0x100000000LL); + const bool isWaveFmtEx = isRF64 || (numChannels > 2); + + int64 riffChunkSize = (int64) (4 /* 'RIFF' */ + 8 + 40 /* WAVEFORMATEX */ + + 8 + audioDataSize + (audioDataSize & 1) + + chunkSize (bwavChunk) + + chunkSize (axmlChunk) + + chunkSize (smplChunk) + + chunkSize (instChunk) + + chunkSize (cueChunk) + + chunkSize (listChunk) + + chunkSize (listInfoChunk) + + chunkSize (acidChunk) + + chunkSize (trckChunk) + + (8 + 28)); // (ds64 chunk) + + riffChunkSize += (riffChunkSize & 1); + + if (isRF64) + writeChunkHeader (chunkName ("RF64"), -1); + else + writeChunkHeader (chunkName ("RIFF"), (int) riffChunkSize); + + output->writeInt (chunkName ("WAVE")); + + if (! isRF64) + { + #if ! JUCE_WAV_DO_NOT_PAD_HEADER_SIZE + /* NB: This junk chunk is added for padding, so that the header is a fixed size + regardless of whether it's RF64 or not. That way, we can begin recording a file, + and when it's finished, can go back and write either a RIFF or RF64 header, + depending on whether more than 2^32 samples were written. + + The JUCE_WAV_DO_NOT_PAD_HEADER_SIZE macro allows you to disable this feature in case + you need to create files for crappy WAV players with bugs that stop them skipping chunks + which they don't recognise. But DO NOT USE THIS option unless you really have no choice, + because it means that if you write more than 2^32 samples to the file, you'll corrupt it. + */ + writeChunkHeader (chunkName ("JUNK"), 28 + (isWaveFmtEx? 0 : 24)); + output->writeRepeatedByte (0, 28 /* ds64 */ + (isWaveFmtEx? 0 : 24)); + #endif + } + else + { + #if JUCE_WAV_DO_NOT_PAD_HEADER_SIZE + // If you disable padding, then you MUST NOT write more than 2^32 samples to a file. + jassertfalse; + #endif + + writeChunkHeader (chunkName ("ds64"), 28); // chunk size for uncompressed data (no table) + output->writeInt64 (riffChunkSize); + output->writeInt64 ((int64) audioDataSize); + output->writeRepeatedByte (0, 12); + } + + if (isWaveFmtEx) + { + writeChunkHeader (chunkName ("fmt "), 40); + output->writeShort ((short) (uint16) 0xfffe); // WAVE_FORMAT_EXTENSIBLE + } + else + { + writeChunkHeader (chunkName ("fmt "), 16); + output->writeShort (bitsPerSample < 32 ? (short) 1 /*WAVE_FORMAT_PCM*/ + : (short) 3 /*WAVE_FORMAT_IEEE_FLOAT*/); + } + + output->writeShort ((short) numChannels); + output->writeInt ((int) sampleRate); + output->writeInt ((int) (bytesPerFrame * sampleRate)); // nAvgBytesPerSec + output->writeShort ((short) bytesPerFrame); // nBlockAlign + output->writeShort ((short) bitsPerSample); // wBitsPerSample + + if (isWaveFmtEx) + { + output->writeShort (22); // cbSize (size of the extension) + output->writeShort ((short) bitsPerSample); // wValidBitsPerSample + output->writeInt (getChannelMask ((int) numChannels)); + + const ExtensibleWavSubFormat& subFormat = bitsPerSample < 32 ? pcmFormat : IEEEFloatFormat; + + output->writeInt ((int) subFormat.data1); + output->writeShort ((short) subFormat.data2); + output->writeShort ((short) subFormat.data3); + output->write (subFormat.data4, sizeof (subFormat.data4)); + } + + writeChunk (bwavChunk, chunkName ("bext")); + writeChunk (axmlChunk, chunkName ("axml")); + writeChunk (smplChunk, chunkName ("smpl")); + writeChunk (instChunk, chunkName ("inst"), 7); + writeChunk (cueChunk, chunkName ("cue ")); + writeChunk (listChunk, chunkName ("LIST")); + writeChunk (listInfoChunk, chunkName ("LIST")); + writeChunk (acidChunk, chunkName ("acid")); + writeChunk (trckChunk, chunkName ("Trkn")); + + writeChunkHeader (chunkName ("data"), isRF64 ? -1 : (int) (lengthInSamples * bytesPerFrame)); + + usesFloatingPointData = (bitsPerSample == 32); + } + + static size_t chunkSize (const MemoryBlock& data) noexcept { return data.getSize() > 0 ? (8 + data.getSize()) : 0; } + + void writeChunkHeader (int chunkType, int size) const + { + output->writeInt (chunkType); + output->writeInt (size); + } + + void writeChunk (const MemoryBlock& data, int chunkType, int size = 0) const + { + if (data.getSize() > 0) + { + writeChunkHeader (chunkType, size != 0 ? size : (int) data.getSize()); + *output << data; + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormatWriter) +}; + +//============================================================================== +class MemoryMappedWavReader : public MemoryMappedAudioFormatReader +{ +public: + MemoryMappedWavReader (const File& file, const WavAudioFormatReader& reader) + : MemoryMappedAudioFormatReader (file, reader, reader.dataChunkStart, + reader.dataLength, reader.bytesPerFrame) + { + } + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, lengthInSamples); + + if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) + { + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. + return false; + } + + WavAudioFormatReader::copySampleData (bitsPerSample, usesFloatingPointData, + destSamples, startOffsetInDestBuffer, numDestChannels, + sampleToPointer (startSampleInFile), (int) numChannels, numSamples); + return true; + } + + void readMaxLevels (int64 startSampleInFile, int64 numSamples, + float& min0, float& max0, float& min1, float& max1) override + { + if (numSamples <= 0) + { + min0 = max0 = min1 = max1 = 0; + return; + } + + if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) + { + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. + + min0 = max0 = min1 = max1 = 0; + return; + } + + switch (bitsPerSample) + { + case 8: scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + case 16: scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + case 24: scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + case 32: if (usesFloatingPointData) scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); + else scanMinAndMax (startSampleInFile, numSamples, min0, max0, min1, max1); break; + default: jassertfalse; break; + } + } + +private: + template + void scanMinAndMax (int64 startSampleInFile, int64 numSamples, + float& min0, float& max0, float& min1, float& max1) const noexcept + { + scanMinAndMaxInterleaved (0, startSampleInFile, numSamples, min0, max0); + + if (numChannels > 1) + scanMinAndMaxInterleaved (1, startSampleInFile, numSamples, min1, max1); + else + min1 = max1 = 0; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedWavReader) +}; + +//============================================================================== +WavAudioFormat::WavAudioFormat() : AudioFormat (wavFormatName, ".wav .bwf") {} +WavAudioFormat::~WavAudioFormat() {} + +Array WavAudioFormat::getPossibleSampleRates() +{ + const int rates[] = { 8000, 11025, 12000, 16000, 22050, 32000, 44100, + 48000, 88200, 96000, 176400, 192000, 352800, 384000 }; + + return Array (rates, numElementsInArray (rates)); +} + +Array WavAudioFormat::getPossibleBitDepths() +{ + const int depths[] = { 8, 16, 24, 32 }; + + return Array (depths, numElementsInArray (depths)); +} + +bool WavAudioFormat::canDoStereo() { return true; } +bool WavAudioFormat::canDoMono() { return true; } + +AudioFormatReader* WavAudioFormat::createReaderFor (InputStream* sourceStream, + const bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new WavAudioFormatReader (sourceStream)); + + if (r->sampleRate > 0 && r->numChannels > 0 && r->bytesPerFrame > 0) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +MemoryMappedAudioFormatReader* WavAudioFormat::createMemoryMappedReader (const File& file) +{ + if (FileInputStream* fin = file.createInputStream()) + { + WavAudioFormatReader reader (fin); + + if (reader.lengthInSamples > 0) + return new MemoryMappedWavReader (file, reader); + } + + return nullptr; +} + +AudioFormatWriter* WavAudioFormat::createWriterFor (OutputStream* out, double sampleRate, + unsigned int numChannels, int bitsPerSample, + const StringPairArray& metadataValues, int /*qualityOptionIndex*/) +{ + if (getPossibleBitDepths().contains (bitsPerSample)) + return new WavAudioFormatWriter (out, sampleRate, (unsigned int) numChannels, + (unsigned int) bitsPerSample, metadataValues); + + return nullptr; +} + +namespace WavFileHelpers +{ + static bool slowCopyWavFileWithNewMetadata (const File& file, const StringPairArray& metadata) + { + TemporaryFile tempFile (file); + + WavAudioFormat wav; + ScopedPointer reader (wav.createReaderFor (file.createInputStream(), true)); + + if (reader != nullptr) + { + ScopedPointer outStream (tempFile.getFile().createOutputStream()); + + if (outStream != nullptr) + { + ScopedPointer writer (wav.createWriterFor (outStream, reader->sampleRate, + reader->numChannels, (int) reader->bitsPerSample, + metadata, 0)); + + if (writer != nullptr) + { + outStream.release(); + + bool ok = writer->writeFromAudioReader (*reader, 0, -1); + writer = nullptr; + reader = nullptr; + + return ok && tempFile.overwriteTargetFileWithTemporary(); + } + } + } + + return false; + } +} + +bool WavAudioFormat::replaceMetadataInFile (const File& wavFile, const StringPairArray& newMetadata) +{ + using namespace WavFileHelpers; + ScopedPointer reader (static_cast (createReaderFor (wavFile.createInputStream(), true))); + + if (reader != nullptr) + { + const int64 bwavPos = reader->bwavChunkStart; + const int64 bwavSize = reader->bwavSize; + reader = nullptr; + + if (bwavSize > 0) + { + MemoryBlock chunk (BWAVChunk::createFrom (newMetadata)); + + if (chunk.getSize() <= (size_t) bwavSize) + { + // the new one will fit in the space available, so write it directly.. + const int64 oldSize = wavFile.getSize(); + + { + FileOutputStream out (wavFile); + + if (! out.failedToOpen()) + { + out.setPosition (bwavPos); + out << chunk; + out.setPosition (oldSize); + } + } + + jassert (wavFile.getSize() == oldSize); + + return true; + } + } + } + + return slowCopyWavFileWithNewMetadata (wavFile, newMetadata); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h new file mode 100644 index 0000000000..62de05a897 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h @@ -0,0 +1,171 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +//============================================================================== +/** + Reads and Writes WAV format audio files. + + @see AudioFormat +*/ +class JUCE_API WavAudioFormat : public AudioFormat +{ +public: + //============================================================================== + /** Creates a format object. */ + WavAudioFormat(); + + /** Destructor. */ + ~WavAudioFormat(); + + //============================================================================== + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavDescription; + + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavOriginator; + + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavOriginatorRef; + + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + Date format is: yyyy-mm-dd + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavOriginationDate; + + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + Time format is: hh-mm-ss + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavOriginationTime; + + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + This is the number of samples from the start of an edit that the + file is supposed to begin at. Seems like an obvious mistake to + only allow a file to occur in an edit once, but that's the way + it is.. + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavTimeReference; + + /** Metadata property name used by wav readers and writers for adding + a BWAV chunk to the file. + + @see AudioFormatReader::metadataValues, createWriterFor + */ + static const char* const bwavCodingHistory; + + /** Utility function to fill out the appropriate metadata for a BWAV file. + + This just makes it easier than using the property names directly, and it + fills out the time and date in the right format. + */ + static StringPairArray createBWAVMetadata (const String& description, + const String& originator, + const String& originatorRef, + const Time dateAndTime, + const int64 timeReferenceSamples, + const String& codingHistory); + + //============================================================================== + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidOneShot; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidRootSet; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidStretch; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidDiskBased; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidizerFlag; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidRootNote; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidBeats; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidDenominator; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidNumerator; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidTempo; + + //============================================================================== + /** Metadata property name used when reading an ISRC code from an AXML chunk. */ + static const char* const ISRC; + + /** Metadata property name used when reading a WAV file with a Tracktion chunk. */ + static const char* const tracktionLoopInfo; + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) override; + + MemoryMappedAudioFormatReader* createMemoryMappedReader (const File& file) override; + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) override; + + //============================================================================== + /** Utility function to replace the metadata in a wav file with a new set of values. + + If possible, this cheats by overwriting just the metadata region of the file, rather + than by copying the whole file again. + */ + bool replaceMetadataInFile (const File& wavFile, const StringPairArray& newMetadata); + + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormat) +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp new file mode 100644 index 0000000000..f5f5664833 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -0,0 +1,350 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +namespace WindowsMediaCodec +{ + +class JuceIStream : public ComBaseClassHelper +{ +public: + JuceIStream (InputStream& in) noexcept + : ComBaseClassHelper (0), source (in) + { + } + + JUCE_COMRESULT Commit (DWORD) { return S_OK; } + JUCE_COMRESULT Write (const void*, ULONG, ULONG*) { return E_NOTIMPL; } + JUCE_COMRESULT Clone (IStream**) { return E_NOTIMPL; } + JUCE_COMRESULT SetSize (ULARGE_INTEGER) { return E_NOTIMPL; } + JUCE_COMRESULT Revert() { return E_NOTIMPL; } + JUCE_COMRESULT LockRegion (ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT UnlockRegion (ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; } + + JUCE_COMRESULT Read (void* dest, ULONG numBytes, ULONG* bytesRead) + { + const int numRead = source.read (dest, numBytes); + + if (bytesRead != nullptr) + *bytesRead = numRead; + + return (numRead == (int) numBytes) ? S_OK : S_FALSE; + } + + JUCE_COMRESULT Seek (LARGE_INTEGER position, DWORD origin, ULARGE_INTEGER* resultPosition) + { + int64 newPos = (int64) position.QuadPart; + + if (origin == STREAM_SEEK_CUR) + { + newPos += source.getPosition(); + } + else if (origin == STREAM_SEEK_END) + { + const int64 len = source.getTotalLength(); + if (len < 0) + return E_NOTIMPL; + + newPos += len; + } + + if (resultPosition != nullptr) + resultPosition->QuadPart = newPos; + + return source.setPosition (newPos) ? S_OK : E_NOTIMPL; + } + + JUCE_COMRESULT CopyTo (IStream* destStream, ULARGE_INTEGER numBytesToDo, + ULARGE_INTEGER* bytesRead, ULARGE_INTEGER* bytesWritten) + { + uint64 totalCopied = 0; + int64 numBytes = numBytesToDo.QuadPart; + + while (numBytes > 0 && ! source.isExhausted()) + { + char buffer [1024]; + + const int numToCopy = (int) jmin ((int64) sizeof (buffer), (int64) numBytes); + const int numRead = source.read (buffer, numToCopy); + + if (numRead <= 0) + break; + + destStream->Write (buffer, numRead, nullptr); + totalCopied += numRead; + } + + if (bytesRead != nullptr) bytesRead->QuadPart = totalCopied; + if (bytesWritten != nullptr) bytesWritten->QuadPart = totalCopied; + + return S_OK; + } + + JUCE_COMRESULT Stat (STATSTG* stat, DWORD) + { + if (stat == nullptr) + return STG_E_INVALIDPOINTER; + + zerostruct (*stat); + stat->type = STGTY_STREAM; + stat->cbSize.QuadPart = jmax ((int64) 0, source.getTotalLength()); + return S_OK; + } + +private: + InputStream& source; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceIStream) +}; + +//============================================================================== +static const char* wmFormatName = "Windows Media"; +static const char* const extensions[] = { ".mp3", ".wmv", ".asf", ".wm", ".wma", 0 }; + +//============================================================================== +class WMAudioReader : public AudioFormatReader +{ +public: + WMAudioReader (InputStream* const input_) + : AudioFormatReader (input_, TRANS (wmFormatName)), + wmvCoreLib ("Wmvcore.dll") + { + JUCE_LOAD_WINAPI_FUNCTION (wmvCoreLib, WMCreateSyncReader, wmCreateSyncReader, + HRESULT, (IUnknown*, DWORD, IWMSyncReader**)) + + if (wmCreateSyncReader != nullptr) + { + checkCoInitialiseCalled(); + + HRESULT hr = wmCreateSyncReader (nullptr, WMT_RIGHT_PLAYBACK, wmSyncReader.resetAndGetPointerAddress()); + + if (SUCCEEDED (hr)) + hr = wmSyncReader->OpenStream (new JuceIStream (*input)); + + if (SUCCEEDED (hr)) + { + WORD streamNum = 1; + hr = wmSyncReader->GetStreamNumberForOutput (0, &streamNum); + hr = wmSyncReader->SetReadStreamSamples (streamNum, false); + + scanFileForDetails(); + } + } + } + + ~WMAudioReader() + { + if (wmSyncReader != nullptr) + wmSyncReader->Close(); + } + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override + { + if (sampleRate <= 0) + return false; + + checkCoInitialiseCalled(); + + const int stride = numChannels * sizeof (int16); + + while (numSamples > 0) + { + if (! bufferedRange.contains (startSampleInFile)) + { + const bool hasJumped = (startSampleInFile != bufferedRange.getEnd()); + + if (hasJumped) + wmSyncReader->SetRange ((QWORD) (startSampleInFile * 10000000 / (int64) sampleRate), 0); + + ComSmartPtr sampleBuffer; + QWORD sampleTime, duration; + DWORD flags, outputNum; + WORD streamNum; + + HRESULT hr = wmSyncReader->GetNextSample (1, sampleBuffer.resetAndGetPointerAddress(), + &sampleTime, &duration, &flags, &outputNum, &streamNum); + + if (sampleBuffer != nullptr) + { + BYTE* rawData = nullptr; + DWORD dataLength = 0; + hr = sampleBuffer->GetBufferAndLength (&rawData, &dataLength); + + if (dataLength == 0) + return false; + + if (hasJumped) + bufferedRange.setStart ((int64) ((sampleTime * (int64) sampleRate) / 10000000)); + else + bufferedRange.setStart (bufferedRange.getEnd()); // (because the positions returned often aren't continguous) + + bufferedRange.setLength ((int64) (dataLength / stride)); + + buffer.ensureSize ((int) dataLength); + memcpy (buffer.getData(), rawData, (size_t) dataLength); + } + else if (hr == NS_E_NO_MORE_SAMPLES) + { + bufferedRange.setStart (startSampleInFile); + bufferedRange.setLength (256); + buffer.ensureSize (256 * stride); + buffer.fillWith (0); + } + else + { + return false; + } + } + + const int offsetInBuffer = (int) (startSampleInFile - bufferedRange.getStart()); + const int16* const rawData = static_cast (addBytesToPointer (buffer.getData(), offsetInBuffer * stride)); + const int numToDo = jmin (numSamples, (int) (bufferedRange.getLength() - offsetInBuffer)); + + for (int i = 0; i < numDestChannels; ++i) + { + jassert (destSamples[i] != nullptr); + + const int srcChan = jmin (i, (int) numChannels - 1); + const int16* src = rawData + srcChan; + int* const dst = destSamples[i] + startOffsetInDestBuffer; + + for (int j = 0; j < numToDo; ++j) + { + dst[j] = ((uint32) *src) << 16; + src += numChannels; + } + } + + startSampleInFile += numToDo; + startOffsetInDestBuffer += numToDo; + numSamples -= numToDo; + } + + return true; + } + +private: + DynamicLibrary wmvCoreLib; + ComSmartPtr wmSyncReader; + MemoryBlock buffer; + Range bufferedRange; + + void checkCoInitialiseCalled() + { + CoInitialize (0); + } + + void scanFileForDetails() + { + ComSmartPtr wmHeaderInfo; + HRESULT hr = wmSyncReader.QueryInterface (wmHeaderInfo); + + if (SUCCEEDED (hr)) + { + QWORD lengthInNanoseconds = 0; + WORD lengthOfLength = sizeof (lengthInNanoseconds); + WORD streamNum = 0; + WMT_ATTR_DATATYPE wmAttrDataType; + hr = wmHeaderInfo->GetAttributeByName (&streamNum, L"Duration", &wmAttrDataType, + (BYTE*) &lengthInNanoseconds, &lengthOfLength); + + ComSmartPtr wmProfile; + hr = wmSyncReader.QueryInterface (wmProfile); + + if (SUCCEEDED (hr)) + { + ComSmartPtr wmStreamConfig; + hr = wmProfile->GetStream (0, wmStreamConfig.resetAndGetPointerAddress()); + + if (SUCCEEDED (hr)) + { + ComSmartPtr wmMediaProperties; + hr = wmStreamConfig.QueryInterface (wmMediaProperties); + + if (SUCCEEDED (hr)) + { + DWORD sizeMediaType; + hr = wmMediaProperties->GetMediaType (0, &sizeMediaType); + + HeapBlock mediaType; + mediaType.malloc (sizeMediaType, 1); + hr = wmMediaProperties->GetMediaType (mediaType, &sizeMediaType); + + if (mediaType->majortype == WMMEDIATYPE_Audio) + { + const WAVEFORMATEX* const inputFormat = reinterpret_cast (mediaType->pbFormat); + + sampleRate = inputFormat->nSamplesPerSec; + numChannels = inputFormat->nChannels; + bitsPerSample = inputFormat->wBitsPerSample; + lengthInSamples = (lengthInNanoseconds * (int) sampleRate) / 10000000; + } + } + } + } + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WMAudioReader) +}; + +} + +//============================================================================== +WindowsMediaAudioFormat::WindowsMediaAudioFormat() + : AudioFormat (TRANS (WindowsMediaCodec::wmFormatName), + StringArray (WindowsMediaCodec::extensions)) +{ +} + +WindowsMediaAudioFormat::~WindowsMediaAudioFormat() {} + +Array WindowsMediaAudioFormat::getPossibleSampleRates() { return Array(); } +Array WindowsMediaAudioFormat::getPossibleBitDepths() { return Array(); } + +bool WindowsMediaAudioFormat::canDoStereo() { return true; } +bool WindowsMediaAudioFormat::canDoMono() { return true; } +bool WindowsMediaAudioFormat::isCompressed() { return true; } + +//============================================================================== +AudioFormatReader* WindowsMediaAudioFormat::createReaderFor (InputStream* sourceStream, bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new WindowsMediaCodec::WMAudioReader (sourceStream)); + + if (r->sampleRate > 0) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +AudioFormatWriter* WindowsMediaAudioFormat::createWriterFor (OutputStream* /*streamToWriteTo*/, double /*sampleRateToUse*/, + unsigned int /*numberOfChannels*/, int /*bitsPerSample*/, + const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/) +{ + jassertfalse; // not yet implemented! + return nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h new file mode 100644 index 0000000000..8c10ee12da --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h @@ -0,0 +1,53 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_WINDOWS || DOXYGEN + +//============================================================================== +/** + Audio format which uses the Windows Media codecs (Windows only). +*/ +class WindowsMediaAudioFormat : public AudioFormat +{ +public: + //============================================================================== + WindowsMediaAudioFormat(); + ~WindowsMediaAudioFormat(); + + //============================================================================== + Array getPossibleSampleRates() override; + Array getPossibleBitDepths() override; + bool canDoStereo() override; + bool canDoMono() override; + bool isCompressed() override; + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; + + AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, + unsigned int numberOfChannels, int bitsPerSample, + const StringPairArray& metadataValues, int qualityOptionIndex) override; +}; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt new file mode 100644 index 0000000000..254dd52763 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt @@ -0,0 +1,47 @@ +===================================================================== + +I've incorporated Ogg-Vorbis directly into the Juce codebase because it makes +things much easier than having to make all your builds link correctly to +the appropriate libraries on every different platform. + +I've made minimal changes to the Ogg-Vorbis code - just tweaked a few include +paths to make it build smoothly, and added some headers to allow you to exclude +it from the build. + +===================================================================== + +The following license is the BSD-style license that comes with the +Ogg-Vorbis distribution, and which applies just to the header files I've +included in this directory. For more info, and to get the rest of the +distribution, visit the Ogg-Vorbis homepage: www.vorbis.com + +===================================================================== + +Copyright (c) 2002-2004 Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c new file mode 100644 index 0000000000..710a5604ca --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c @@ -0,0 +1,784 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: packing variable sized words into an octet stream + last mod: $Id: bitwise.c,v 1.1 2007/06/07 17:48:18 jules_rms Exp $ + + ********************************************************************/ + +/* We're 'LSb' endian; if we write a word but read individual bits, + then we'll read the lsb first */ + +#include +#include +#include "ogg.h" + +#define BUFFER_INCREMENT 256 + +static const unsigned long mask[]= +{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, + 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, + 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, + 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, + 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, + 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, + 0x3fffffff,0x7fffffff,0xffffffff }; + +static const unsigned int mask8B[]= +{0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; + +void oggpack_writeinit(oggpack_buffer *b){ + memset(b,0,sizeof(*b)); + b->ptr=b->buffer=(unsigned char*) _ogg_malloc(BUFFER_INCREMENT); + b->buffer[0]='\0'; + b->storage=BUFFER_INCREMENT; +} + +void oggpackB_writeinit(oggpack_buffer *b){ + oggpack_writeinit(b); +} + +void oggpack_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask[bits]; +} + +void oggpackB_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask8B[bits]; +} + +/* Takes only up to 32 bits. */ +void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ + if(b->endbyte+4>=b->storage){ + b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + b->storage+=BUFFER_INCREMENT; + b->ptr=b->buffer+b->endbyte; + } + + value&=mask[bits]; + bits+=b->endbit; + + b->ptr[0]|=value<endbit; + + if(bits>=8){ + b->ptr[1]=(unsigned char)(value>>(8-b->endbit)); + if(bits>=16){ + b->ptr[2]=(unsigned char)(value>>(16-b->endbit)); + if(bits>=24){ + b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); + else + b->ptr[4]=0; + } + } + } + } + + b->endbyte+=bits/8; + b->ptr+=bits/8; + b->endbit=bits&7; +} + +/* Takes only up to 32 bits. */ +void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ + if(b->endbyte+4>=b->storage){ + b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + b->storage+=BUFFER_INCREMENT; + b->ptr=b->buffer+b->endbyte; + } + + value=(value&mask[bits])<<(32-bits); + bits+=b->endbit; + + b->ptr[0]|=value>>(24+b->endbit); + + if(bits>=8){ + b->ptr[1]=(unsigned char)(value>>(16+b->endbit)); + if(bits>=16){ + b->ptr[2]=(unsigned char)(value>>(8+b->endbit)); + if(bits>=24){ + b->ptr[3]=(unsigned char)(value>>(b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); + else + b->ptr[4]=0; + } + } + } + } + + b->endbyte+=bits/8; + b->ptr+=bits/8; + b->endbit=bits&7; +} + +void oggpack_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpack_write(b,0,bits); +} + +void oggpackB_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpackB_write(b,0,bits); +} + +static void oggpack_writecopy_helper(oggpack_buffer *b, + void *source, + long bits, + void (*w)(oggpack_buffer *, + unsigned long, + int), + int msb){ + unsigned char *ptr=(unsigned char *)source; + + long bytes=bits/8; + bits-=bytes*8; + + if(b->endbit){ + int i; + /* unaligned copy. Do it the hard way. */ + for(i=0;iendbyte+bytes+1>=b->storage){ + b->storage=b->endbyte+bytes+BUFFER_INCREMENT; + b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage); + b->ptr=b->buffer+b->endbyte; + } + + memmove(b->ptr,source,bytes); + b->ptr+=bytes; + b->endbyte+=bytes; + *b->ptr=0; + + } + if(bits){ + if(msb) + w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits); + else + w(b,(unsigned long)(ptr[bytes]),bits); + } +} + +void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ + oggpack_writecopy_helper(b,source,bits,oggpack_write,0); +} + +void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ + oggpack_writecopy_helper(b,source,bits,oggpackB_write,1); +} + +void oggpack_reset(oggpack_buffer *b){ + b->ptr=b->buffer; + b->buffer[0]=0; + b->endbit=b->endbyte=0; +} + +void oggpackB_reset(oggpack_buffer *b){ + oggpack_reset(b); +} + +void oggpack_writeclear(oggpack_buffer *b){ + _ogg_free(b->buffer); + memset(b,0,sizeof(*b)); +} + +void oggpackB_writeclear(oggpack_buffer *b){ + oggpack_writeclear(b); +} + +void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ + memset(b,0,sizeof(*b)); + b->buffer=b->ptr=buf; + b->storage=bytes; +} + +void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ + oggpack_readinit(b,buf,bytes); +} + +/* Read in bits without advancing the bitptr; bits <= 32 */ +long oggpack_look(oggpack_buffer *b,int bits){ + unsigned long ret; + unsigned long m=mask[bits]; + + bits+=b->endbit; + + if(b->endbyte+4>=b->storage){ + /* not the main path */ + if(b->endbyte*8+bits>b->storage*8)return(-1); + } + + ret=b->ptr[0]>>b->endbit; + if(bits>8){ + ret|=b->ptr[1]<<(8-b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(16-b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]<<(32-b->endbit); + } + } + } + return(m&ret); +} + +/* Read in bits without advancing the bitptr; bits <= 32 */ +long oggpackB_look(oggpack_buffer *b,int bits){ + unsigned long ret; + int m=32-bits; + + bits+=b->endbit; + + if(b->endbyte+4>=b->storage){ + /* not the main path */ + if(b->endbyte*8+bits>b->storage*8)return(-1); + } + + ret=b->ptr[0]<<(24+b->endbit); + if(bits>8){ + ret|=b->ptr[1]<<(16+b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(8+b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); + } + } + } + return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1); +} + +long oggpack_look1(oggpack_buffer *b){ + if(b->endbyte>=b->storage)return(-1); + return((b->ptr[0]>>b->endbit)&1); +} + +long oggpackB_look1(oggpack_buffer *b){ + if(b->endbyte>=b->storage)return(-1); + return((b->ptr[0]>>(7-b->endbit))&1); +} + +void oggpack_adv(oggpack_buffer *b,int bits){ + bits+=b->endbit; + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; +} + +void oggpackB_adv(oggpack_buffer *b,int bits){ + oggpack_adv(b,bits); +} + +void oggpack_adv1(oggpack_buffer *b){ + if(++(b->endbit)>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } +} + +void oggpackB_adv1(oggpack_buffer *b){ + oggpack_adv1(b); +} + +/* bits <= 32 */ +long oggpack_read(oggpack_buffer *b,int bits){ + long ret; + unsigned long m=mask[bits]; + + bits+=b->endbit; + + if(b->endbyte+4>=b->storage){ + /* not the main path */ + ret=-1L; + if(b->endbyte*8+bits>b->storage*8)goto overflow; + } + + ret=b->ptr[0]>>b->endbit; + if(bits>8){ + ret|=b->ptr[1]<<(8-b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(16-b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit){ + ret|=b->ptr[4]<<(32-b->endbit); + } + } + } + } + ret&=m; + + overflow: + + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return(ret); +} + +/* bits <= 32 */ +long oggpackB_read(oggpack_buffer *b,int bits){ + long ret; + long m=32-bits; + + bits+=b->endbit; + + if(b->endbyte+4>=b->storage){ + /* not the main path */ + ret=-1L; + if(b->endbyte*8+bits>b->storage*8)goto overflow; + } + + ret=b->ptr[0]<<(24+b->endbit); + if(bits>8){ + ret|=b->ptr[1]<<(16+b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(8+b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); + } + } + } + ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1); + + overflow: + + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return(ret); +} + +long oggpack_read1(oggpack_buffer *b){ + long ret; + + if(b->endbyte>=b->storage){ + /* not the main path */ + ret=-1L; + goto overflow; + } + + ret=(b->ptr[0]>>b->endbit)&1; + + overflow: + + b->endbit++; + if(b->endbit>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } + return(ret); +} + +long oggpackB_read1(oggpack_buffer *b){ + long ret; + + if(b->endbyte>=b->storage){ + /* not the main path */ + ret=-1L; + goto overflow; + } + + ret=(b->ptr[0]>>(7-b->endbit))&1; + + overflow: + + b->endbit++; + if(b->endbit>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } + return(ret); +} + +long oggpack_bytes(oggpack_buffer *b){ + return(b->endbyte+(b->endbit+7)/8); +} + +long oggpack_bits(oggpack_buffer *b){ + return(b->endbyte*8+b->endbit); +} + +long oggpackB_bytes(oggpack_buffer *b){ + return oggpack_bytes(b); +} + +long oggpackB_bits(oggpack_buffer *b){ + return oggpack_bits(b); +} + +unsigned char *oggpack_get_buffer(oggpack_buffer *b){ + return(b->buffer); +} + +unsigned char *oggpackB_get_buffer(oggpack_buffer *b){ + return oggpack_get_buffer(b); +} + +/* Self test of the bitwise routines; everything else is based on + them, so they damned well better be solid. */ + +#ifdef _V_SELFTEST +#include + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +oggpack_buffer o; +oggpack_buffer r; + +void report(char *in){ + fprintf(stderr,"%s",in); + exit(1); +} + +void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ + long bytes,i; + unsigned char *buffer; + + oggpack_reset(&o); + for(i=0;i +#include +#include "ogg.h" + +/* A complete description of Ogg framing exists in docs/framing.html */ + +int ogg_page_version(ogg_page *og){ + return((int)(og->header[4])); +} + +int ogg_page_continued(ogg_page *og){ + return((int)(og->header[5]&0x01)); +} + +int ogg_page_bos(ogg_page *og){ + return((int)(og->header[5]&0x02)); +} + +int ogg_page_eos(ogg_page *og){ + return((int)(og->header[5]&0x04)); +} + +ogg_int64_t ogg_page_granulepos(ogg_page *og){ + unsigned char *page=og->header; + ogg_int64_t granulepos=page[13]&(0xff); + granulepos= (granulepos<<8)|(page[12]&0xff); + granulepos= (granulepos<<8)|(page[11]&0xff); + granulepos= (granulepos<<8)|(page[10]&0xff); + granulepos= (granulepos<<8)|(page[9]&0xff); + granulepos= (granulepos<<8)|(page[8]&0xff); + granulepos= (granulepos<<8)|(page[7]&0xff); + granulepos= (granulepos<<8)|(page[6]&0xff); + return(granulepos); +} + +int ogg_page_serialno(ogg_page *og){ + return(og->header[14] | + (og->header[15]<<8) | + (og->header[16]<<16) | + (og->header[17]<<24)); +} + +long ogg_page_pageno(ogg_page *og){ + return(og->header[18] | + (og->header[19]<<8) | + (og->header[20]<<16) | + (og->header[21]<<24)); +} + + + +/* returns the number of packets that are completed on this page (if + the leading packet is begun on a previous page, but ends on this + page, it's counted */ + +/* NOTE: +If a page consists of a packet begun on a previous page, and a new +packet begun (but not completed) on this page, the return will be: + ogg_page_packets(page) ==1, + ogg_page_continued(page) !=0 + +If a page happens to be a single packet that was begun on a +previous page, and spans to the next page (in the case of a three or +more page packet), the return will be: + ogg_page_packets(page) ==0, + ogg_page_continued(page) !=0 +*/ + +int ogg_page_packets(ogg_page *og){ + int i,n=og->header[26],count=0; + for(i=0;iheader[27+i]<255)count++; + return(count); +} + + +#if 0 +/* helper to initialize lookup for direct-table CRC (illustrative; we + use the static init below) */ + +static ogg_uint32_t _ogg_crc_entry(unsigned long index){ + int i; + unsigned long r; + + r = index << 24; + for (i=0; i<8; i++) + if (r & 0x80000000UL) + r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator + polynomial, although we use an + unreflected alg and an init/final + of 0, not 0xffffffff */ + else + r<<=1; + return (r & 0xffffffffUL); +} +#endif + +static const ogg_uint32_t crc_lookup[256]={ + 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, + 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, + 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, + 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, + 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9, + 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, + 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011, + 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, + 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039, + 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, + 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81, + 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, + 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49, + 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, + 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1, + 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, + 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae, + 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, + 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16, + 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, + 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde, + 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, + 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066, + 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, + 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e, + 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, + 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6, + 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, + 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e, + 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, + 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686, + 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, + 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637, + 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, + 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f, + 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, + 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47, + 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, + 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff, + 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, + 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7, + 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, + 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f, + 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, + 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7, + 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, + 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f, + 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, + 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640, + 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, + 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8, + 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, + 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30, + 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, + 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088, + 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, + 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0, + 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, + 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18, + 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, + 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0, + 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, + 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668, + 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4}; + +/* init the encode/decode logical stream state */ + +int ogg_stream_init(ogg_stream_state *os,int serialno){ + if(os){ + memset(os,0,sizeof(*os)); + os->body_storage=16*1024; + os->body_data=(unsigned char*) _ogg_malloc(os->body_storage*sizeof(*os->body_data)); + + os->lacing_storage=1024; + os->lacing_vals=(int*) _ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); + os->granule_vals=(ogg_int64_t*) _ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); + + os->serialno=serialno; + + return(0); + } + return(-1); +} + +/* _clear does not free os, only the non-flat storage within */ +int ogg_stream_clear(ogg_stream_state *os){ + if(os){ + if(os->body_data)_ogg_free(os->body_data); + if(os->lacing_vals)_ogg_free(os->lacing_vals); + if(os->granule_vals)_ogg_free(os->granule_vals); + + memset(os,0,sizeof(*os)); + } + return(0); +} + +int ogg_stream_destroy(ogg_stream_state *os){ + if(os){ + ogg_stream_clear(os); + _ogg_free(os); + } + return(0); +} + +/* Helpers for ogg_stream_encode; this keeps the structure and + what's happening fairly clear */ + +static void _os_body_expand(ogg_stream_state *os,int needed){ + if(os->body_storage<=os->body_fill+needed){ + os->body_storage+=(needed+1024); + os->body_data=(unsigned char*) _ogg_realloc(os->body_data,os->body_storage*sizeof(*os->body_data)); + } +} + +static void _os_lacing_expand(ogg_stream_state *os,int needed){ + if(os->lacing_storage<=os->lacing_fill+needed){ + os->lacing_storage+=(needed+32); + os->lacing_vals=(int*)_ogg_realloc(os->lacing_vals,os->lacing_storage*sizeof(*os->lacing_vals)); + os->granule_vals=(ogg_int64_t*)_ogg_realloc(os->granule_vals,os->lacing_storage*sizeof(*os->granule_vals)); + } +} + +/* checksum the page */ +/* Direct table CRC; note that this will be faster in the future if we + perform the checksum silmultaneously with other copies */ + +void ogg_page_checksum_set(ogg_page *og){ + if(og){ + ogg_uint32_t crc_reg=0; + int i; + + /* safety; needed for API behavior, but not framing code */ + og->header[22]=0; + og->header[23]=0; + og->header[24]=0; + og->header[25]=0; + + for(i=0;iheader_len;i++) + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->header[i]]; + for(i=0;ibody_len;i++) + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->body[i]]; + + og->header[22]=(unsigned char)(crc_reg&0xff); + og->header[23]=(unsigned char)((crc_reg>>8)&0xff); + og->header[24]=(unsigned char)((crc_reg>>16)&0xff); + og->header[25]=(unsigned char)((crc_reg>>24)&0xff); + } +} + +/* submit data to the internal buffer of the framing engine */ +int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ + int lacing_vals=op->bytes/255+1,i; + + if(os->body_returned){ + /* advance packet data according to the body_returned pointer. We + had to keep it around to return a pointer into the buffer last + call */ + + os->body_fill-=os->body_returned; + if(os->body_fill) + memmove(os->body_data,os->body_data+os->body_returned, + os->body_fill); + os->body_returned=0; + } + + /* make sure we have the buffer storage */ + _os_body_expand(os,op->bytes); + _os_lacing_expand(os,lacing_vals); + + /* Copy in the submitted packet. Yes, the copy is a waste; this is + the liability of overly clean abstraction for the time being. It + will actually be fairly easy to eliminate the extra copy in the + future */ + + memcpy(os->body_data+os->body_fill,op->packet,op->bytes); + os->body_fill+=op->bytes; + + /* Store lacing vals for this packet */ + for(i=0;ilacing_vals[os->lacing_fill+i]=255; + os->granule_vals[os->lacing_fill+i]=os->granulepos; + } + os->lacing_vals[os->lacing_fill+i]=(op->bytes)%255; + os->granulepos=os->granule_vals[os->lacing_fill+i]=op->granulepos; + + /* flag the first segment as the beginning of the packet */ + os->lacing_vals[os->lacing_fill]|= 0x100; + + os->lacing_fill+=lacing_vals; + + /* for the sake of completeness */ + os->packetno++; + + if(op->e_o_s)os->e_o_s=1; + + return(0); +} + +/* This will flush remaining packets into a page (returning nonzero), + even if there is not enough data to trigger a flush normally + (undersized page). If there are no packets or partial packets to + flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will + try to flush a normal sized page like ogg_stream_pageout; a call to + ogg_stream_flush does not guarantee that all packets have flushed. + Only a return value of 0 from ogg_stream_flush indicates all packet + data is flushed into pages. + + since ogg_stream_flush will flush the last page in a stream even if + it's undersized, you almost certainly want to use ogg_stream_pageout + (and *not* ogg_stream_flush) unless you specifically need to flush + an page regardless of size in the middle of a stream. */ + +int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ + int i; + int vals=0; + int maxvals=(os->lacing_fill>255?255:os->lacing_fill); + int bytes=0; + long acc=0; + ogg_int64_t granule_pos=-1; + + if(maxvals==0)return(0); + + /* construct a page */ + /* decide how many segments to include */ + + /* If this is the initial header case, the first page must only include + the initial header packet */ + if(os->b_o_s==0){ /* 'initial header page' case */ + granule_pos=0; + for(vals=0;valslacing_vals[vals]&0x0ff)<255){ + vals++; + break; + } + } + }else{ + for(vals=0;vals4096)break; + acc+=os->lacing_vals[vals]&0x0ff; + if((os->lacing_vals[vals]&0xff)<255) + granule_pos=os->granule_vals[vals]; + } + } + + /* construct the header in temp storage */ + memcpy(os->header,"OggS",4); + + /* stream structure version */ + os->header[4]=0x00; + + /* continued packet flag? */ + os->header[5]=0x00; + if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; + /* first page flag? */ + if(os->b_o_s==0)os->header[5]|=0x02; + /* last page flag? */ + if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; + os->b_o_s=1; + + /* 64 bits of PCM position */ + for(i=6;i<14;i++){ + os->header[i]=(unsigned char)(granule_pos&0xff); + granule_pos>>=8; + } + + /* 32 bits of stream serial number */ + { + long serialno=os->serialno; + for(i=14;i<18;i++){ + os->header[i]=(unsigned char)(serialno&0xff); + serialno>>=8; + } + } + + /* 32 bits of page counter (we have both counter and page header + because this val can roll over) */ + if(os->pageno==-1)os->pageno=0; /* because someone called + stream_reset; this would be a + strange thing to do in an + encode stream, but it has + plausible uses */ + { + long pageno=os->pageno++; + for(i=18;i<22;i++){ + os->header[i]=(unsigned char)(pageno&0xff); + pageno>>=8; + } + } + + /* zero for computation; filled in later */ + os->header[22]=0; + os->header[23]=0; + os->header[24]=0; + os->header[25]=0; + + /* segment table */ + os->header[26]=(unsigned char)(vals&0xff); + for(i=0;iheader[i+27]=(unsigned char)(os->lacing_vals[i]&0xff); + + /* set pointers in the ogg_page struct */ + og->header=os->header; + og->header_len=os->header_fill=vals+27; + og->body=os->body_data+os->body_returned; + og->body_len=bytes; + + /* advance the lacing data and set the body_returned pointer */ + + os->lacing_fill-=vals; + memmove(os->lacing_vals,os->lacing_vals+vals,os->lacing_fill*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+vals,os->lacing_fill*sizeof(*os->granule_vals)); + os->body_returned+=bytes; + + /* calculate the checksum */ + + ogg_page_checksum_set(og); + + /* done */ + return(1); +} + + +/* This constructs pages from buffered packet segments. The pointers +returned are to static buffers; do not free. The returned buffers are +good only until the next call (using the same ogg_stream_state) */ + +int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ + + if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ + os->body_fill-os->body_returned > 4096 ||/* 'page nominal size' case */ + os->lacing_fill>=255 || /* 'segment table full' case */ + (os->lacing_fill&&!os->b_o_s)){ /* 'initial header page' case */ + + return(ogg_stream_flush(os,og)); + } + + /* not enough data to construct a page and not end of stream */ + return(0); +} + +int ogg_stream_eos(ogg_stream_state *os){ + return os->e_o_s; +} + +/* DECODING PRIMITIVES: packet streaming layer **********************/ + +/* This has two layers to place more of the multi-serialno and paging + control in the application's hands. First, we expose a data buffer + using ogg_sync_buffer(). The app either copies into the + buffer, or passes it directly to read(), etc. We then call + ogg_sync_wrote() to tell how many bytes we just added. + + Pages are returned (pointers into the buffer in ogg_sync_state) + by ogg_sync_pageout(). The page is then submitted to + ogg_stream_pagein() along with the appropriate + ogg_stream_state* (ie, matching serialno). We then get raw + packets out calling ogg_stream_packetout() with a + ogg_stream_state. */ + +/* initialize the struct to a known state */ +int ogg_sync_init(ogg_sync_state *oy){ + if(oy){ + memset(oy,0,sizeof(*oy)); + } + return(0); +} + +/* clear non-flat storage within */ +int ogg_sync_clear(ogg_sync_state *oy){ + if(oy){ + if(oy->data)_ogg_free(oy->data); + ogg_sync_init(oy); + } + return(0); +} + +int ogg_sync_destroy(ogg_sync_state *oy){ + if(oy){ + ogg_sync_clear(oy); + _ogg_free(oy); + } + return(0); +} + +char *ogg_sync_buffer(ogg_sync_state *oy, long size){ + + /* first, clear out any space that has been previously returned */ + if(oy->returned){ + oy->fill-=oy->returned; + if(oy->fill>0) + memmove(oy->data,oy->data+oy->returned,oy->fill); + oy->returned=0; + } + + if(size>oy->storage-oy->fill){ + /* We need to extend the internal buffer */ + long newsize=size+oy->fill+4096; /* an extra page to be nice */ + + if(oy->data) + oy->data=(unsigned char*) _ogg_realloc(oy->data,newsize); + else + oy->data=(unsigned char*) _ogg_malloc(newsize); + oy->storage=newsize; + } + + /* expose a segment at least as large as requested at the fill mark */ + return((char *)oy->data+oy->fill); +} + +int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ + if(oy->fill+bytes>oy->storage)return(-1); + oy->fill+=bytes; + return(0); +} + +/* sync the stream. This is meant to be useful for finding page + boundaries. + + return values for this: + -n) skipped n bytes + 0) page not ready; more data (no bytes skipped) + n) page synced at current location; page length n bytes + +*/ + +long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ + unsigned char *page=oy->data+oy->returned; + unsigned char *next; + long bytes=oy->fill-oy->returned; + + if(oy->headerbytes==0){ + int headerbytes,i; + if(bytes<27)return(0); /* not enough for a header */ + + /* verify capture pattern */ + if(memcmp(page,"OggS",4))goto sync_fail; + + headerbytes=page[26]+27; + if(bytesbodybytes+=page[27+i]; + oy->headerbytes=headerbytes; + } + + if(oy->bodybytes+oy->headerbytes>bytes)return(0); + + /* The whole test page is buffered. Verify the checksum */ + { + /* Grab the checksum bytes, set the header field to zero */ + char chksum[4]; + ogg_page log; + + memcpy(chksum,page+22,4); + memset(page+22,0,4); + + /* set up a temp page struct and recompute the checksum */ + log.header=page; + log.header_len=oy->headerbytes; + log.body=page+oy->headerbytes; + log.body_len=oy->bodybytes; + ogg_page_checksum_set(&log); + + /* Compare */ + if(memcmp(chksum,page+22,4)){ + /* D'oh. Mismatch! Corrupt page (or miscapture and not a page + at all) */ + /* replace the computed checksum with the one actually read in */ + memcpy(page+22,chksum,4); + + /* Bad checksum. Lose sync */ + goto sync_fail; + } + } + + /* yes, have a whole page all ready to go */ + { + unsigned char *page=oy->data+oy->returned; + long bytes; + + if(og){ + og->header=page; + og->header_len=oy->headerbytes; + og->body=page+oy->headerbytes; + og->body_len=oy->bodybytes; + } + + oy->unsynced=0; + oy->returned+=(bytes=oy->headerbytes+oy->bodybytes); + oy->headerbytes=0; + oy->bodybytes=0; + return(bytes); + } + + sync_fail: + + oy->headerbytes=0; + oy->bodybytes=0; + + /* search for possible capture */ + next=(unsigned char*)memchr(page+1,'O',bytes-1); + if(!next) + next=oy->data+oy->fill; + + oy->returned=next-oy->data; + return(-(next-page)); +} + +/* sync the stream and get a page. Keep trying until we find a page. + Supress 'sync errors' after reporting the first. + + return values: + -1) recapture (hole in data) + 0) need more data + 1) page returned + + Returns pointers into buffered data; invalidated by next call to + _stream, _clear, _init, or _buffer */ + +int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ + + /* all we need to do is verify a page at the head of the stream + buffer. If it doesn't verify, we look for the next potential + frame */ + + for(;;){ + long ret=ogg_sync_pageseek(oy,og); + if(ret>0){ + /* have a page */ + return(1); + } + if(ret==0){ + /* need more data */ + return(0); + } + + /* head did not start a synced page... skipped some bytes */ + if(!oy->unsynced){ + oy->unsynced=1; + return(-1); + } + + /* loop. keep looking */ + + } +} + +/* add the incoming page to the stream state; we decompose the page + into packet segments here as well. */ + +int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ + unsigned char *header=og->header; + unsigned char *body=og->body; + long bodysize=og->body_len; + int segptr=0; + + int version=ogg_page_version(og); + int continued=ogg_page_continued(og); + int bos=ogg_page_bos(og); + int eos=ogg_page_eos(og); + ogg_int64_t granulepos=ogg_page_granulepos(og); + int serialno=ogg_page_serialno(og); + long pageno=ogg_page_pageno(og); + int segments=header[26]; + + /* clean up 'returned data' */ + { + long lr=os->lacing_returned; + long br=os->body_returned; + + /* body data */ + if(br){ + os->body_fill-=br; + if(os->body_fill) + memmove(os->body_data,os->body_data+br,os->body_fill); + os->body_returned=0; + } + + if(lr){ + /* segment table */ + if(os->lacing_fill-lr){ + memmove(os->lacing_vals,os->lacing_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->granule_vals)); + } + os->lacing_fill-=lr; + os->lacing_packet-=lr; + os->lacing_returned=0; + } + } + + /* check the serial number */ + if(serialno!=os->serialno)return(-1); + if(version>0)return(-1); + + _os_lacing_expand(os,segments+1); + + /* are we in sequence? */ + if(pageno!=os->pageno){ + int i; + + /* unroll previous partial packet (if any) */ + for(i=os->lacing_packet;ilacing_fill;i++) + os->body_fill-=os->lacing_vals[i]&0xff; + os->lacing_fill=os->lacing_packet; + + /* make a note of dropped data in segment table */ + if(os->pageno!=-1){ + os->lacing_vals[os->lacing_fill++]=0x400; + os->lacing_packet++; + } + } + + /* are we a 'continued packet' page? If so, we may need to skip + some segments */ + if(continued){ + if(os->lacing_fill<1 || + os->lacing_vals[os->lacing_fill-1]==0x400){ + bos=0; + for(;segptrbody_data+os->body_fill,body,bodysize); + os->body_fill+=bodysize; + } + + { + int saved=-1; + while(segptrlacing_vals[os->lacing_fill]=val; + os->granule_vals[os->lacing_fill]=-1; + + if(bos){ + os->lacing_vals[os->lacing_fill]|=0x100; + bos=0; + } + + if(val<255)saved=os->lacing_fill; + + os->lacing_fill++; + segptr++; + + if(val<255)os->lacing_packet=os->lacing_fill; + } + + /* set the granulepos on the last granuleval of the last full packet */ + if(saved!=-1){ + os->granule_vals[saved]=granulepos; + } + + } + + if(eos){ + os->e_o_s=1; + if(os->lacing_fill>0) + os->lacing_vals[os->lacing_fill-1]|=0x200; + } + + os->pageno=pageno+1; + + return(0); +} + +/* clear things to an initial state. Good to call, eg, before seeking */ +int ogg_sync_reset(ogg_sync_state *oy){ + oy->fill=0; + oy->returned=0; + oy->unsynced=0; + oy->headerbytes=0; + oy->bodybytes=0; + return(0); +} + +int ogg_stream_reset(ogg_stream_state *os){ + os->body_fill=0; + os->body_returned=0; + + os->lacing_fill=0; + os->lacing_packet=0; + os->lacing_returned=0; + + os->header_fill=0; + + os->e_o_s=0; + os->b_o_s=0; + os->pageno=-1; + os->packetno=0; + os->granulepos=0; + + return(0); +} + +int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ + ogg_stream_reset(os); + os->serialno=serialno; + return(0); +} + +static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ + + /* The last part of decode. We have the stream broken into packet + segments. Now we need to group them into packets (or return the + out of sync markers) */ + + int ptr=os->lacing_returned; + + if(os->lacing_packet<=ptr)return(0); + + if(os->lacing_vals[ptr]&0x400){ + /* we need to tell the codec there's a gap; it might need to + handle previous packet dependencies. */ + os->lacing_returned++; + os->packetno++; + return(-1); + } + + if(!op && !adv)return(1); /* just using peek as an inexpensive way + to ask if there's a whole packet + waiting */ + + /* Gather the whole packet. We'll have no holes or a partial packet */ + { + int size=os->lacing_vals[ptr]&0xff; + int bytes=size; + int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ + int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ + + while(size==255){ + int val=os->lacing_vals[++ptr]; + size=val&0xff; + if(val&0x200)eos=0x200; + bytes+=size; + } + + if(op){ + op->e_o_s=eos; + op->b_o_s=bos; + op->packet=os->body_data+os->body_returned; + op->packetno=os->packetno; + op->granulepos=os->granule_vals[ptr]; + op->bytes=bytes; + } + + if(adv){ + os->body_returned+=bytes; + os->lacing_returned=ptr+1; + os->packetno++; + } + } + return(1); +} + +int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ + return _packetout(os,op,1); +} + +int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ + return _packetout(os,op,0); +} + +void ogg_packet_clear(ogg_packet *op) { + _ogg_free(op->packet); + memset(op, 0, sizeof(*op)); +} + +#ifdef _V_SELFTEST +#include + +ogg_stream_state os_en, os_de; +ogg_sync_state oy; + +void checkpacket(ogg_packet *op,int len, int no, int pos){ + long j; + static int sequence=0; + static int lastno=0; + + if(op->bytes!=len){ + fprintf(stderr,"incorrect packet length!\n"); + exit(1); + } + if(op->granulepos!=pos){ + fprintf(stderr,"incorrect packet position!\n"); + exit(1); + } + + /* packet number just follows sequence/gap; adjust the input number + for that */ + if(no==0){ + sequence=0; + }else{ + sequence++; + if(no>lastno+1) + sequence++; + } + lastno=no; + if(op->packetno!=sequence){ + fprintf(stderr,"incorrect packet sequence %ld != %d\n", + (long)(op->packetno),sequence); + exit(1); + } + + /* Test data */ + for(j=0;jbytes;j++) + if(op->packet[j]!=((j+no)&0xff)){ + fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", + j,op->packet[j],(j+no)&0xff); + exit(1); + } +} + +void check_page(unsigned char *data,const int *header,ogg_page *og){ + long j; + /* Test data */ + for(j=0;jbody_len;j++) + if(og->body[j]!=data[j]){ + fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", + j,data[j],og->body[j]); + exit(1); + } + + /* Test header */ + for(j=0;jheader_len;j++){ + if(og->header[j]!=header[j]){ + fprintf(stderr,"header content mismatch at pos %ld:\n",j); + for(j=0;jheader[j]); + fprintf(stderr,"\n"); + exit(1); + } + } + if(og->header_len!=header[26]+27){ + fprintf(stderr,"header length incorrect! (%ld!=%d)\n", + og->header_len,header[26]+27); + exit(1); + } +} + +void print_header(ogg_page *og){ + int j; + fprintf(stderr,"\nHEADER:\n"); + fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", + og->header[0],og->header[1],og->header[2],og->header[3], + (int)og->header[4],(int)og->header[5]); + + fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", + (og->header[9]<<24)|(og->header[8]<<16)| + (og->header[7]<<8)|og->header[6], + (og->header[17]<<24)|(og->header[16]<<16)| + (og->header[15]<<8)|og->header[14], + ((long)(og->header[21])<<24)|(og->header[20]<<16)| + (og->header[19]<<8)|og->header[18]); + + fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", + (int)og->header[22],(int)og->header[23], + (int)og->header[24],(int)og->header[25], + (int)og->header[26]); + + for(j=27;jheader_len;j++) + fprintf(stderr,"%d ",(int)og->header[j]); + fprintf(stderr,")\n\n"); +} + +void copy_page(ogg_page *og){ + unsigned char *temp=_ogg_malloc(og->header_len); + memcpy(temp,og->header,og->header_len); + og->header=temp; + + temp=_ogg_malloc(og->body_len); + memcpy(temp,og->body,og->body_len); + og->body=temp; +} + +void free_page(ogg_page *og){ + _ogg_free (og->header); + _ogg_free (og->body); +} + +void error(void){ + fprintf(stderr,"error!\n"); + exit(1); +} + +/* 17 only */ +const int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x15,0xed,0xec,0x91, + 1, + 17}; + +/* 17, 254, 255, 256, 500, 510, 600 byte, pad */ +const int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x59,0x10,0x6c,0x2c, + 1, + 17}; +const int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x89,0x33,0x85,0xce, + 13, + 254,255,0,255,1,255,245,255,255,0, + 255,255,90}; + +/* nil packets; beginning,middle,end */ +const int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; +const int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x5c,0x3f,0x66,0xcb, + 17, + 17,254,255,0,0,255,1,0,255,245,255,255,0, + 255,255,90,0}; + +/* large initial packet */ +const int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x01,0x27,0x31,0xaa, + 18, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10}; + +const int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x7f,0x4e,0x8a,0xd2, + 4, + 255,4,255,0}; + + +/* continuing packet test */ +const int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x54,0x05,0x51,0xc8, + 17, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255}; + +const int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xc8,0xc3,0xcb,0xed, + 5, + 10,255,4,255,0}; + + +/* page with the 255 segment limit */ +const int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xed,0x2a,0x2e,0xa7, + 255, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10}; + +const int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x6c,0x3b,0x82,0x3d, + 1, + 50}; + + +/* packet that overspans over an entire page */ +const int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x3c,0xd9,0x4d,0x3f, + 17, + 100,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255}; + +const int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x01,0xd2,0xe5,0xe5, + 17, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255}; + +const int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,3,0,0,0, + 0xef,0xdd,0x88,0xde, + 7, + 255,255,75,255,4,255,0}; + +/* packet that overspans over an entire page */ +const int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x3c,0xd9,0x4d,0x3f, + 17, + 100,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255}; + +const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xd4,0xe0,0x60,0xe5, + 1,0}; + +void test_pack(const int *pl, const int **headers, int byteskip, + int pageskip, int packetskip){ + unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ + long inptr=0; + long outptr=0; + long deptr=0; + long depacket=0; + long granule_pos=7,pageno=0; + int i,j,packets,pageout=pageskip; + int eosflag=0; + int bosflag=0; + + int byteskipcount=0; + + ogg_stream_reset(&os_en); + ogg_stream_reset(&os_de); + ogg_sync_reset(&oy); + + for(packets=0;packetsbyteskip){ + memcpy(next,og.header,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } + + byteskipcount+=og.body_len; + if(byteskipcount>byteskip){ + memcpy(next,og.body,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } + + ogg_sync_wrote(&oy,next-buf); + + while(1){ + int ret=ogg_sync_pageout(&oy,&og_de); + if(ret==0)break; + if(ret<0)continue; + /* got a page. Happy happy. Verify that it's good. */ + + fprintf(stderr,"(%ld), ",pageout); + + check_page(data+deptr,headers[pageout],&og_de); + deptr+=og_de.body_len; + pageout++; + + /* submit it to deconstitution */ + ogg_stream_pagein(&os_de,&og_de); + + /* packets out? */ + while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ + ogg_stream_packetpeek(&os_de,NULL); + ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ + + /* verify peek and out match */ + if(memcmp(&op_de,&op_de2,sizeof(op_de))){ + fprintf(stderr,"packetout != packetpeek! pos=%ld\n", + depacket); + exit(1); + } + + /* verify the packet! */ + /* check data */ + if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ + fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", + depacket); + exit(1); + } + /* check bos flag */ + if(bosflag==0 && op_de.b_o_s==0){ + fprintf(stderr,"b_o_s flag not set on packet!\n"); + exit(1); + } + if(bosflag && op_de.b_o_s){ + fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); + exit(1); + } + bosflag=1; + depacket+=op_de.bytes; + + /* check eos flag */ + if(eosflag){ + fprintf(stderr,"Multiple decoded packets with eos flag!\n"); + exit(1); + } + + if(op_de.e_o_s)eosflag=1; + + /* check granulepos flag */ + if(op_de.granulepos!=-1){ + fprintf(stderr," granule:%ld ",(long)op_de.granulepos); + } + } + } + } + } + } + } + _ogg_free(data); + if(headers[pageno]!=NULL){ + fprintf(stderr,"did not write last page!\n"); + exit(1); + } + if(headers[pageout]!=NULL){ + fprintf(stderr,"did not decode last page!\n"); + exit(1); + } + if(inptr!=outptr){ + fprintf(stderr,"encoded page data incomplete!\n"); + exit(1); + } + if(inptr!=deptr){ + fprintf(stderr,"decoded page data incomplete!\n"); + exit(1); + } + if(inptr!=depacket){ + fprintf(stderr,"decoded packet data incomplete!\n"); + exit(1); + } + if(!eosflag){ + fprintf(stderr,"Never got a packet with EOS set!\n"); + exit(1); + } + fprintf(stderr,"ok.\n"); +} + +int main(void){ + + ogg_stream_init(&os_en,0x04030201); + ogg_stream_init(&os_de,0x04030201); + ogg_sync_init(&oy); + + /* Exercise each code path in the framing code. Also verify that + the checksums are working. */ + + { + /* 17 only */ + const int packets[]={17, -1}; + const int *headret[]={head1_0,NULL}; + + fprintf(stderr,"testing single page encoding... "); + test_pack(packets,headret,0,0,0); + } + + { + /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ + const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; + const int *headret[]={head1_1,head2_1,NULL}; + + fprintf(stderr,"testing basic page encoding... "); + test_pack(packets,headret,0,0,0); + } + + { + /* nil packets; beginning,middle,end */ + const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; + const int *headret[]={head1_2,head2_2,NULL}; + + fprintf(stderr,"testing basic nil packets... "); + test_pack(packets,headret,0,0,0); + } + + { + /* large initial packet */ + const int packets[]={4345,259,255,-1}; + const int *headret[]={head1_3,head2_3,NULL}; + + fprintf(stderr,"testing initial-packet lacing > 4k... "); + test_pack(packets,headret,0,0,0); + } + + { + /* continuing packet test */ + const int packets[]={0,4345,259,255,-1}; + const int *headret[]={head1_4,head2_4,head3_4,NULL}; + + fprintf(stderr,"testing single packet page span... "); + test_pack(packets,headret,0,0,0); + } + + /* page with the 255 segment limit */ + { + + const int packets[]={0,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,50,-1}; + const int *headret[]={head1_5,head2_5,head3_5,NULL}; + + fprintf(stderr,"testing max packet segments... "); + test_pack(packets,headret,0,0,0); + } + + { + /* packet that overspans over an entire page */ + const int packets[]={0,100,9000,259,255,-1}; + const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; + + fprintf(stderr,"testing very large packets... "); + test_pack(packets,headret,0,0,0); + } + + { + /* test for the libogg 1.1.1 resync in large continuation bug + found by Josh Coalson) */ + const int packets[]={0,100,9000,259,255,-1}; + const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; + + fprintf(stderr,"testing continuation resync in very large packets... "); + test_pack(packets,headret,100,2,3); + } + + { + /* term only page. why not? */ + const int packets[]={0,100,4080,-1}; + const int *headret[]={head1_7,head2_7,head3_7,NULL}; + + fprintf(stderr,"testing zero data page (1 nil packet)... "); + test_pack(packets,headret,0,0,0); + } + + + + { + /* build a bunch of pages for testing */ + unsigned char *data=_ogg_malloc(1024*1024); + int pl[]={0,100,4079,2956,2057,76,34,912,0,234,1000,1000,1000,300,-1}; + int inptr=0,i,j; + ogg_page og[5]; + + ogg_stream_reset(&os_en); + + for(i=0;pl[i]!=-1;i++){ + ogg_packet op; + int len=pl[i]; + + op.packet=data+inptr; + op.bytes=len; + op.e_o_s=(pl[i+1]<0?1:0); + op.granulepos=(i+1)*1000; + + for(j=0;j0)error(); + + /* Test fractional page inputs: incomplete fixed header */ + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + /* Test fractional page inputs: incomplete header */ + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, + 5); + ogg_sync_wrote(&oy,5); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + /* Test fractional page inputs: incomplete body */ + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, + og[1].header_len-28); + ogg_sync_wrote(&oy,og[1].header_len-28); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); + ogg_sync_wrote(&oy,1000); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, + og[1].body_len-1000); + ogg_sync_wrote(&oy,og[1].body_len-1000); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test fractional page inputs: page + incomplete capture */ + { + ogg_page og_de; + fprintf(stderr,"Testing sync on 1+partial inputs... "); + ogg_sync_reset(&oy); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, + og[1].header_len-20); + ogg_sync_wrote(&oy,og[1].header_len-20); + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test recapture: garbage + page */ + { + ogg_page og_de; + fprintf(stderr,"Testing search for capture... "); + ogg_sync_reset(&oy); + + /* 'garbage' */ + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, + og[2].header_len-20); + ogg_sync_wrote(&oy,og[2].header_len-20); + memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, + og[2].body_len); + ogg_sync_wrote(&oy,og[2].body_len); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test recapture: page + garbage + page */ + { + ogg_page og_de; + fprintf(stderr,"Testing recapture... "); + ogg_sync_reset(&oy); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + og[2].header_len); + ogg_sync_wrote(&oy,og[2].header_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + og[2].header_len); + ogg_sync_wrote(&oy,og[2].header_len); + + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, + og[2].body_len-5); + ogg_sync_wrote(&oy,og[2].body_len-5); + + memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, + og[3].header_len); + ogg_sync_wrote(&oy,og[3].header_len); + + memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, + og[3].body_len); + ogg_sync_wrote(&oy,og[3].body_len); + + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Free page data that was previously copied */ + { + for(i=0;i<5;i++){ + free_page(&og[i]); + } + } + } + + return(0); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS new file mode 100644 index 0000000000..0da10363c0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS @@ -0,0 +1,3 @@ +Monty + +and the rest of the Xiph.org Foundation. diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES new file mode 100644 index 0000000000..e7d5dd3044 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES @@ -0,0 +1,126 @@ +libvorbis 1.3.2 (2010-11-01) -- "Xiph.Org libVorbis I 20101101 (Schaufenugget)" + + * vorbis: additional proofing against invalid/malicious + streams in floor, residue, and bos/eos packet trimming + code (see SVN for details). + * vorbis: Added programming documentation tree for the + low-level calls + * vorbisfile: Correct handling of serial numbers array + element [0] on non-seekable streams + * vorbisenc: Back out an [old] AoTuV HF weighting that was + first enabled in 1.3.0; there are a few samples where I + really don't like the effect it causes. + * vorbis: return correct timestamp for granule positions + with high bit set. + * vorbisfile: the [undocumented] half-rate decode api made no + attempt to keep the pcm offset tracking consistent in seeks. + Fix and add a testing mode to seeking_example.c to torture + test seeking in halfrate mode. Also remove requirement that + halfrate mode only work with seekable files. + * vorbisfile: Fix a chaining bug in raw_seeks where seeking + out of the current link would fail due to not + reinitializing the decode machinery. + * vorbisfile: improve seeking strategy. Reduces the + necessary number of seek callbacks in an open or seek + operation by well over 2/3. + +libvorbis 1.3.1 (2010-02-26) -- "Xiph.Org libVorbis I 20100325 (Everywhere)" + + * tweak + minor arithmetic fix in floor1 fit + * revert noise norm to conservative 1.2.3 behavior pending + more listening testing + +libvorbis 1.3.0 (2010-02-25) -- unreleased staging snapshot + + * Optimized surround support for 5.1 encoding at 44.1/48kHz + * Added encoder control call to disable channel coupling + * Correct an overflow bug in very low-bitrate encoding on 32 bit + machines that caused inflated bitrates + * Numerous API hardening, leak and build fixes + * Correct bug in 22kHz compand setup that could cause a crash + * Correct bug in 16kHz codebooks that could cause unstable pure + tones at high bitrates + +libvorbis 1.2.3 (2009-07-09) -- "Xiph.Org libVorbis I 20090709" + + * correct a vorbisfile bug that prevented proper playback of + Vorbis files where all audio in a logical stream is in a + single page + * Additional decode setup hardening against malicious streams + * Add 'OV_EXCLUDE_STATIC_CALLBACKS' define for developers who + wish to avoid unused symbol warnings from the static callbacks + defined in vorbisfile.h + +libvorbis 1.2.2 (2009-06-24) -- "Xiph.Org libVorbis I 20090624" + + * define VENDOR and ENCODER strings + * seek correctly in files bigger than 2 GB (Windows) + * fix regression from CVE-2008-1420; 1.0b1 files work again + * mark all tables as constant to reduce memory occupation + * additional decoder hardening against malicious streams + * substantially reduce amount of seeking performed by Vorbisfile + * Multichannel decode bugfix + * build system updates + * minor specification clarifications/fixes + +libvorbis 1.2.1 (unreleased) -- "Xiph.Org libVorbis I 20080501" + + * Improved robustness with corrupt streams. + * New ov_read_filter() vorbisfile call allows filtering decoded + audio as floats before converting to integer samples. + * Fix an encoder bug with multichannel streams. + * Replaced RTP payload format draft with RFC 5215. + * Bare bones self test under 'make check'. + * Fix a problem encoding some streams between 14 and 28 kHz. + * Fix a numerical instability in the edge extrapolation filter. + * Build system improvements. + * Specification correction. + +libvorbis 1.2.0 (2007-07-25) -- "Xiph.Org libVorbis I 20070622" + + * new ov_fopen() convenience call that avoids the common + stdio conflicts with ov_open() and MSVC runtimes. + * libvorbisfile now handles multiplexed streams + * improve robustness to corrupt input streams + * fix a minor encoder bug + * updated RTP draft + * build system updates + * minor corrections to the specification + +libvorbis 1.1.2 (2005-11-27) -- "Xiph.Org libVorbis I 20050304" + + * fix a serious encoder bug with gcc 4 optimized builds + * documentation and spec fixes + * updated VS2003 and XCode builds + * new draft RTP encapsulation spec + +libvorbis 1.1.1 (2005-06-27) -- "Xiph.Org libVorbis I 20050304" + + * bug fix to the bitrate management encoder interface + * bug fix to properly set packetno field in the encoder + * new draft RTP encapsulation spec + * library API documentation improvements + +libvorbis 1.1.0 (2004-09-22) -- "Xiph.Org libVorbis I 20040629" + + * merges tuning improvements from Aoyumi's aoTuV with fixups + * new managed bitrate (CBR) mode support + * new vorbis_encoder_ctl() interface + * extensive documentation updates + * application/ogg mimetype is now official + * autotools cleanup from Thomas Vander Stichele + * SymbianOS build support from Colin Ward at CSIRO + * various bugfixes + * various packaging improvements + +libvorbis 1.0.1 (2003-11-17) -- "Xiph.Org libVorbis I 20030909" + + * numerous bug fixes + * specification corrections + * new crosslap and halfrate APIs for game use + * packaging and build updates + +libvorbis 1.0.0 (2002-07-19) -- "Xiph.Org libVorbis I 20020717" + + * first stable release + diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING new file mode 100644 index 0000000000..28de72a970 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2002-2008 Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README new file mode 100644 index 0000000000..3e969e0ceb --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README @@ -0,0 +1,134 @@ +******************************************************************** +* * +* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * +* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * +* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * +* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * +* * +* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * +* by the Xiph.org Foundation, http://www.xiph.org/ * +* * +******************************************************************** + +Vorbis is a general purpose audio and music encoding format +contemporary to MPEG-4's AAC and TwinVQ, the next generation beyond +MPEG audio layer 3. Unlike the MPEG sponsored formats (and other +proprietary formats such as RealAudio G2 and Windows' flavor of the +month), the Vorbis CODEC specification belongs to the public domain. +All the technical details are published and documented, and any +software entity may make full use of the format without license +fee, royalty or patent concerns. + +This package contains: + +* libvorbis, a BSD-style license software implementation of + the Vorbis specification by the Xiph.Org Foundation + (http://www.xiph.org/) + +* libvorbisfile, a BSD-style license convenience library + built on Vorbis designed to simplify common uses + +* libvorbisenc, a BSD-style license library that provides a simple, + programmatic encoding setup interface + +* example code making use of libogg, libvorbis, libvorbisfile and + libvorbisenc + +WHAT'S HERE: + +This source distribution includes libvorbis and an example +encoder/player to demonstrate use of libvorbis as well as +documentation on the Ogg Vorbis audio coding format. + +You'll need libogg (distributed separately) to compile this library. +A more comprehensive set of utilities is available in the vorbis-tools +package. + +Directory: + +./lib The source for the libraries, a BSD-license implementation + of the public domain Ogg Vorbis audio encoding format. + +./include Library API headers + +./debian Rules/spec files for building Debian .deb packages + +./doc Vorbis documentation + +./examples Example code illustrating programmatic use of libvorbis, + libvorbisfile and libvorbisenc + +./mac Codewarrior project files and build tweaks for MacOS. + +./macosx Project files for MacOS X. + +./win32 Win32 projects files and build automation + +./vq Internal utilities for training/building new LSP/residue + and auxiliary codebooks. + +CONTACT: + +The Ogg homepage is located at 'http://www.xiph.org/ogg/'. +Vorbis's homepage is located at 'http://www.xiph.org/vorbis/'. +Up to date technical documents, contact information, source code and +pre-built utilities may be found there. + +The user website for Ogg Vorbis software and audio is http://vorbis.com/ + +BUILDING FROM TRUNK: + +Development source is under subversion revision control at +https://svn.xiph.org/trunk/vorbis/. You will also need the +newest versions of autoconf, automake, libtool and pkg-config in +order to compile Vorbis from development source. A configure script +is provided for you in the source tarball distributions. + + [update or checkout latest source] + ./autogen.sh + make + +and as root if desired: + + make install + +This will install the Vorbis libraries (static and shared) into +/usr/local/lib, includes into /usr/local/include and API manpages +(once we write some) into /usr/local/man. + +Documentation building requires xsltproc and pdfxmltex. + +BUILDING FROM TARBALL DISTRIBUTIONS: + + ./configure + make + +and optionally (as root): + make install + +BUILDING RPMS: + +after normal configuring: + + make dist + rpm -ta libvorbis-.tar.gz + +BUILDING ON MACOS 9: + +Vorbis on MacOS 9 is built using Metroworks CodeWarrior. To build it, +first verify that the Ogg libraries are already built following the +instructions in the Ogg module README. Open vorbis/mac/libvorbis.mcp, +switch to the "Targets" pane, select everything, and make the project. +Do the same thing to build libvorbisenc.mcp, and libvorbisfile.mcp (in +that order). In vorbis/mac/Output you will now have both debug and final +versions of Vorbis shared libraries to link your projects against. + +To build a project using Ogg Vorbis, add access paths to your +CodeWarrior project for the ogg/include, ogg/mac/Output, +vorbis/include, and vorbis/mac/Output folders. Be sure that +"interpret DOS and Unix paths" is turned on in your project; it can +be found in the "access paths" pane in your project settings. Now +simply add the shared libraries you need to your project (OggLib and +VorbisLib at least) and #include "ogg/ogg.h" and "vorbis/codec.h" +wherever you need to access Ogg and Vorbis functionality. + diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c new file mode 100644 index 0000000000..4391a44e42 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c @@ -0,0 +1,109 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: single-block PCM analysis mode dispatch + last mod: $Id: analysis.c 16226 2009-07-08 06:43:49Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "registry.h" +#include "scales.h" +#include "os.h" +#include "misc.h" + +/* decides between modes, dispatches to the appropriate mapping. */ +int vorbis_analysis(vorbis_block *vb, ogg_packet *op){ + int ret,i; + vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; + + vb->glue_bits=0; + vb->time_bits=0; + vb->floor_bits=0; + vb->res_bits=0; + + /* first things first. Make sure encode is ready */ + for(i=0;ipacketblob[i]); + + /* we only have one mapping type (0), and we let the mapping code + itself figure out what soft mode to use. This allows easier + bitrate management */ + + if((ret=_mapping_P[0]->forward(vb))) + return(ret); + + if(op){ + if(vorbis_bitrate_managed(vb)) + /* The app is using a bitmanaged mode... but not using the + bitrate management interface. */ + return(OV_EINVAL); + + op->packet=oggpack_get_buffer(&vb->opb); + op->bytes=oggpack_bytes(&vb->opb); + op->b_o_s=0; + op->e_o_s=vb->eofflag; + op->granulepos=vb->granulepos; + op->packetno=vb->sequence; /* for sake of completeness */ + } + return(0); +} + +#ifdef ANALYSIS +int analysis_noisy=1; + +/* there was no great place to put this.... */ +void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,ogg_int64_t off){ + int j; + FILE *of; + char buffer[80]; + + sprintf(buffer,"%s_%d.m",base,i); + of=fopen(buffer,"w"); + + if(!of)perror("failed to open data dump file"); + + for(j=0;j +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "os.h" +#include "misc.h" +#include "bitrate.h" + +/* compute bitrate tracking setup */ +void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + bitrate_manager_info *bi=&ci->bi; + + memset(bm,0,sizeof(*bm)); + + if(bi && (bi->reservoir_bits>0)){ + long ratesamples=vi->rate; + int halfsamples=ci->blocksizes[0]>>1; + + bm->short_per_long=ci->blocksizes[1]/ci->blocksizes[0]; + bm->managed=1; + + bm->avg_bitsper= (int) rint(1.*bi->avg_rate*halfsamples/ratesamples); + bm->min_bitsper= (int) rint(1.*bi->min_rate*halfsamples/ratesamples); + bm->max_bitsper= (int) rint(1.*bi->max_rate*halfsamples/ratesamples); + + bm->avgfloat=PACKETBLOBS/2; + + /* not a necessary fix, but one that leads to a more balanced + typical initialization */ + { + long desired_fill = (long) (bi->reservoir_bits*bi->reservoir_bias); + bm->minmax_reservoir=desired_fill; + bm->avg_reservoir=desired_fill; + } + + } +} + +void vorbis_bitrate_clear(bitrate_manager_state *bm){ + memset(bm,0,sizeof(*bm)); + return; +} + +int vorbis_bitrate_managed(vorbis_block *vb){ + vorbis_dsp_state *vd=vb->vd; + private_state *b=(private_state*)vd->backend_state; + bitrate_manager_state *bm=&b->bms; + + if(bm && bm->managed)return(1); + return(0); +} + +/* finish taking in the block we just processed */ +int vorbis_bitrate_addblock(vorbis_block *vb){ + vorbis_block_internal *vbi=(vorbis_block_internal*)vb->internal; + vorbis_dsp_state *vd=vb->vd; + private_state *b=(private_state*)vd->backend_state; + bitrate_manager_state *bm=&b->bms; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + bitrate_manager_info *bi=&ci->bi; + + int choice = (int) rint(bm->avgfloat); + long this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + long min_target_bits=(vb->W?bm->min_bitsper*bm->short_per_long:bm->min_bitsper); + long max_target_bits=(vb->W?bm->max_bitsper*bm->short_per_long:bm->max_bitsper); + int samples=ci->blocksizes[vb->W]>>1; + long desired_fill = (long) (bi->reservoir_bits*bi->reservoir_bias); + if(!bm->managed){ + /* not a bitrate managed stream, but for API simplicity, we'll + buffer the packet to keep the code path clean */ + + if(bm->vb)return(-1); /* one has been submitted without + being claimed */ + bm->vb=vb; + return(0); + } + + bm->vb=vb; + + /* look ahead for avg floater */ + if(bm->avg_bitsper>0){ + double slew=0.; + long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper); + double slewlimit= 15./bi->slew_damp; + + /* choosing a new floater: + if we're over target, we slew down + if we're under target, we slew up + + choose slew as follows: look through packetblobs of this frame + and set slew as the first in the appropriate direction that + gives us the slew we want. This may mean no slew if delta is + already favorable. + + Then limit slew to slew max */ + + if(bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){ + while(choice>0 && this_bits>avg_target_bits && + bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){ + choice--; + this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + } + }else if(bm->avg_reservoir+(this_bits-avg_target_bits)avg_reservoir+(this_bits-avg_target_bits)packetblob[choice])*8; + } + } + + slew=rint(choice-bm->avgfloat)/samples*vi->rate; + if(slew<-slewlimit)slew=-slewlimit; + if(slew>slewlimit)slew=slewlimit; + choice = (int) rint(bm->avgfloat+= slew/vi->rate*samples); + this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + } + + + + /* enforce min(if used) on the current floater (if used) */ + if(bm->min_bitsper>0){ + /* do we need to force the bitrate up? */ + if(this_bitsminmax_reservoir-(min_target_bits-this_bits)<0){ + choice++; + if(choice>=PACKETBLOBS)break; + this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + } + } + } + + /* enforce max (if used) on the current floater (if used) */ + if(bm->max_bitsper>0){ + /* do we need to force the bitrate down? */ + if(this_bits>max_target_bits){ + while(bm->minmax_reservoir+(this_bits-max_target_bits)>bi->reservoir_bits){ + choice--; + if(choice<0)break; + this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + } + } + } + + /* Choice of packetblobs now made based on floater, and min/max + requirements. Now boundary check extreme choices */ + + if(choice<0){ + /* choosing a smaller packetblob is insufficient to trim bitrate. + frame will need to be truncated */ + long maxsize=(max_target_bits+(bi->reservoir_bits-bm->minmax_reservoir))/8; + bm->choice=choice=0; + + if(oggpack_bytes(vbi->packetblob[choice])>maxsize){ + + oggpack_writetrunc(vbi->packetblob[choice],maxsize*8); + this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + } + }else{ + long minsize=(min_target_bits-bm->minmax_reservoir+7)/8; + if(choice>=PACKETBLOBS) + choice=PACKETBLOBS-1; + + bm->choice=choice; + + /* prop up bitrate according to demand. pad this frame out with zeroes */ + minsize-=oggpack_bytes(vbi->packetblob[choice]); + while(minsize-->0)oggpack_write(vbi->packetblob[choice],0,8); + this_bits=oggpack_bytes(vbi->packetblob[choice])*8; + + } + + /* now we have the final packet and the final packet size. Update statistics */ + /* min and max reservoir */ + if(bm->min_bitsper>0 || bm->max_bitsper>0){ + + if(max_target_bits>0 && this_bits>max_target_bits){ + bm->minmax_reservoir+=(this_bits-max_target_bits); + }else if(min_target_bits>0 && this_bitsminmax_reservoir+=(this_bits-min_target_bits); + }else{ + /* inbetween; we want to take reservoir toward but not past desired_fill */ + if(bm->minmax_reservoir>desired_fill){ + if(max_target_bits>0){ /* logical bulletproofing against initialization state */ + bm->minmax_reservoir+=(this_bits-max_target_bits); + if(bm->minmax_reservoirminmax_reservoir=desired_fill; + }else{ + bm->minmax_reservoir=desired_fill; + } + }else{ + if(min_target_bits>0){ /* logical bulletproofing against initialization state */ + bm->minmax_reservoir+=(this_bits-min_target_bits); + if(bm->minmax_reservoir>desired_fill)bm->minmax_reservoir=desired_fill; + }else{ + bm->minmax_reservoir=desired_fill; + } + } + } + } + + /* avg reservoir */ + if(bm->avg_bitsper>0){ + long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper); + bm->avg_reservoir+=this_bits-avg_target_bits; + } + + return(0); +} + +int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){ + private_state *b=(private_state*)vd->backend_state; + bitrate_manager_state *bm=&b->bms; + vorbis_block *vb=bm->vb; + int choice=PACKETBLOBS/2; + if(!vb)return 0; + + if(op){ + vorbis_block_internal *vbi=(vorbis_block_internal*)vb->internal; + + if(vorbis_bitrate_managed(vb)) + choice=bm->choice; + + op->packet=oggpack_get_buffer(vbi->packetblob[choice]); + op->bytes=oggpack_bytes(vbi->packetblob[choice]); + op->b_o_s=0; + op->e_o_s=vb->eofflag; + op->granulepos=vb->granulepos; + op->packetno=vb->sequence; /* for sake of completeness */ + } + + bm->vb=0; + return(1); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h new file mode 100644 index 0000000000..c2dd37d865 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h @@ -0,0 +1,59 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: bitrate tracking and management + last mod: $Id: bitrate.h 13293 2007-07-24 00:09:47Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_BITRATE_H_ +#define _V_BITRATE_H_ + +#include "../../codec.h" +#include "codec_internal.h" +#include "os.h" + +/* encode side bitrate tracking */ +typedef struct bitrate_manager_state { + int managed; + + long avg_reservoir; + long minmax_reservoir; + long avg_bitsper; + long min_bitsper; + long max_bitsper; + + long short_per_long; + double avgfloat; + + vorbis_block *vb; + int choice; +} bitrate_manager_state; + +typedef struct bitrate_manager_info{ + long avg_rate; + long min_rate; + long max_rate; + long reservoir_bits; + double reservoir_bias; + + double slew_damp; + +} bitrate_manager_info; + +extern void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bs); +extern void vorbis_bitrate_clear(bitrate_manager_state *bs); +extern int vorbis_bitrate_managed(vorbis_block *vb); +extern int vorbis_bitrate_addblock(vorbis_block *vb); +extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ogg_packet *op); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c new file mode 100644 index 0000000000..ba1acae372 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c @@ -0,0 +1,1033 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: PCM data vector blocking, windowing and dis/reassembly + last mod: $Id: block.c 17561 2010-10-23 10:34:24Z xiphmont $ + + Handle windowing, overlap-add, etc of the PCM vectors. This is made + more amusing by Vorbis' current two allowed block sizes. + + ********************************************************************/ + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" + +#include "window.h" +#include "mdct.h" +#include "lpc.h" +#include "registry.h" +#include "misc.h" + +/* pcm accumulator examples (not exhaustive): + + <-------------- lW ----------------> + <--------------- W ----------------> +: .....|..... _______________ | +: .''' | '''_--- | |\ | +:.....''' |_____--- '''......| | \_______| +:.................|__________________|_______|__|______| + |<------ Sl ------>| > Sr < |endW + |beginSl |endSl | |endSr + |beginW |endlW |beginSr + + + |< lW >| + <--------------- W ----------------> + | | .. ______________ | + | | ' `/ | ---_ | + |___.'___/`. | ---_____| + |_______|__|_______|_________________| + | >|Sl|< |<------ Sr ----->|endW + | | |endSl |beginSr |endSr + |beginW | |endlW + mult[0] |beginSl mult[n] + + <-------------- lW -----------------> + |<--W-->| +: .............. ___ | | +: .''' |`/ \ | | +:.....''' |/`....\|...| +:.........................|___|___|___| + |Sl |Sr |endW + | | |endSr + | |beginSr + | |endSl + |beginSl + |beginW +*/ + +/* block abstraction setup *********************************************/ + +#ifndef WORD_ALIGN +#define WORD_ALIGN 8 +#endif + +int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ + int i; + memset(vb,0,sizeof(*vb)); + vb->vd=v; + vb->localalloc=0; + vb->localstore=NULL; + if(v->analysisp){ + vorbis_block_internal *vbi=(vorbis_block_internal*) + (vb->internal=(vorbis_block_internal*)_ogg_calloc(1,sizeof(vorbis_block_internal))); + vbi->ampmax=-9999; + + for(i=0;ipacketblob[i]=&vb->opb; + }else{ + vbi->packetblob[i]= + (oggpack_buffer*) _ogg_calloc(1,sizeof(oggpack_buffer)); + } + oggpack_writeinit(vbi->packetblob[i]); + } + } + + return(0); +} + +void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ + bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); + if(bytes+vb->localtop>vb->localalloc){ + /* can't just _ogg_realloc... there are outstanding pointers */ + if(vb->localstore){ + struct alloc_chain *link=(struct alloc_chain*)_ogg_malloc(sizeof(*link)); + vb->totaluse+=vb->localtop; + link->next=vb->reap; + link->ptr=vb->localstore; + vb->reap=link; + } + /* highly conservative */ + vb->localalloc=bytes; + vb->localstore=_ogg_malloc(vb->localalloc); + vb->localtop=0; + } + { + void *ret=(void *)(((char *)vb->localstore)+vb->localtop); + vb->localtop+=bytes; + return ret; + } +} + +/* reap the chain, pull the ripcord */ +void _vorbis_block_ripcord(vorbis_block *vb){ + /* reap the chain */ + struct alloc_chain *reap=vb->reap; + while(reap){ + struct alloc_chain *next=reap->next; + _ogg_free(reap->ptr); + memset(reap,0,sizeof(*reap)); + _ogg_free(reap); + reap=next; + } + /* consolidate storage */ + if(vb->totaluse){ + vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); + vb->localalloc+=vb->totaluse; + vb->totaluse=0; + } + + /* pull the ripcord */ + vb->localtop=0; + vb->reap=NULL; +} + +int vorbis_block_clear(vorbis_block *vb){ + int i; + vorbis_block_internal *vbi=(vorbis_block_internal*)vb->internal; + + _vorbis_block_ripcord(vb); + if(vb->localstore)_ogg_free(vb->localstore); + + if(vbi){ + for(i=0;ipacketblob[i]); + if(i!=PACKETBLOBS/2)_ogg_free(vbi->packetblob[i]); + } + _ogg_free(vbi); + } + memset(vb,0,sizeof(*vb)); + return(0); +} + +/* Analysis side code, but directly related to blocking. Thus it's + here and not in analysis.c (which is for analysis transforms only). + The init is here because some of it is shared */ + +static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + private_state *b=NULL; + int hs; + + if(ci==NULL) return 1; + hs=ci->halfrate_flag; + + memset(v,0,sizeof(*v)); + b=(private_state*) (v->backend_state=(private_state*)_ogg_calloc(1,sizeof(*b))); + + v->vi=vi; + b->modebits=ilog2(ci->modes); + + b->transform[0]=(vorbis_look_transform**)_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0])); + b->transform[1]=(vorbis_look_transform**)_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1])); + + /* MDCT is tranform 0 */ + + b->transform[0][0]=_ogg_calloc(1,sizeof(mdct_lookup)); + b->transform[1][0]=_ogg_calloc(1,sizeof(mdct_lookup)); + mdct_init((mdct_lookup*)b->transform[0][0],ci->blocksizes[0]>>hs); + mdct_init((mdct_lookup*)b->transform[1][0],ci->blocksizes[1]>>hs); + + /* Vorbis I uses only window type 0 */ + b->window[0]=ilog2(ci->blocksizes[0])-6; + b->window[1]=ilog2(ci->blocksizes[1])-6; + + if(encp){ /* encode/decode differ here */ + + /* analysis always needs an fft */ + drft_init(&b->fft_look[0],ci->blocksizes[0]); + drft_init(&b->fft_look[1],ci->blocksizes[1]); + + /* finish the codebooks */ + if(!ci->fullbooks){ + ci->fullbooks=(codebook*) _ogg_calloc(ci->books,sizeof(*ci->fullbooks)); + for(int i=0;ibooks;i++) + vorbis_book_init_encode(ci->fullbooks+i,ci->book_param[i]); + } + + b->psy=(vorbis_look_psy*)_ogg_calloc(ci->psys,sizeof(*b->psy)); + for(int i=0;ipsys;i++){ + _vp_psy_init(b->psy+i, + ci->psy_param[i], + &ci->psy_g_param, + ci->blocksizes[ci->psy_param[i]->blockflag]/2, + vi->rate); + } + + v->analysisp=1; + }else{ + /* finish the codebooks */ + if(!ci->fullbooks){ + ci->fullbooks=(codebook*) _ogg_calloc(ci->books,sizeof(*ci->fullbooks)); + for(int i=0;ibooks;i++){ + if(ci->book_param[i]==NULL) + goto abort_books; + if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) + goto abort_books; + /* decode codebooks are now standalone after init */ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + } + + /* initialize the storage vectors. blocksize[1] is small for encode, + but the correct size for decode */ + v->pcm_storage=ci->blocksizes[1]; + v->pcm=(float**)_ogg_malloc(vi->channels*sizeof(*v->pcm)); + v->pcmret=(float**)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); + { + int i; + for(i=0;ichannels;i++) + v->pcm[i]=(float*)_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); + } + + /* all 1 (large block) or 0 (small block) */ + /* explicitly set for the sake of clarity */ + v->lW=0; /* previous window size */ + v->W=0; /* current window size */ + + /* all vector indexes */ + v->centerW=ci->blocksizes[1]/2; + + v->pcm_current=v->centerW; + + /* initialize all the backend lookups */ + b->flr=(vorbis_look_floor**)_ogg_calloc(ci->floors,sizeof(*b->flr)); + b->residue=(vorbis_look_residue**)_ogg_calloc(ci->residues,sizeof(*b->residue)); + + for(int i=0;ifloors;i++) + b->flr[i]=_floor_P[ci->floor_type[i]]-> + look(v,ci->floor_param[i]); + + for(int i=0;iresidues;i++) + b->residue[i]=_residue_P[ci->residue_type[i]]-> + look(v,ci->residue_param[i]); + + return 0; + abort_books: + for(int i=0;ibooks;i++){ + if(ci->book_param[i]!=NULL){ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + vorbis_dsp_clear(v); + return -1; +} + +/* arbitrary settings and spec-mandated numbers get filled in here */ +int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi){ + private_state *b=NULL; + + if(_vds_shared_init(v,vi,1))return 1; + b=(private_state*)v->backend_state; + b->psy_g_look=_vp_global_look(vi); + + /* Initialize the envelope state storage */ + b->ve=(envelope_lookup*)_ogg_calloc(1,sizeof(*b->ve)); + _ve_envelope_init(b->ve,vi); + + vorbis_bitrate_init(vi,&b->bms); + + /* compressed audio packets start after the headers + with sequence number 3 */ + v->sequence=3; + + return(0); +} + +void vorbis_dsp_clear(vorbis_dsp_state *v){ + int i; + if(v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info*)(vi?vi->codec_setup:NULL); + private_state *b=(private_state*)v->backend_state; + + if(b){ + + if(b->ve){ + _ve_envelope_clear(b->ve); + _ogg_free(b->ve); + } + + if(b->transform[0]){ + mdct_clear((mdct_lookup*) b->transform[0][0]); + _ogg_free(b->transform[0][0]); + _ogg_free(b->transform[0]); + } + if(b->transform[1]){ + mdct_clear((mdct_lookup*) b->transform[1][0]); + _ogg_free(b->transform[1][0]); + _ogg_free(b->transform[1]); + } + + if(b->flr){ + if(ci) + for(i=0;ifloors;i++) + _floor_P[ci->floor_type[i]]-> + free_look(b->flr[i]); + _ogg_free(b->flr); + } + if(b->residue){ + if(ci) + for(i=0;iresidues;i++) + _residue_P[ci->residue_type[i]]-> + free_look(b->residue[i]); + _ogg_free(b->residue); + } + if(b->psy){ + if(ci) + for(i=0;ipsys;i++) + _vp_psy_clear(b->psy+i); + _ogg_free(b->psy); + } + + if(b->psy_g_look)_vp_global_free(b->psy_g_look); + vorbis_bitrate_clear(&b->bms); + + drft_clear(&b->fft_look[0]); + drft_clear(&b->fft_look[1]); + + } + + if(v->pcm){ + if(vi) + for(i=0;ichannels;i++) + if(v->pcm[i])_ogg_free(v->pcm[i]); + _ogg_free(v->pcm); + if(v->pcmret)_ogg_free(v->pcmret); + } + + if(b){ + /* free header, header1, header2 */ + if(b->header)_ogg_free(b->header); + if(b->header1)_ogg_free(b->header1); + if(b->header2)_ogg_free(b->header2); + _ogg_free(b); + } + + memset(v,0,sizeof(*v)); + } +} + +float **vorbis_analysis_buffer(vorbis_dsp_state *v, int vals){ + int i; + vorbis_info *vi=v->vi; + private_state *b=(private_state*)v->backend_state; + + /* free header, header1, header2 */ + if(b->header)_ogg_free(b->header);b->header=NULL; + if(b->header1)_ogg_free(b->header1);b->header1=NULL; + if(b->header2)_ogg_free(b->header2);b->header2=NULL; + + /* Do we have enough storage space for the requested buffer? If not, + expand the PCM (and envelope) storage */ + + if(v->pcm_current+vals>=v->pcm_storage){ + v->pcm_storage=v->pcm_current+vals*2; + + for(i=0;ichannels;i++){ + v->pcm[i]=(float*)_ogg_realloc(v->pcm[i],v->pcm_storage*sizeof(*v->pcm[i])); + } + } + + for(i=0;ichannels;i++) + v->pcmret[i]=v->pcm[i]+v->pcm_current; + + return(v->pcmret); +} + +static void _preextrapolate_helper(vorbis_dsp_state *v){ + int i; + int order=32; + float *lpc=(float*)alloca(order*sizeof(*lpc)); + float *work=(float*)alloca(v->pcm_current*sizeof(*work)); + long j; + v->preextrapolate=1; + + if(v->pcm_current-v->centerW>order*2){ /* safety */ + for(i=0;ivi->channels;i++){ + /* need to run the extrapolation in reverse! */ + for(j=0;jpcm_current;j++) + work[j]=v->pcm[i][v->pcm_current-j-1]; + + /* prime as above */ + vorbis_lpc_from_data(work,lpc,v->pcm_current-v->centerW,order); + +#if 0 + if(v->vi->channels==2){ + if(i==0) + _analysis_output("predataL",0,work,v->pcm_current-v->centerW,0,0,0); + else + _analysis_output("predataR",0,work,v->pcm_current-v->centerW,0,0,0); + }else{ + _analysis_output("predata",0,work,v->pcm_current-v->centerW,0,0,0); + } +#endif + + /* run the predictor filter */ + vorbis_lpc_predict(lpc,work+v->pcm_current-v->centerW-order, + order, + work+v->pcm_current-v->centerW, + v->centerW); + + for(j=0;jpcm_current;j++) + v->pcm[i][v->pcm_current-j-1]=work[j]; + + } + } +} + + +/* call with val<=0 to set eof */ + +int vorbis_analysis_wrote(vorbis_dsp_state *v, int vals){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + + if(vals<=0){ + int order=32; + int i; + float *lpc=(float*) alloca(order*sizeof(*lpc)); + + /* if it wasn't done earlier (very short sample) */ + if(!v->preextrapolate) + _preextrapolate_helper(v); + + /* We're encoding the end of the stream. Just make sure we have + [at least] a few full blocks of zeroes at the end. */ + /* actually, we don't want zeroes; that could drop a large + amplitude off a cliff, creating spread spectrum noise that will + suck to encode. Extrapolate for the sake of cleanliness. */ + + vorbis_analysis_buffer(v,ci->blocksizes[1]*3); + v->eofflag=v->pcm_current; + v->pcm_current+=ci->blocksizes[1]*3; + + for(i=0;ichannels;i++){ + if(v->eofflag>order*2){ + /* extrapolate with LPC to fill in */ + long n; + + /* make a predictor filter */ + n=v->eofflag; + if(n>ci->blocksizes[1])n=ci->blocksizes[1]; + vorbis_lpc_from_data(v->pcm[i]+v->eofflag-n,lpc,n,order); + + /* run the predictor filter */ + vorbis_lpc_predict(lpc,v->pcm[i]+v->eofflag-order,order, + v->pcm[i]+v->eofflag,v->pcm_current-v->eofflag); + }else{ + /* not enough data to extrapolate (unlikely to happen due to + guarding the overlap, but bulletproof in case that + assumtion goes away). zeroes will do. */ + memset(v->pcm[i]+v->eofflag,0, + (v->pcm_current-v->eofflag)*sizeof(*v->pcm[i])); + + } + } + }else{ + + if(v->pcm_current+vals>v->pcm_storage) + return(OV_EINVAL); + + v->pcm_current+=vals; + + /* we may want to reverse extrapolate the beginning of a stream + too... in case we're beginning on a cliff! */ + /* clumsy, but simple. It only runs once, so simple is good. */ + if(!v->preextrapolate && v->pcm_current-v->centerW>ci->blocksizes[1]) + _preextrapolate_helper(v); + + } + return(0); +} + +/* do the deltas, envelope shaping, pre-echo and determine the size of + the next block on which to continue analysis */ +int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){ + int i; + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + private_state *b=(private_state*)v->backend_state; + vorbis_look_psy_global *g=b->psy_g_look; + long beginW=v->centerW-ci->blocksizes[v->W]/2,centerNext; + vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; + + /* check to see if we're started... */ + if(!v->preextrapolate)return(0); + + /* check to see if we're done... */ + if(v->eofflag==-1)return(0); + + /* By our invariant, we have lW, W and centerW set. Search for + the next boundary so we can determine nW (the next window size) + which lets us compute the shape of the current block's window */ + + /* we do an envelope search even on a single blocksize; we may still + be throwing more bits at impulses, and envelope search handles + marking impulses too. */ + { + long bp=_ve_envelope_search(v); + if(bp==-1){ + + if(v->eofflag==0)return(0); /* not enough data currently to search for a + full long block */ + v->nW=0; + }else{ + + if(ci->blocksizes[0]==ci->blocksizes[1]) + v->nW=0; + else + v->nW=bp; + } + } + + centerNext=v->centerW+ci->blocksizes[v->W]/4+ci->blocksizes[v->nW]/4; + + { + /* center of next block + next block maximum right side. */ + + long blockbound=centerNext+ci->blocksizes[v->nW]/2; + if(v->pcm_currentlW=v->lW; + vb->W=v->W; + vb->nW=v->nW; + + if(v->W){ + if(!v->lW || !v->nW){ + vbi->blocktype=BLOCKTYPE_TRANSITION; + /*fprintf(stderr,"-");*/ + }else{ + vbi->blocktype=BLOCKTYPE_LONG; + /*fprintf(stderr,"_");*/ + } + }else{ + if(_ve_envelope_mark(v)){ + vbi->blocktype=BLOCKTYPE_IMPULSE; + /*fprintf(stderr,"|");*/ + + }else{ + vbi->blocktype=BLOCKTYPE_PADDING; + /*fprintf(stderr,".");*/ + + } + } + + vb->vd=v; + vb->sequence=v->sequence++; + vb->granulepos=v->granulepos; + vb->pcmend=ci->blocksizes[v->W]; + + /* copy the vectors; this uses the local storage in vb */ + + /* this tracks 'strongest peak' for later psychoacoustics */ + /* moved to the global psy state; clean this mess up */ + if(vbi->ampmax>g->ampmax)g->ampmax=vbi->ampmax; + g->ampmax=_vp_ampmax_decay(g->ampmax,v); + vbi->ampmax=g->ampmax; + + vb->pcm=(float**)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); + vbi->pcmdelay=(float**)_vorbis_block_alloc(vb,sizeof(*vbi->pcmdelay)*vi->channels); + for(i=0;ichannels;i++){ + vbi->pcmdelay[i]= + (float*) _vorbis_block_alloc(vb,(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); + memcpy(vbi->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); + vb->pcm[i]=vbi->pcmdelay[i]+beginW; + + /* before we added the delay + vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); + memcpy(vb->pcm[i],v->pcm[i]+beginW,ci->blocksizes[v->W]*sizeof(*vb->pcm[i])); + */ + + } + + /* handle eof detection: eof==0 means that we've not yet received EOF + eof>0 marks the last 'real' sample in pcm[] + eof<0 'no more to do'; doesn't get here */ + + if(v->eofflag){ + if(v->centerW>=v->eofflag){ + v->eofflag=-1; + vb->eofflag=1; + return(1); + } + } + + /* advance storage vectors and clean up */ + { + int new_centerNext=ci->blocksizes[1]/2; + int movementW=centerNext-new_centerNext; + + if(movementW>0){ + + _ve_envelope_shift(b->ve,movementW); + v->pcm_current-=movementW; + + for(i=0;ichannels;i++) + memmove(v->pcm[i],v->pcm[i]+movementW, + v->pcm_current*sizeof(*v->pcm[i])); + + + v->lW=v->W; + v->W=v->nW; + v->centerW=new_centerNext; + + if(v->eofflag){ + v->eofflag-=movementW; + if(v->eofflag<=0)v->eofflag=-1; + /* do not add padding to end of stream! */ + if(v->centerW>=v->eofflag){ + v->granulepos+=movementW-(v->centerW-v->eofflag); + }else{ + v->granulepos+=movementW; + } + }else{ + v->granulepos+=movementW; + } + } + } + + /* done */ + return(1); +} + +int vorbis_synthesis_restart(vorbis_dsp_state *v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci; + int hs; + + if(!v->backend_state)return -1; + if(!vi)return -1; + ci=(codec_setup_info*) vi->codec_setup; + if(!ci)return -1; + hs=ci->halfrate_flag; + + v->centerW=ci->blocksizes[1]>>(hs+1); + v->pcm_current=v->centerW>>hs; + + v->pcm_returned=-1; + v->granulepos=-1; + v->sequence=-1; + v->eofflag=0; + ((private_state *)(v->backend_state))->sample_count=-1; + + return(0); +} + +int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ + if(_vds_shared_init(v,vi,0)){ + vorbis_dsp_clear(v); + return 1; + } + vorbis_synthesis_restart(v); + return 0; +} + +/* Unlike in analysis, the window is only partially applied for each + block. The time domain envelope is not yet handled at the point of + calling (as it relies on the previous block). */ + +int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + private_state *b=(private_state*)v->backend_state; + int hs=ci->halfrate_flag; + int i,j; + + if(!vb)return(OV_EINVAL); + if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); + + v->lW=v->W; + v->W=vb->W; + v->nW=-1; + + if((v->sequence==-1)|| + (v->sequence+1 != vb->sequence)){ + v->granulepos=-1; /* out of sequence; lose count */ + b->sample_count=-1; + } + + v->sequence=vb->sequence; + + if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly + was called on block */ + int n=ci->blocksizes[v->W]>>(hs+1); + int n0=ci->blocksizes[0]>>(hs+1); + int n1=ci->blocksizes[1]>>(hs+1); + + int thisCenter; + int prevCenter; + + v->glue_bits+=vb->glue_bits; + v->time_bits+=vb->time_bits; + v->floor_bits+=vb->floor_bits; + v->res_bits+=vb->res_bits; + + if(v->centerW){ + thisCenter=n1; + prevCenter=0; + }else{ + thisCenter=0; + prevCenter=n1; + } + + /* v->pcm is now used like a two-stage double buffer. We don't want + to have to constantly shift *or* adjust memory usage. Don't + accept a new block until the old is shifted out */ + + for(j=0;jchannels;j++){ + /* the overlap/add section */ + if(v->lW){ + if(v->W){ + /* large/large */ + const float *w=_vorbis_window_get(b->window[1]-hs); + float *pcm=v->pcm[j]+prevCenter; + float *p=vb->pcm[j]; + for(i=0;iwindow[0]-hs); + float *pcm=v->pcm[j]+prevCenter+n1/2-n0/2; + float *p=vb->pcm[j]; + for(i=0;iW){ + /* small/large */ + const float *w=_vorbis_window_get(b->window[0]-hs); + float *pcm=v->pcm[j]+prevCenter; + float *p=vb->pcm[j]+n1/2-n0/2; + for(i=0;iwindow[0]-hs); + float *pcm=v->pcm[j]+prevCenter; + float *p=vb->pcm[j]; + for(i=0;ipcm[j]+thisCenter; + float *p=vb->pcm[j]+n; + for(i=0;icenterW) + v->centerW=0; + else + v->centerW=n1; + + /* deal with initial packet state; we do this using the explicit + pcm_returned==-1 flag otherwise we're sensitive to first block + being short or long */ + + if(v->pcm_returned==-1){ + v->pcm_returned=thisCenter; + v->pcm_current=thisCenter; + }else{ + v->pcm_returned=prevCenter; + v->pcm_current=prevCenter+ + ((ci->blocksizes[v->lW]/4+ + ci->blocksizes[v->W]/4)>>hs); + } + + } + + /* track the frame number... This is for convenience, but also + making sure our last packet doesn't end with added padding. If + the last packet is partial, the number of samples we'll have to + return will be past the vb->granulepos. + + This is not foolproof! It will be confused if we begin + decoding at the last page after a seek or hole. In that case, + we don't have a starting point to judge where the last frame + is. For this reason, vorbisfile will always try to make sure + it reads the last two marked pages in proper sequence */ + + if(b->sample_count==-1){ + b->sample_count=0; + }else{ + b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; + } + + if(v->granulepos==-1){ + if(vb->granulepos!=-1){ /* only set if we have a position to set to */ + + v->granulepos=vb->granulepos; + + /* is this a short page? */ + if(b->sample_count>v->granulepos){ + /* corner case; if this is both the first and last audio page, + then spec says the end is cut, not beginning */ + long extra = (long) (b->sample_count-vb->granulepos); + + /* we use ogg_int64_t for granule positions because a + uint64 isn't universally available. Unfortunately, + that means granposes can be 'negative' and result in + extra being negative */ + if(extra<0) + extra=0; + + if(vb->eofflag){ + /* trim the end */ + /* no preceding granulepos; assume we started at zero (we'd + have to in a short single-page stream) */ + /* granulepos could be -1 due to a seek, but that would result + in a long count, not short count */ + + /* Guard against corrupt/malicious frames that set EOP and + a backdated granpos; don't rewind more samples than we + actually have */ + if(extra > (v->pcm_current - v->pcm_returned)<pcm_current - v->pcm_returned)<pcm_current-=extra>>hs; + }else{ + /* trim the beginning */ + v->pcm_returned+=extra>>hs; + if(v->pcm_returned>v->pcm_current) + v->pcm_returned=v->pcm_current; + } + + } + + } + }else{ + v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; + if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ + + if(v->granulepos>vb->granulepos){ + long extra=v->granulepos-vb->granulepos; + + if(extra) + if(vb->eofflag){ + /* partial last frame. Strip the extra samples off */ + + /* Guard against corrupt/malicious frames that set EOP and + a backdated granpos; don't rewind more samples than we + actually have */ + if(extra > (v->pcm_current - v->pcm_returned)<pcm_current - v->pcm_returned)<pcm_current-=extra>>hs; + } /* else {Shouldn't happen *unless* the bitstream is out of + spec. Either way, believe the bitstream } */ + } /* else {Shouldn't happen *unless* the bitstream is out of + spec. Either way, believe the bitstream } */ + v->granulepos=vb->granulepos; + } + } + + /* Update, cleanup */ + + if(vb->eofflag)v->eofflag=1; + return(0); + +} + +/* pcm==NULL indicates we just want the pending samples, no more */ +int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm){ + vorbis_info *vi=v->vi; + + if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ + if(pcm){ + int i; + for(i=0;ichannels;i++) + v->pcmret[i]=v->pcm[i]+v->pcm_returned; + *pcm=v->pcmret; + } + return(v->pcm_current-v->pcm_returned); + } + return(0); +} + +int vorbis_synthesis_read(vorbis_dsp_state *v,int n){ + if(n && v->pcm_returned+n>v->pcm_current)return(OV_EINVAL); + v->pcm_returned+=n; + return(0); +} + +/* intended for use with a specific vorbisfile feature; we want access + to the [usually synthetic/postextrapolated] buffer and lapping at + the end of a decode cycle, specifically, a half-short-block worth. + This funtion works like pcmout above, except it will also expose + this implicit buffer data not normally decoded. */ +int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int hs=ci->halfrate_flag; + + int n=ci->blocksizes[v->W]>>(hs+1); + int n0=ci->blocksizes[0]>>(hs+1); + int n1=ci->blocksizes[1]>>(hs+1); + + if(v->pcm_returned<0)return 0; + + /* our returned data ends at pcm_returned; because the synthesis pcm + buffer is a two-fragment ring, that means our data block may be + fragmented by buffering, wrapping or a short block not filling + out a buffer. To simplify things, we unfragment if it's at all + possibly needed. Otherwise, we'd need to call lapout more than + once as well as hold additional dsp state. Opt for + simplicity. */ + + /* centerW was advanced by blockin; it would be the center of the + *next* block */ + if(v->centerW==n1){ + /* the data buffer wraps; swap the halves */ + /* slow, sure, small */ + for(int j=0;jchannels;j++){ + float *p=v->pcm[j]; + for(int i=0;ipcm_current-=n1; + v->pcm_returned-=n1; + v->centerW=0; + } + + /* solidify buffer into contiguous space */ + if((v->lW^v->W)==1){ + /* long/short or short/long */ + for(int j=0;jchannels;j++){ + float *s=v->pcm[j]; + float *d=v->pcm[j]+(n1-n0)/2; + for(int i=(n1+n0)/2-1;i>=0;--i) + d[i]=s[i]; + } + v->pcm_returned+=(n1-n0)/2; + v->pcm_current+=(n1-n0)/2; + }else{ + if(v->lW==0){ + /* short/short */ + for(int j=0;jchannels;j++){ + float *s=v->pcm[j]; + float *d=v->pcm[j]+n1-n0; + for(int i=n0-1;i>=0;--i) + d[i]=s[i]; + } + v->pcm_returned+=n1-n0; + v->pcm_current+=n1-n0; + } + } + + if(pcm){ + for(int i=0;ichannels;i++) + v->pcmret[i]=v->pcm[i]+v->pcm_returned; + *pcm=v->pcmret; + } + + return(n1+n-v->pcm_returned); + +} + +static float *vorbis_window(vorbis_dsp_state *v,int W){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info*) vi->codec_setup; + int hs=ci->halfrate_flag; + private_state *b=(private_state*)v->backend_state; + + if(b->window[W]-1<0)return NULL; + return _vorbis_window_get(b->window[W]-hs); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h new file mode 100644 index 0000000000..488c8a49a6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h @@ -0,0 +1,12256 @@ +static const long _vq_quantlist__44p0_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p0_l0_0[] = { + 1, 3, 4, 7, 7, 8, 8, 9, 9, 9,10,10,10, 5, 6, 5, + 8, 7, 9, 8, 9, 9,10, 9,11,10, 5, 5, 7, 7, 8, 8, + 9, 9, 9, 9,10,10,11, 8, 9, 8,10, 9,10, 9,10, 9, + 11,10,11,10, 8, 8, 9, 9,10, 9,10, 9,11,10,11,10, + 11,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11, + 11,11,12,11,11,11,11,11,11,10,12,12,12,12,12,12, + 12,11,12,12,12,11,11,11,12,12,12,12,12,12,12,11, + 12,11,12,11,11,13,12,12,12,13,12,12,12,12,11,12, + 11,11,13,13,13,12,12,12,12,12,12,11,11,11,10,13, + 13,13,12,13,12,13,11,13,10,12,11,11,13,13,12,13, + 12,12,12,12,11,12,11,11,11, +}; + +static const static_codebook _44p0_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p0_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p0_l0_0, + 0 +}; + +static const long _vq_quantlist__44p0_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p0_l0_1[] = { + 1, 4, 4, 6, 6, 5, 5, 5, 7, 5, 5, 5, 5, 6, 7, 7, + 6, 7, 7, 7, 6, 7, 7, 7, 7, +}; + +static const static_codebook _44p0_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p0_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p0_l0_1, + 0 +}; + +static const long _vq_quantlist__44p0_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44p0_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p0_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p0_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p0_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44p0_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p0_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p0_long[] = { + 2, 3, 6, 7,10,14,16, 3, 2, 5, 7,11,14,17, 6, 5, + 5, 7,10,12,14, 7, 7, 6, 6, 7, 9,13,10,11, 9, 6, + 6, 9,11,15,15,13,10, 9,10,12,18,18,16,14,12,13, + 16, +}; + +static const static_codebook _huff_book__44p0_long = { + 2, 49, + (long *)_huff_lengthlist__44p0_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p0_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p1_0[] = { + 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p0_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p0_p1_0, + 0 +}; + +static const long _vq_quantlist__44p0_p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p2_0[] = { + 1, 5, 5, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, + 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 0, 6, 6, 0,11, + 11, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0,12,12, + 0,15,15, 0,12,12, 0, 5, 5, 0, 5, 5, 0, 6, 6, 0, + 7, 7, 0,11,11, 0, 6, 6, 0, 7, 7, 0,10,11, 0, 6, + 6, 0, 7, 7, 0,11,11, 0,12,12, 0,11,11, 0,15,15, + 0,10,10, 0,12,12, 0,15,15, 0,12,12, 0, 6, 6, 0, + 12,12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0,12, + 12, 0,15,15, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0,12,12, 0,12,12, 0,12,12, 0,15, + 15, 0,12,12, 0,11,12, 0,15,16, 0,11,11, 0, 6, 6, + 0,11,12, 0,12,12, 0,12,12, 0,16,15, 0,12,12, 0, + 13,12, 0,15,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p0_p2_0 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p2_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p0_p2_0, + 0 +}; + +static const long _vq_quantlist__44p0_p2_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p2_1[] = { + 1, 3, 3, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0, + 10,10, 0,10,10, 0, 9, 9, 0,10,10, 0, 7, 7, 0, 7, + 7, 0, 6, 6, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 9, + 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 9, 9, 0, 8, 8, 0, + 10,10, 0, 9, 9, 0,10,10, 0,10,10, 0, 9, 9, 0,10, + 10, 0, 9, 9, 0,11,11, 0,11,11, 0,12,12, 0,11,11, + 0,12,12, 0,13,13, 0,12,12, 0,13,12, 0, 8, 8, 0, + 12,12, 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0,13, + 13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0,11,11, 0,12,12, 0,13,13, 0,12, + 12, 0,13,13, 0,13,13, 0,12,12, 0,12,12, 0, 8, 8, + 0,12,12, 0,12,12, 0,13,13, 0,13,13, 0,13,14, 0, + 14,13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p0_p2_1 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p2_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p0_p2_1, + 0 +}; + +static const long _vq_quantlist__44p0_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p3_0[] = { + 1, 6, 6, 7, 8, 8, 7, 8, 8, 7, 9, 9,10,12,11, 9, + 8, 8, 7, 9, 9,11,12,12, 9, 9, 9, 6, 7, 7,10,11, + 11,10,11,11,10,11,11,13,13,14,12,12,12,11,11,11, + 14,14,14,12,12,12, 6, 5, 5, 9, 6, 5, 9, 6, 6, 9, + 7, 7,12,10,10,11, 6, 6,10, 7, 7,13,10,10,12, 7, + 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, + 13, 9, 9,12,11,11,16,13,13,15,11,11, 8, 7, 7,12, + 12,12,12,11,11,12,11,11,14,14,14,14,12,12,12,12, + 12,16,15,15,14,12,12, 0,10,10, 0,12,12, 0,12,12, + 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, + 11,11, 8, 8, 8,13,11,11,13,10,10,13,11,11,15,13, + 13,14,11,11,12,10,10,16,14,14,14,10,10, 9, 7, 7, + 13,11,11,13,11,11,12,11,11,16,14,14,14,12,12,13, + 12,12,15,14,14,15,13,12, 0,11,11, 0,12,12, 0,12, + 12, 0,12,12, 0,15,15, 0,12,12, 0,13,12, 0,14,15, + 0,12,12, +}; + +static const static_codebook _44p0_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p3_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p0_p3_0, + 0 +}; + +static const long _vq_quantlist__44p0_p3_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p0_p3_1[] = { + 2, 4, 4, 8, 8,10,12,12,11,11, 9,11,11,12,13,11, + 12,12,11,11,11,12,12,12,12,10,13,12,13,13,11,12, + 12,13,13,11,12,12,13,13,11,12,13,13,13,11,13,13, + 13,13,10,13,13,12,13,11,12,12,14,14,11,13,12,12, + 12,11,12,12,13,13,11,13,13,12,12,11,13,13,13,13, + 11,12,12,13,13,11,13,13,12,12,11,12,12,13,13,11, + 13,13,12,12,11,13,13,13,13,11,12,12,14,14,11,13, + 13,12,12,11,12,12,13,13,11,13,13,12,12,11,10,10, + 10,10,12,10,10,11,11,11, 8, 8,11,11,13,10,10,10, + 10,12,10,10,10,10,13,11,11,11,11,13,10,10,11,11, + 13,11,11,12,12,13,11,11,11,11,13,11,11,12,12,13, + 11,11,12,12,13,10,10,11,11,13,11,11,11,11,13,11, + 10,11,11,13,11,11,11,11,13,11,11,11,11,13,10,10, + 11,11,13,11,11,11,11,12,10,11,11,11,13,11,11,11, + 11,13,11,11,11,11,13,10,10,11,11,13,11,11,11,11, + 13,11,11,11,11,13,11,11,11,11,11,10,10,10,10,12, + 10,10, 9, 9,12,12,12,11,11,13,12,12, 9, 9,13,12, + 12,10,10,12,12,12,12,12,13,13,13,14,14,13,12,12, + 11,11,13,13,13,12,12,13,12,12,11,11,13,12,13,11, + 11,13,13,13,14,14,13,12,12,10,10,13,13,13,11,11, + 13,12,12,10,10,13,13,13,11,11,13,13,13,14,14,13, + 12,12,10,10,13,13,13,11,11,13,12,13,10,10,13,13, + 13,11,11,13,13,13,14,14,13,12,12,10,10,13,13,13, + 11,11,13,13,12,10,10,14,12,12, 8, 8,14,12,12, 9, + 9,14,11,11, 9, 9,14,12,12, 8, 8,14,11,11, 7, 7, + 14,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, + 12,12, 9, 9,15,13,13,10,10,15,13,13,10,10,15,12, + 12,10,10,15,13,13,10,10,14,12,12, 9, 9,14,13,13, + 9, 9,14,13,13, 9, 9,15,12,12, 9, 9,15,13,13, 9, + 9,14,12,12, 9, 9,14,13,13, 9, 9,14,13,13, 9, 9, + 15,12,12, 9, 9,14,13,13, 9, 9,14,12,12, 9, 9,14, + 13,13, 9, 9,13,12,12, 8, 8,13,13,13, 8, 8,14,13, + 13, 9, 9,13,13,13, 7, 7,14,13,13, 8, 8,14,14,14, + 10,10,14,14,14,11,11,14,14,14, 9, 9,14,14,14,10, + 10,14,14,14, 9, 9,14,14,14,10, 9,15,14,14,11,11, + 14,14,14, 9, 9,14,14,14,10,10,14,14,14, 9, 9,14, + 14,14, 9, 9,15,14,14,11,11,14,14,14, 8, 8,14,14, + 14, 9, 9,14,14,14, 8, 8,14,14,14, 9, 9,15,14,14, + 11,11,14,14,14, 8, 8,14,14,14, 9, 9,14,14,14, 8, + 8,12,12,12,13,13,16,15,15,11,11,16,15,16,12,12, + 17,16,16,11,11,17,15,15,12,11,16,16,16,12,13,16, + 15,15,13,13,16,16,16,12,12,16,16,15,13,13,16,16, + 16,12,12,16,16,16,13,13,17,16,16,14,14,17,17,16, + 12,12,17,16,16,13,13,17,17,16,12,13,16,16,17,13, + 12,17,16,16,14,13,17,16,16,12,12,17,16,16,12,12, + 17,16,17,12,12,17,17,17,13,13,16,16,16,13,14,17, + 17,16,12,12,16,16,16,13,13,17,17,17,12,12,13,14, + 14,10,10,16,14,14,12,12,16,15,15,14,14,16,14,14, + 12,12,15,14,14,13,13,17,15,15,14,13,16,16,15,15, + 15,16,15,15,14,14,16,15,15,14,14,17,15,15,14,14, + 16,15,15,14,14,16,16,15,15,15,17,15,15,13,13,16, + 15,15,14,14,17,15,15,13,13,17,15,15,14,14,16,15, + 15,15,15,16,14,14,13,13,16,15,15,14,14,16,14,14, + 13,13,17,15,15,14,14,16,16,15,15,15,17,14,14,13, + 13,16,15,15,14,14,17,14,14,13,13,13,11,11,10,10, + 16,14,14,13,13,15,14,14,13,13,16,14,14,12,12,16, + 14,14,12,12,15,15,15,14,14,16,14,14,14,14,16,15, + 14,14,14,16,14,14,14,14,16,15,15,14,13,16,15,15, + 14,14,16,14,14,14,14,17,15,15,14,14,16,14,14,14, + 14,16,15,15,13,14,16,15,15,14,14,16,14,14,14,14, + 16,15,15,13,13,16,14,14,13,13,16,15,15,13,13,16, + 15,15,14,14,16,14,14,14,14,17,15,15,13,13,16,15, + 14,13,13,17,15,15,13,13,14,14,14, 9, 9,14,14,14, + 17,17,14,15,15,18,18,14,14,14,18,19,14,14,14,18, + 18,15,15,15,19,18,15,16,15,18,20,15,15,15,18,19, + 15,15,15,19,19,15,15,15,18,20,15,15,15,18,19,15, + 15,16,20,18,15,15,15,18,18,15,15,15,19,19,15,15, + 15,18,19,15,15,15,18,19,15,15,15,19,19,14,15,14, + 19,19,15,15,15,20,19,15,14,14,19,18,14,15,15,18, + 19,15,15,16,20,20,14,14,14,18,19,15,15,15,19,18, + 14,14,14,18,18,14,12,12, 9, 9,13,14,14,18,18,14, + 13,13,18,19,14,14,14,18,18,14,14,14,18,18,15,15, + 15,19,19,15,14,14,19,18,14,15,15,19,18,15,14,14, + 18,18,15,15,15,19,18,14,15,15,19,19,15,14,14,19, + 18,14,15,15,19,18,15,14,14,19,18,14,15,15,19,18, + 15,15,15,21,18,15,14,14,19,18,14,15,15,18,19,14, + 15,14,20,19,14,15,15,18,19,14,15,15,19,19,15,14, + 14,19,20,14,15,15,18,18,14,14,14,19,19,14,15,15, + 19,18,12,12,12,13,13,16,15,15,11,11,16,15,15,12, + 12,16,16,16,11,11,16,15,15,11,11,16,16,16,13,13, + 17,16,16,13,13,17,17,17,12,12,16,16,16,13,13,17, + 16,17,13,12,15,16,16,12,12,16,15,15,13,13,17,16, + 16,12,12,16,16,15,12,12,16,16,16,12,12,17,17,16, + 13,12,16,16,16,13,13,17,16,16,12,12,17,16,16,12, + 12,17,17,16,12,12,16,17,16,12,12,17,15,15,13,13, + 17,16,16,12,12,16,16,16,12,12,16,16,16,12,12,13, + 13,13, 9, 9,15,14,14,13,13,16,15,14,14,14,16,14, + 14,13,13,15,14,14,13,13,17,15,15,14,14,16,15,15, + 15,15,16,15,15,14,14,16,15,15,15,15,17,15,15,14, + 14,16,15,15,14,14,16,15,15,15,15,17,14,15,14,14, + 16,15,15,14,14,17,15,15,13,14,17,15,15,14,14,16, + 15,15,15,15,17,14,14,13,13,16,15,15,14,14,17,14, + 14,13,13,17,15,15,14,14,16,15,16,15,15,17,14,14, + 13,13,16,15,15,14,14,18,14,14,13,13,13,11,11,11, + 11,15,14,14,12,12,15,14,14,13,13,16,14,14,12,12, + 16,13,14,12,12,16,15,15,13,13,16,14,14,14,14,16, + 15,15,13,13,16,14,14,13,13,16,14,15,13,13,15,15, + 15,13,13,16,14,14,14,13,16,14,14,13,13,16,14,14, + 13,13,16,15,15,13,13,16,15,15,13,13,16,14,14,14, + 14,16,15,15,12,12,16,14,14,13,13,16,15,15,12,12, + 16,15,15,13,13,16,14,14,14,14,17,15,14,12,12,16, + 14,14,13,13,16,15,15,12,12,14,14,14, 8, 8,14,14, + 14,17,18,14,15,15,17,18,14,14,14,17,18,14,14,14, + 18,18,14,15,15,18,18,14,16,15,19,19,15,15,15,18, + 19,15,16,15,20,19,15,15,15,18,18,14,15,15,18,19, + 15,16,16,20,19,15,15,15,19,17,14,15,15,20,18,14, + 15,15,18,18,14,15,15,18,19,14,15,15,19,20,14,14, + 14,18,18,14,15,15,18,19,14,14,14,18,19,14,15,15, + 19,18,15,16,16,20,21,14,14,15,19,19,14,15,15,19, + 19,14,14,14,19,18,13,12,12, 9, 9,13,14,14,18,19, + 14,14,14,18,19,14,14,14,18,18,14,14,14,18,18,14, + 15,15,19,19,15,14,14,19,18,15,15,15,19,19,15,14, + 14,19,20,14,15,15,18,19,14,15,15,20,18,15,14,14, + 18,18,14,15,15,18,18,14,14,14,19,19,14,15,15,18, + 18,14,15,15,19,18,15,14,14,19,19,14,15,15,19,18, + 15,14,14,19,18,14,14,15,18,19,14,15,15,19,18,15, + 14,14,18,19,14,15,14,19,20,14,14,14,19,19,14,15, + 15,19,19,12,12,12,13,13,16,16,16,11,11,16,16,16, + 12,12,17,16,16,11,11,17,15,15,11,11,16,16,16,13, + 13,17,15,16,13,13,16,16,16,12,12,17,16,16,13,13, + 17,17,16,12,12,17,17,16,13,13,17,16,16,13,13,17, + 17,17,12,12,17,16,16,13,13,17,17,17,12,12,16,16, + 16,12,12,17,15,15,13,13,17,16,16,11,11,17,16,16, + 12,12,16,16,16,11,11,16,17,16,12,12,17,16,16,13, + 13,17,17,16,12,12,17,17,16,12,12,17,16,16,11,11, + 13,14,14, 9, 9,16,14,14,13,13,16,14,15,14,14,16, + 14,14,12,12,16,14,14,13,13,17,15,15,14,14,16,15, + 15,15,15,17,15,15,14,14,16,15,15,14,14,17,15,15, + 14,14,16,15,15,14,14,16,15,15,15,16,17,14,15,14, + 14,16,15,15,14,14,17,15,15,14,14,16,15,15,14,14, + 16,15,15,15,15,17,14,14,13,13,16,15,15,14,14,16, + 14,14,13,13,17,15,15,14,14,16,16,15,15,15,17,14, + 14,13,13,16,15,15,14,14,17,14,14,13,13,13,11,11, + 10,10,16,14,14,12,12,15,13,13,13,12,16,14,14,11, + 11,16,14,14,11,11,16,14,15,13,14,16,14,14,13,13, + 16,15,15,13,13,16,14,14,13,13,16,15,15,13,13,16, + 15,15,13,13,17,14,14,14,14,17,15,15,13,13,16,14, + 15,13,13,16,15,15,13,13,16,15,15,13,13,16,14,14, + 13,13,17,15,15,12,12,16,14,14,12,12,16,15,15,12, + 12,16,15,15,13,13,16,14,14,13,13,17,15,15,12,12, + 17,14,14,12,12,16,15,15,12,12,13,14,14, 8, 8,13, + 14,14,18,18,13,15,15,17,18,14,14,14,18,19,14,14, + 14,19,18,14,15,15,19,18,15,15,16,21,18,15,15,15, + 19,19,14,16,16,19,19,14,15,15,18,19,14,15,15,19, + 20,14,16,16,19,18,15,15,15,18,19,14,15,15,19,18, + 15,15,15,18,18,15,15,15,20,18,15,16,16,20,19,14, + 15,14,18,19,14,15,16,19,20,14,15,15,19,18,15,15, + 15,19,18,15,16,16,20,19,15,14,14,18,18,14,15,15, + 19,19,14,15,15,18,18,13,12,12, 8, 8,13,14,14,19, + 18,14,13,13,20,18,14,14,14,19,18,14,13,13,18,19, + 14,15,15,20,19,15,14,14,19,19,14,15,15,19,18,15, + 14,14,20,20,15,15,15,19,18,14,15,15,19,18,15,14, + 14,19,18,14,15,15,20,19,14,14,14,20,19,14,15,15, + 19,18,15,15,15,18,18,15,14,14,18,18,14,15,15,19, + 19,14,14,14,19,19,14,15,15,19,19,15,15,15,19,18, + 15,14,14,20,19,15,15,15,19,19,14,14,14,20,19,14, + 15,15,20,20,12,12,12,13,13,17,16,16,11,11,16,16, + 15,12,12,17,16,16,11,11,17,15,15,11,11,17,17,17, + 13,13,17,16,16,13,13,17,17,17,12,12,17,16,16,13, + 13,17,17,16,12,13,16,17,16,13,13,17,16,15,13,13, + 17,16,16,12,12,17,16,16,12,13,17,16,17,12,12,17, + 17,17,12,12,17,16,15,13,13,17,16,16,12,12,17,16, + 16,12,12,17,16,16,11,11,16,16,16,12,12,17,15,15, + 13,13,17,16,15,11,11,16,16,16,12,12,17,16,16,11, + 11,13,14,14, 9, 9,16,14,14,13,13,16,14,15,14,14, + 16,14,14,12,12,16,14,14,13,13,17,15,15,14,15,16, + 15,15,15,15,17,15,15,14,14,16,15,15,15,14,16,15, + 15,14,14,16,15,15,14,14,16,15,16,15,15,17,15,14, + 14,14,16,15,15,14,14,17,15,15,13,13,16,15,15,14, + 14,16,16,16,15,15,17,14,14,13,13,16,15,15,14,14, + 18,14,15,13,13,16,15,15,14,14,16,16,15,15,15,16, + 14,14,13,13,16,15,15,14,14,17,14,15,13,13,13,11, + 11,10,10,15,14,14,12,12,15,14,14,13,13,16,14,14, + 12,12,16,13,14,12,12,16,14,15,14,13,16,14,14,14, + 14,16,15,15,13,13,16,14,14,13,13,16,15,15,13,13, + 15,15,15,13,13,16,14,14,14,14,17,15,15,13,13,16, + 14,14,13,13,16,15,15,13,13,16,15,15,13,13,16,14, + 14,13,13,17,15,15,12,12,16,14,14,12,12,16,14,15, + 12,12,16,15,15,13,13,16,14,14,13,13,17,15,15,12, + 12,16,14,14,12,12,16,15,15,12,12,14,14,14, 8, 8, + 14,14,14,17,17,14,15,15,18,18,14,14,14,18,17,14, + 14,14,18,18,14,15,15,18,20,15,16,15,19,18,15,15, + 15,19,18,15,15,16,19,18,15,15,15,18,18,14,15,15, + 18,18,15,16,16,18,19,15,15,15,18,18,15,15,15,19, + 20,15,15,15,18,18,15,15,15,18,18,15,16,16,19,19, + 15,14,15,19,19,15,15,15,19,20,14,14,15,18,18,15, + 15,15,19,19,15,16,16,19,19,15,15,14,18,19,15,15, + 15,20,20,15,15,14,18,18,13,12,12, 8, 8,13,14,14, + 18,18,14,14,14,18,18,14,14,14,18,20,14,14,14,18, + 18,14,15,15,19,18,15,14,14,18,19,15,15,15,18,19, + 15,14,14,18,19,15,15,15,18,18,14,15,14,18,19,15, + 14,14,21,19,15,15,15,19,18,14,14,14,19,18,14,15, + 15,19,18,15,15,15,20,19,15,14,14,20,18,14,15,15, + 18,19,14,14,14,19,18,14,15,15,18,19,15,15,15,18, + 19,15,14,14,19,19,15,15,15,19,19,14,14,14,19,20, + 14,15,15,18,19, +}; + +static const static_codebook _44p0_p3_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p0_p3_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p0_p3_1, + 0 +}; + +static const long _vq_quantlist__44p0_p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p0_p4_0[] = { + 2, 6, 6,14,14, 6, 8, 8,14,14, 7, 7, 7,14,14, 0, + 13,13,15,16, 0,13,13,15,15, 7, 8, 8,15,15, 9,10, + 10,16,16, 9, 8, 8,14,15, 0,13,13,17,17, 0,13,13, + 16,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,14, + 14, 0,13,13,17,17, 0,13,13,15,15, 0,14,14,16,16, + 0, 0, 0,18,19, 0,12,12,16,15, 0,16,16, 0,20, 0, + 14,14,16,16, 0,14,14,17,17, 0, 0, 0,19,19, 0,12, + 12,15,15, 0,18,17,21,21, 0,14,14,16,16, 5, 7, 7, + 12,13, 9,10, 9,14,14,11,10,10,14,14, 0, 0, 0,18, + 17, 0,20,21,18,18, 9,10,10,14,14,12,12,12,17,16, + 12,10,10,14,14, 0,20,20,18,17, 0,21,21,17,17,11, + 10,10,14,14,15,13,13,18,18,13,11,11,14,14, 0,20, + 0,18,18, 0,20,21,18,17, 0,21, 0,18,19, 0, 0, 0, + 0,21, 0,21,20,16,17, 0, 0, 0,21,21, 0, 0, 0,20, + 18, 0,20, 0,17,18, 0, 0, 0, 0, 0, 0, 0,20,16,17, + 0, 0, 0,20, 0, 0, 0, 0,18,18, 6, 6, 6,13,13, 8, + 5, 5,11,11, 9, 6, 6,13,13, 0, 9, 9,12,12, 0,10, + 10,14,14, 9, 7, 7,13,13,12, 9, 9,13,13,10, 6, 6, + 13,13, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, + 13,13,10,10,13,13,11, 6, 6,13,13, 0,10,10,15,15, + 0,10,10,13,13, 0,12,11,15,15, 0,20,19,17,16, 0, + 9, 9,13,13, 0,13,13,20,19, 0,11,11,13,13, 0,11, + 11,15,15, 0,20,19,17,17, 0,10,10,13,13, 0,14,15, + 0,21, 0,12,12,13,13, 0,10,10,12,12, 0,11,11,15, + 15, 0,11,11,15,15, 0,15,15,20,20, 0,16,16, 0, 0, + 0,11,11,15,15, 0,14,14,17,17, 0,11,11,15,15, 0, + 15,15,20,21, 0,16,16,21,21, 0,12,12,15,15, 0,15, + 15,18,20, 0,11,11,16,15, 0,15,15,21,21, 0,16,16, + 0,21, 0,16,16, 0, 0, 0, 0, 0, 0, 0, 0,14,14,21, + 21, 0,17,18, 0, 0, 0,16,17,20, 0, 0,16,16, 0, 0, + 0, 0, 0, 0, 0, 0,15,15,20,20, 0,19,18, 0,21, 0, + 18,17, 0, 0, 0,10,10,11,11, 0,10,10,10,10, 0,11, + 11,12,12, 0,11,11, 9, 9, 0,13,13,12,12, 0,11,11, + 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,12,12,13, + 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, + 0,10,10,12,12, 0,13,13,13,13, 0,12,12,12,12, 0, + 14,13,13,13, 0,19,21,15,15, 0,12,11,12,12, 0,16, + 15,19,19, 0,13,13,11,11, 0,13,13,13,13, 0, 0,21, + 15,16, 0,12,12,12,12, 0,16,16,19,21, 0,13,13,12, + 12, 7, 7, 7,16,16,11, 9, 9,16,16,12, 9, 9,16,16, + 0,13,13,16,16, 0,14,14,17,16,11, 9, 9,16,16,14, + 12,11,17,17,13, 8, 9,15,15, 0,13,13,19,19, 0,13, + 13,16,15,12,10,10,17,17,15,12,12,19,18,14, 9, 9, + 17,16, 0,14,14,18, 0, 0,14,13,16,16, 0,14,15,18, + 17, 0,21, 0,19,21, 0,12,12,16,16, 0,16,16, 0, 0, + 0,14,14,16,16, 0,14,14,18,18, 0, 0,21,20, 0, 0, + 13,13,16,17, 0,18,18, 0, 0, 0,15,14,17,16, 8, 7, + 7,14,14,11,10,10,15,15,13,10,10,15,15, 0,21,20, + 19,19, 0,21, 0,17,18,11,10,10,15,16,14,12,12,18, + 18,14,11,11,15,14, 0,21,20,18,19, 0, 0,21,18,18, + 12,11,11,16,16,16,14,14,18,20,14,11,11,16,15, 0, + 20,20,19,19, 0, 0,20,18,18, 0,21, 0,18,19, 0, 0, + 0, 0, 0, 0,20,20,17,18, 0, 0, 0,20,20, 0, 0, 0, + 19,19, 0, 0, 0,20,18, 0, 0, 0, 0, 0, 0, 0,21,18, + 18, 0,21,21, 0,21, 0, 0, 0,19,20,11, 9, 9,14,14, + 13,10,10,14,14,13,11,11,15,15, 0,13,13,13,13, 0, + 14,14,16,16,13,11,11,15,15,16,12,12,15,15,14,10, + 10,14,14, 0,14,14,16,16, 0,14,14,15,15,13,10,10, + 15,15,17,13,14,15,16,15,10,10,15,15, 0,14,14,17, + 16, 0,14,14,15,15, 0,15,15,17,17, 0, 0,21,18,18, + 0,13,13,15,15, 0,16,16,21,20, 0,14,14,15,14, 0, + 15,14,16,17, 0, 0,20,20,19, 0,13,13,15,15, 0,19, + 18, 0, 0, 0,15,15,15,15, 0,11,11,14,14, 0,12,12, + 16,16, 0,12,12,16,16, 0,15,16,21,21, 0,16,17,21, + 0, 0,12,12,17,16, 0,14,14,18,19, 0,11,11,16,16, + 0,15,15,20,21, 0,16,16,21, 0, 0,12,12,17,16, 0, + 15,15,19,19, 0,12,12,16,17, 0,16,15, 0, 0, 0,16, + 16, 0, 0, 0,17,17, 0,21, 0, 0, 0, 0, 0, 0,14,15, + 20, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,17,16, 0, + 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,18,18, 0, 0, + 0,18,17, 0, 0, 0,11,11,14,14, 0,12,12,15,15, 0, + 12,12,15,15, 0,13,13,14,14, 0,14,14,17,17, 0,12, + 12,16,16, 0,14,14,16,16, 0,11,11,15,15, 0,13,13, + 16,17, 0,13,13,16,16, 0,12,12,15,15, 0,14,14,17, + 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,16,16, + 0,15,15,17,18, 0,21,20,20,21, 0,12,12,15,15, 0, + 16,16,20,21, 0,14,14,15,15, 0,14,14,17,17, 0, 0, + 0,18,19, 0,12,13,15,15, 0,18,17,21, 0, 0,14,15, + 15,15, 8, 8, 8,16,16,12,10,10,16,16,13, 9, 9,16, + 16, 0,14,14,18,17, 0,14,14,16,17,12,10,10,18,17, + 14,12,11,18,18,14, 9, 9,16,16, 0,13,13,18,18, 0, + 13,13,17,16,12, 9, 9,16,17,17,13,13,17,17,14, 9, + 9,15,15, 0,14,14,20,19, 0,13,13,16,16, 0,15,15, + 19,18, 0, 0, 0,20,19, 0,12,13,17,17, 0,16,16,20, + 0, 0,14,14,16,17, 0,14,14,19,18, 0, 0, 0,20,20, + 0,13,13,16,16, 0,18,17, 0, 0, 0,15,15,16,16, 9, + 7, 7,14,14,12,10,10,15,15,13,10,10,15,15, 0,21, + 0,18,19, 0,20,21,19,18,12,10,10,16,15,15,13,13, + 18,18,14,11,11,15,15, 0, 0, 0,19,18, 0, 0,21,18, + 18,13,11,11,15,15,16,14,14,17,19,15,11,11,15,15, + 0,21,21,20,18, 0, 0,21,18,18, 0, 0,21,21,19, 0, + 0, 0, 0, 0, 0,19,20,18,17, 0, 0, 0,21,21, 0,21, + 0,20,18, 0, 0,21,19,19, 0, 0, 0, 0, 0, 0,20,21, + 17,17, 0, 0, 0, 0, 0, 0,21, 0,18,20, 0,10,10,14, + 14, 0,11,11,15,15, 0,11,11,15,15, 0,14,14,15,15, + 0,15,15,16,16, 0,11,12,16,16, 0,13,13,16,16, 0, + 11,11,15,15, 0,14,14,17,17, 0,14,14,15,15, 0,11, + 11,16,15, 0,14,14,15,15, 0,11,11,15,15, 0,15,15, + 17,17, 0,14,14,15,15, 0,16,16,18,18, 0, 0, 0,20, + 19, 0,14,13,16,15, 0,17,17,21, 0, 0,15,15,15,15, + 0,16,15,17,16, 0,20, 0,20,18, 0,13,14,15,15, 0, + 19,18, 0,21, 0,15,15,15,15, 0,11,11,14,14, 0,12, + 12,16,16, 0,12,12,16,16, 0,16,15,20,21, 0,17,16, + 0, 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16, + 16, 0,15,15,21,20, 0,16,16, 0, 0, 0,12,12,16,17, + 0,15,14,19,19, 0,11,12,16,16, 0,15,15,21, 0, 0, + 16,16, 0, 0, 0,16,17, 0, 0, 0, 0, 0, 0, 0, 0,15, + 15,21, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,17,16, + 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0,20, 0,19,20, 0, + 0, 0,17,17, 0, 0, 0,12,12,15,15, 0,12,12,15,15, + 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, + 13,13,17,16, 0,14,14,17,17, 0,11,11,16,16, 0,14, + 14,17,17, 0,13,13,16,16, 0,12,12,16,16, 0,15,15, + 16,17, 0,11,11,15,16, 0,14,14,17,17, 0,13,14,16, + 16, 0,15,15,18,18, 0,21,20,20,19, 0,13,13,16,17, + 0,16,16, 0, 0, 0,14,14,16,16, 0,15,15,18,18, 0, + 0, 0,20,19, 0,13,13,16,16, 0,17,17, 0, 0, 0,14, + 14,16,16, 0,11,11,16,16, 0,13,13,18,17, 0,13,13, + 17,17, 0,16,16,17,17, 0,16,16,17,18, 0,12,12,17, + 17, 0,15,15,18,18, 0,12,12,16,16, 0,16,16,19,19, + 0,15,15,16,17, 0,12,12,17,17, 0,17,17,18,18, 0, + 12,12,17,17, 0,16,16,19,19, 0,15,16,17,17, 0,16, + 16,18,17, 0, 0, 0,21,21, 0,13,13,16,16, 0,17,17, + 0,20, 0,15,15,16,17, 0,16,16,19,18, 0, 0,21,20, + 21, 0,14,14,17,16, 0,20, 0, 0, 0, 0,15,16,16,17, + 0, 9, 9,14,14, 0,13,13,16,16, 0,14,14,15,15, 0, + 0,20,19,19, 0, 0, 0,19,19, 0,12,12,15,15, 0,15, + 16,19,18, 0,14,14,15,15, 0,21, 0,18,18, 0,20, 0, + 17,18, 0,13,13,16,16, 0,17,17,17,19, 0,14,14,16, + 15, 0,21,20,20,19, 0, 0, 0,19,19, 0, 0, 0,19,18, + 0, 0, 0, 0, 0, 0,20,20,17,18, 0, 0, 0,21,21, 0, + 0, 0,18,18, 0,21, 0,18,19, 0, 0, 0, 0, 0, 0,20, + 21,18,18, 0, 0, 0,20,21, 0, 0, 0,19,19, 0,18,18, + 15,15, 0,20,21,17,17, 0,19,21,17,17, 0, 0, 0,17, + 18, 0, 0, 0,20,19, 0,19,19,17,17, 0, 0, 0,18,18, + 0,19,20,16,17, 0, 0,21,20,20, 0,19,20,19,18, 0, + 19,20,16,16, 0, 0, 0,18,19, 0,19,20,17,17, 0, 0, + 21, 0,20, 0,21,21,17,19, 0,20, 0,19,20, 0, 0, 0, + 20, 0, 0,19,18,17,16, 0, 0, 0, 0, 0, 0, 0,20,17, + 17, 0,20,21,18,20, 0, 0, 0, 0,21, 0,19,20,17,17, + 0, 0, 0, 0, 0, 0,20,21,17,17, 0,11,11,14,14, 0, + 13,13,16,17, 0,13,13,16,16, 0,17,17, 0,21, 0,18, + 17,21, 0, 0,13,13,16,16, 0,15,15,18,18, 0,12,12, + 16,16, 0,17,16,21, 0, 0,17,17, 0, 0, 0,12,12,17, + 17, 0,17,17,19,21, 0,13,12,16,16, 0,17,17, 0, 0, + 0,17,17, 0, 0, 0,18,17, 0,21, 0, 0, 0, 0, 0, 0, + 15,15,20, 0, 0,20,18, 0, 0, 0,17,18, 0, 0, 0,16, + 17, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,19,19, + 0, 0, 0,18,18, 0, 0, 0,14,14,18,18, 0,16,16, 0, + 21, 0,16,16,21,21, 0,17,17, 0,20, 0,17,17,20, 0, + 0,16,15, 0, 0, 0,20,20, 0, 0, 0,15,15,20,20, 0, + 17,17,21, 0, 0,17,18,20,20, 0,15,15,20,20, 0,18, + 18, 0, 0, 0,15,15,19,20, 0,17,18, 0, 0, 0,17,17, + 20,20, 0,18,17,21, 0, 0, 0, 0, 0,21, 0,15,15,20, + 20, 0,19,19, 0, 0, 0,17,17,21, 0, 0,17,17, 0, 0, + 0, 0, 0,21, 0, 0,15,15,19,19, 0,20,21, 0, 0, 0, + 18,17,21,21, 0,12,12,16,16, 0,14,14,17,17, 0,13, + 13,17,18, 0,16,16,18,17, 0,16,16,18,18, 0,13,13, + 18,18, 0,15,16,19,18, 0,13,13,16,16, 0,16,16,20, + 18, 0,16,16,17,17, 0,12,13,17,17, 0,17,16,18,18, + 0,12,12,16,16, 0,17,16,20,19, 0,16,16,16,16, 0, + 16,17,18,20, 0, 0, 0,21,20, 0,14,14,17,16, 0,19, + 18, 0,20, 0,16,16,17,16, 0,16,16,17,18, 0, 0,21, + 21,21, 0,14,14,16,16, 0,20,20,21, 0, 0,16,16,16, + 16, 0,10,10,14,14, 0,14,14,15,16, 0,14,14,15,15, + 0, 0,21,18,18, 0, 0,21,18,19, 0,13,13,16,16, 0, + 16,16,18,18, 0,14,14,15,15, 0,21, 0,18,18, 0,21, + 0,18,18, 0,13,13,16,16, 0,17,17,19,20, 0,14,14, + 15,15, 0, 0, 0,18,20, 0, 0,21,18,18, 0, 0,21,19, + 18, 0, 0, 0, 0, 0, 0,20,21,18,17, 0, 0, 0,21,21, + 0, 0, 0,19,19, 0,21, 0,18,19, 0, 0, 0, 0, 0, 0, + 21,20,17,17, 0, 0,21,20, 0, 0, 0, 0,19,19, 0,19, + 20,15,16, 0, 0,20,18,17, 0,20,21,17,18, 0,21, 0, + 18,18, 0, 0, 0,19,19, 0,20,20,17,18, 0, 0, 0,18, + 19, 0,20,20,18,17, 0, 0, 0, 0,20, 0, 0,21,17,18, + 0,20,21,17,17, 0, 0, 0,18,18, 0,19,19,17,17, 0, + 0, 0,21,21, 0,20,20,17,17, 0, 0, 0,21,19, 0, 0, + 0,20,19, 0,21,20,17,18, 0, 0, 0, 0, 0, 0, 0,20, + 18,17, 0,21,20,18,18, 0, 0, 0,20,21, 0,20,20,17, + 17, 0, 0, 0, 0, 0, 0,20, 0,17,17, 0,11,11,13,14, + 0,13,13,16,16, 0,13,13,16,16, 0,17,17, 0, 0, 0, + 17,18, 0, 0, 0,13,13,16,16, 0,15,16,18,18, 0,13, + 13,16,17, 0,16,17,20, 0, 0,17,18,20, 0, 0,13,13, + 17,17, 0,16,16,20,21, 0,13,13,16,16, 0,17,17,21, + 0, 0,17,18, 0, 0, 0,17,18, 0,21, 0, 0, 0, 0, 0, + 0,15,15,20, 0, 0,19,19, 0, 0, 0,17,17, 0, 0, 0, + 18,17,21,20, 0, 0, 0, 0, 0, 0,16,16,20,21, 0,21, + 20, 0,21, 0,19,21, 0, 0, 0,15,15, 0, 0, 0,16,17, + 0,19, 0,16,16, 0, 0, 0,17,17, 0, 0, 0,19,18, 0, + 0, 0,16,16,20,20, 0,20,18,21, 0, 0,15,15,21,21, + 0,18,18, 0, 0, 0,18,19, 0, 0, 0,16,15, 0,21, 0, + 20,19, 0, 0, 0,16,16, 0, 0, 0,20,18, 0,21, 0,17, + 18,21, 0, 0,18,19, 0, 0, 0, 0, 0, 0, 0, 0,16,16, + 20,20, 0,19,20, 0, 0, 0,17,17, 0, 0, 0,18,17,20, + 21, 0, 0, 0, 0, 0, 0,16,16, 0,20, 0,20,22, 0, 0, + 0,18,18, 0,22, +}; + +static const static_codebook _44p0_p4_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p0_p4_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p0_p4_0, + 0 +}; + +static const long _vq_quantlist__44p0_p4_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p0_p4_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p0_p4_1 = { + 1, 7, + (long *)_vq_lengthlist__44p0_p4_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p0_p4_1, + 0 +}; + +static const long _vq_quantlist__44p0_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p5_0[] = { + 1, 6, 6, 6, 8, 8, 7, 8, 8, 7, 9, 8,10,11,11, 9, + 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7,10,10, + 10,10,10,10,10,10,10,14,13,13,12,11,11,10,10,10, + 14,14,13,13,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 8, + 7, 7,11, 9, 9, 9, 7, 7, 8, 7, 7,12,10,10,10, 7, + 7, 7, 8, 8,12,11,11,12,10,10,11,10,10,14,13,13, + 13,10,10,11,10,11,16,14,14,13,10,10, 7, 8, 7,12, + 12,12,12,11,11,12,11,11,16,14,15,13,12,12,11,11, + 11,17,15,14,14,13,13,10, 9, 9,13,11,11,13,11,11, + 12,11,11,16,14,13,14,11,11,12,11,11,16,15,14,14, + 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,14, + 13,13,11,11,12,10,10,16,14,14,13,10,10, 8, 8, 8, + 12,12,12,12,11,11,12,11,11,16,14,15,14,12,12,12, + 11,11,16,15,15,14,12,12,10,10,10,13,11,11,13,11, + 11,12,12,12,16,14,14,14,11,11,12,11,11,17,14,15, + 14,11,11, +}; + +static const static_codebook _44p0_p5_0 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p5_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p0_p5_0, + 0 +}; + +static const long _vq_quantlist__44p0_p5_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p5_1[] = { + 2, 7, 7, 7, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 9, 8, + 7, 7, 8, 8, 8, 9, 9, 9, 9, 7, 7, 6, 6, 6, 9, 7, + 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, + 10, 8, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 6, 6, 9, + 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 8, 8, 9, 7, + 7, 7, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, 9, + 12, 8, 8,12, 9, 9,12,10, 9,12, 8, 8, 8, 7, 7,10, + 9, 9,11, 9, 9,11, 9, 9,11,11,10,11, 9, 9,11,10, + 9,11,10,11,11, 9, 9,10, 8, 8,11, 9, 9,11, 9, 9, + 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, + 9, 9, 9, 8, 8,12, 9, 9,12, 9, 9,11, 9, 9,12, 9, + 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 9, 7, 7, + 11, 9,10,11,10, 9,11, 9, 9,11,11,11,11, 9, 9,11, + 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11,10, + 10,11,10, 9,11,10,10,11, 9, 9,11,10,10,11,10,11, + 11, 9, 9, +}; + +static const static_codebook _44p0_p5_1 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p5_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p0_p5_1, + 0 +}; + +static const long _vq_quantlist__44p0_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p0_p6_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p0_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p0_p6_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p0_p6_0, + 0 +}; + +static const long _vq_quantlist__44p0_p6_1[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p0_p6_1[] = { + 1, 3, 2, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11,12,12,12,14,14,14,15,15, +}; + +static const static_codebook _44p0_p6_1 = { + 1, 25, + (long *)_vq_lengthlist__44p0_p6_1, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p0_p6_1, + 0 +}; + +static const long _vq_quantlist__44p0_p6_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p0_p6_2[] = { + 3, 4, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p0_p6_2 = { + 1, 25, + (long *)_vq_lengthlist__44p0_p6_2, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p0_p6_2, + 0 +}; + +static const long _huff_lengthlist__44p0_short[] = { + 3, 3, 7, 8,10,13,16, 3, 2, 5, 7, 9,13,16, 6, 4, + 4, 6,10,14,15, 7, 5, 5, 7,10,13,14, 9, 8, 9, 9, + 9,11,13,12,11,12, 9, 7, 8,11,14,12,10, 6, 5, 7, + 10, +}; + +static const static_codebook _huff_book__44p0_short = { + 2, 49, + (long *)_huff_lengthlist__44p0_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p1_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p1_l0_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 4, 6, 5, + 8, 6, 9, 8,10, 9,10,10,11,10, 5, 5, 6, 6, 8, 8, + 9, 9,10,10,10,10,11, 7, 8, 8, 9, 8,10, 9,10, 9, + 11,10,11,10, 7, 8, 8, 8,10, 9,10,10,10,10,11,10, + 11, 9,10,10,11,11,11,11,12,11,12,11,12,11, 9,10, + 10,11,11,11,11,11,11,11,12,11,12,11,11,11,12,12, + 12,12,12,12,12,12,12,11,11,12,11,12,12,12,12,12, + 12,12,12,11,12,12,12,12,12,13,12,13,12,12,12,12, + 12,12,12,12,12,13,13,13,13,12,13,12,12,12,12,12, + 13,13,12,13,12,13,12,13,12,12,12,12,13,13,13,13, + 13,13,12,12,12,12,12,11,12, +}; + +static const static_codebook _44p1_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p1_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p1_l0_0, + 0 +}; + +static const long _vq_quantlist__44p1_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p1_l0_1[] = { + 1, 4, 4, 6, 6, 5, 5, 5, 6, 6, 5, 6, 5, 6, 6, 6, + 6, 7, 7, 7, 6, 7, 6, 7, 7, +}; + +static const static_codebook _44p1_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p1_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p1_l0_1, + 0 +}; + +static const long _vq_quantlist__44p1_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44p1_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p1_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p1_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p1_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44p1_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p1_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p1_long[] = { + 3, 3, 7, 7, 9,13,16, 3, 2, 4, 6,10,13,17, 7, 4, + 4, 6, 9,12,14, 7, 6, 6, 5, 7, 9,12,10,10, 9, 6, + 6, 9,12,14,14,13, 9, 8,10,11,18,18,15,13,11,10, + 11, +}; + +static const static_codebook _huff_book__44p1_long = { + 2, 49, + (long *)_huff_lengthlist__44p1_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p1_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p1_0[] = { + 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p1_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p1_p1_0, + 0 +}; + +static const long _vq_quantlist__44p1_p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p2_0[] = { + 1, 4, 4, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, + 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 0, 6, 6, 0,11, + 11, 0,11,11, 0,12,12, 0,14,14, 0,11,11, 0,12,12, + 0,14,14, 0,11,11, 0, 6, 6, 0, 6, 5, 0, 7, 6, 0, + 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 7, + 7, 0, 7, 7, 0,10,10, 0,11,11, 0,11,11, 0,14,14, + 0,10,10, 0,12,12, 0,14,14, 0,12,12, 0, 6, 6, 0, + 11,11, 0,11,11, 0,12,12, 0,14,14, 0,11,11, 0,12, + 12, 0,15,15, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0,11,11, 0,11,11, 0,12,12, 0,15, + 15, 0,12,12, 0,11,11, 0,15,15, 0,11,11, 0, 6, 6, + 0,11,11, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, + 12,12, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p1_p2_0 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p2_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p1_p2_0, + 0 +}; + +static const long _vq_quantlist__44p1_p2_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p2_1[] = { + 1, 3, 3, 0, 8, 8, 0, 8, 8, 0,10,10, 0, 9, 9, 0, + 10,10, 0,10,10, 0, 9, 9, 0,10,10, 0, 7, 7, 0, 7, + 7, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 9, 9, + 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, + 10,10, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0,10, + 10, 0, 8, 8, 0,11,11, 0,11,11, 0,12,12, 0,11,11, + 0,12,12, 0,12,12, 0,12,12, 0,12,12, 0, 8, 8, 0, + 11,11, 0,11,11, 0,13,12, 0,12,12, 0,13,12, 0,13, + 13, 0,12,12, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0,11,11, 0,11,11, 0,13,12, 0,12, + 12, 0,12,12, 0,12,12, 0,11,11, 0,12,12, 0, 8, 8, + 0,12,12, 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0, + 13,13, 0,12,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p1_p2_1 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p2_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p1_p2_1, + 0 +}; + +static const long _vq_quantlist__44p1_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p3_0[] = { + 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, + 8, 8, 7, 9, 9,11,12,12, 9, 8, 8, 6, 7, 7, 9,11, + 11,10,11,11,10,11,11,13,13,13,11,12,12,10,11,11, + 13,14,14,12,12,12, 6, 6, 6, 8, 6, 6, 8, 6, 6, 9, + 7, 7,12,10,10,10, 6, 6, 9, 7, 7,12,10,10,11, 7, + 6, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, + 13,10,10,12,11,11,15,13,13,14,11,11, 8, 7, 7,12, + 11,11,12,11,11,11,11,11,14,14,14,13,12,12,12,11, + 11,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,12,12, + 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, + 11,11, 7, 8, 8,13,10,10,12,10,10,12,11,11,15,13, + 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, + 12,11,11,13,11,11,12,11,11,15,14,14,14,12,12,13, + 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, + 12, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,15,14, + 0,12,12, +}; + +static const static_codebook _44p1_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p3_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p1_p3_0, + 0 +}; + +static const long _vq_quantlist__44p1_p3_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p1_p3_1[] = { + 2, 3, 4, 7, 7,10,12,12,12,12,10,11,11,13,13,11, + 12,12,11,11,12,12,12,12,12,11,13,13,13,13,12,12, + 12,13,14,12,13,13,13,13,12,13,13,13,13,12,13,13, + 13,13,11,13,13,13,13,12,12,12,14,14,12,13,13,12, + 12,12,12,13,13,13,12,13,13,13,13,12,13,13,13,13, + 12,12,12,14,14,12,13,13,12,12,12,13,13,13,13,12, + 13,13,12,12,12,13,13,13,13,12,12,12,14,14,12,13, + 13,12,12,12,13,13,13,13,12,13,13,12,12,10,10,11, + 10,10,11,11,11,11,11,11, 9, 9,10,10,12,11,11,10, + 10,12,10,10,10,10,13,12,12,12,12,13,11,11,11,11, + 13,12,12,12,12,13,11,11,11,11,13,12,12,12,12,13, + 12,12,12,12,13,11,11,11,11,13,12,12,12,12,13,11, + 11,11,11,13,12,12,11,11,13,12,12,11,11,13,11,11, + 11,11,13,12,12,11,11,13,11,11,11,11,13,12,12,11, + 11,13,12,12,11,11,13,11,11,11,11,13,12,12,11,11, + 13,11,11,11,11,13,12,12,11,11,11,11,11,10,10,11, + 11,11, 9, 9,11,12,12,11,11,12,12,12, 9, 9,13,13, + 13,10,10,13,13,13,11,11,13,13,13,14,14,13,13,13, + 11,10,13,13,14,12,12,13,13,13,11,11,13,13,13,11, + 11,13,13,13,14,14,13,13,13,10,10,13,13,13,11,11, + 13,13,13,10,10,13,14,13,11,11,13,14,14,14,14,13, + 13,13,10,10,13,14,14,11,11,13,13,13,10,10,13,14, + 14,11,11,13,13,13,14,14,14,13,13,10,10,13,14,14, + 11,11,13,13,13,10,10,14,12,12, 9, 9,14,12,12, 9, + 9,14,11,11, 9, 9,14,12,12, 8, 8,14,11,11, 7, 7, + 15,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, + 12,12,10,10,15,13,13,10,10,15,13,13,10,10,15,12, + 12,10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, + 10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, 9, + 9,15,12,12, 9, 9,14,13,13, 9, 9,15,13,13,10,10, + 15,12,12,10,10,15,13,13, 9, 9,15,12,12, 9, 9,15, + 13,13, 9, 9,13,12,12, 9, 9,13,13,13, 8, 8,13,13, + 13, 9, 9,13,13,13, 7, 7,14,13,13, 8, 8,14,14,14, + 10,10,15,14,14,11,11,14,14,14, 9, 9,15,14,14,10, + 10,15,14,14, 9, 9,14,14,14,10,10,15,14,14,11,11, + 15,14,14, 9, 9,14,14,14,10,10,14,14,14, 9, 9,15, + 14,15,10,10,15,14,14,11,11,14,14,14, 9, 9,14,14, + 14, 9, 9,14,14,14, 8, 8,15,14,14,10,10,15,14,14, + 11,11,14,14,14, 9, 9,15,14,14, 9, 9,14,14,14, 8, + 8,12,12,12,13,13,16,16,16,11,11,17,16,16,12,12, + 17,16,16,11,11,17,16,16,11,11,17,17,16,13,13,17, + 16,16,13,13,18,17,16,12,12,17,16,16,13,13,17,16, + 17,12,12,18,17,17,13,13,17,16,16,14,14,18,17,17, + 12,12,18,16,16,13,13,17,17,17,13,12,17,17,17,13, + 13,17,16,16,13,13,18,17,17,12,12,17,16,16,13,12, + 17,17,17,12,12,18,17,17,13,13,18,16,16,14,14,18, + 17,17,12,12,17,17,17,13,13,18,17,18,12,12,13,14, + 14,10,10,16,14,14,13,13,17,15,15,14,14,17,14,14, + 12,13,16,14,14,13,13,17,15,15,14,14,16,16,16,15, + 15,17,15,15,14,14,17,16,16,14,15,17,15,15,14,14, + 17,15,16,14,14,17,16,16,15,15,17,15,15,13,13,17, + 15,15,14,14,18,15,15,13,14,17,15,15,14,14,16,16, + 16,15,15,17,15,15,13,13,17,15,15,14,14,17,15,15, + 13,13,17,15,15,14,14,16,16,16,15,15,17,15,15,13, + 13,17,15,15,14,14,18,15,15,13,13,13,11,11,10,10, + 16,14,14,13,12,16,14,14,13,13,16,15,14,12,12,16, + 14,14,12,12,16,15,15,14,14,16,14,14,14,14,17,15, + 15,13,13,16,15,15,14,14,17,15,15,13,14,17,15,15, + 14,14,17,15,14,14,14,17,15,15,13,13,17,15,15,14, + 14,17,15,15,13,13,17,15,15,14,14,17,14,14,14,14, + 17,15,15,13,13,17,15,15,13,13,17,15,15,13,13,17, + 15,15,14,14,17,15,15,14,14,17,15,15,13,13,17,15, + 15,13,13,17,15,15,13,13,14,14,15, 8, 8,14,14,14, + 19,19,14,15,15,18,19,14,14,14,19,18,14,14,14,19, + 19,15,15,15,19,18,15,16,16,19,19,15,15,15,19,19, + 15,16,16,20,19,15,15,15,19,19,15,15,15,19,19,16, + 16,16,20,19,15,15,15,19,18,15,16,16,20,19,15,15, + 15,18,18,15,15,15,19,20,15,16,16,19,19,15,15,15, + 20,19,15,15,15,20,19,15,15,15,19,18,15,15,15,19, + 19,15,16,16,19,20,15,15,15,19,19,15,15,15,19,20, + 15,15,15,19,19,14,12,12, 9, 9,14,14,14,19,19,14, + 14,14,19,19,14,14,15,20,19,15,14,14,18,19,15,15, + 15,19,19,15,15,14,20,19,15,15,15,20,19,15,15,14, + 20,19,15,15,15,20,19,15,15,15,19,20,15,14,14,19, + 20,15,15,15,20,20,15,14,14,20,19,15,15,15,19,19, + 15,15,15,19,19,15,14,14,19,19,15,15,15,19,20,15, + 15,15,20,20,15,15,15,19,19,15,15,15,20,19,16,14, + 14,19,19,15,15,15,20,19,15,14,15,20,19,14,15,15, + 20,19,12,12,12,13,13,16,16,16,11,11,16,16,16,12, + 12,17,16,16,11,11,17,15,16,11,11,17,17,17,13,13, + 18,16,17,13,13,18,17,17,13,12,17,16,17,13,13,17, + 17,17,13,13,16,16,16,12,12,17,16,16,13,13,17,16, + 16,12,12,17,16,16,12,13,17,17,17,12,12,17,17,17, + 13,13,18,16,16,13,13,18,17,17,12,12,18,17,17,12, + 12,17,17,17,12,12,17,17,17,12,12,17,16,16,13,13, + 17,17,17,12,12,17,16,16,12,12,17,17,17,12,12,13, + 14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,17,14, + 14,13,13,16,14,14,13,13,17,15,15,15,15,16,16,16, + 15,15,17,15,15,14,14,17,15,15,15,15,17,15,15,14, + 14,17,15,15,14,14,16,16,16,15,15,17,15,15,14,14, + 17,15,15,14,14,17,15,15,14,14,17,15,15,14,14,16, + 16,16,15,15,18,15,15,14,13,17,15,15,14,14,17,15, + 15,13,13,17,15,15,14,14,16,16,16,15,15,17,15,15, + 14,13,17,15,15,14,14,17,15,15,13,13,13,11,11,11, + 11,16,14,14,12,12,16,14,14,13,13,16,15,14,12,12, + 17,14,14,12,12,17,15,15,13,13,17,14,14,14,14,17, + 15,15,13,13,17,14,15,14,13,17,15,15,13,13,16,15, + 15,13,13,16,14,14,14,14,17,15,15,13,13,16,14,14, + 13,13,16,15,15,13,13,17,15,15,13,13,17,14,14,14, + 14,17,15,15,12,12,17,15,15,13,13,17,15,15,12,12, + 16,15,15,13,13,17,14,14,13,14,17,15,15,12,12,17, + 14,14,13,13,17,15,15,12,12,14,14,14, 8, 8,14,14, + 14,18,18,14,15,15,19,19,14,14,14,19,19,14,15,14, + 18,19,15,15,15,18,19,15,16,16,20,20,15,15,15,19, + 20,15,16,16,19,20,15,15,15,19,20,15,15,16,19,19, + 15,16,16,20,20,15,15,15,20,19,15,16,16,20,19,15, + 15,15,19,20,15,15,15,19,19,15,16,16,20,19,15,15, + 15,19,19,15,16,15,20,19,15,15,15,19,19,15,15,15, + 19,20,15,16,16,20,20,15,15,15,19,19,15,15,15,20, + 20,15,15,15,19,19,14,12,12, 9, 9,14,14,14,18,18, + 14,14,14,19,20,14,14,14,18,18,14,14,14,18,19,15, + 15,15,19,20,15,14,14,19,19,15,15,15,19,19,15,14, + 15,19,19,15,15,15,18,20,15,15,15,19,19,15,14,14, + 19,19,15,15,15,20,19,15,15,14,20,20,15,15,15,19, + 19,15,15,15,19,19,15,14,14,19,19,15,15,15,19,19, + 15,14,14,19,20,14,15,15,19,19,15,15,15,19,19,15, + 14,14,20,19,15,15,15,19,19,15,14,14,20,19,15,15, + 15,19,19,13,12,12,13,13,17,17,16,11,11,16,16,16, + 12,12,17,17,16,11,11,17,16,16,11,11,17,17,17,13, + 13,17,16,16,13,13,18,17,17,12,12,17,16,16,13,13, + 18,17,17,12,12,18,17,17,13,13,18,16,17,13,13,17, + 17,17,12,12,18,17,17,13,13,18,17,17,12,12,17,16, + 17,12,12,17,16,16,13,13,17,16,16,11,11,17,16,16, + 12,12,17,17,17,11,11,17,17,17,12,12,18,16,16,13, + 13,18,17,17,12,11,17,16,16,12,12,18,17,17,11,11, + 13,14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,17, + 14,14,12,12,16,14,14,13,13,17,15,15,14,14,17,16, + 16,15,16,18,15,15,14,14,17,15,15,14,14,17,15,15, + 14,14,18,15,15,14,14,16,16,16,15,16,18,15,15,14, + 14,17,16,15,14,14,18,15,15,14,14,17,15,15,14,14, + 17,16,16,15,15,18,14,15,13,13,17,15,15,14,14,18, + 15,15,13,13,17,15,15,14,14,17,16,15,15,15,17,15, + 15,13,13,17,15,15,14,14,18,15,15,13,13,13,11,11, + 10,10,16,14,14,12,12,16,14,14,12,12,17,14,15,11, + 11,17,14,14,11,11,17,15,15,13,13,17,14,14,14,13, + 17,15,15,13,13,16,15,15,13,13,17,15,15,13,13,17, + 15,15,13,13,17,14,14,14,14,17,15,15,13,13,17,14, + 15,13,13,16,15,15,13,13,17,15,15,13,13,17,14,14, + 13,13,17,15,15,12,12,16,14,14,12,12,17,15,15,12, + 12,17,15,15,13,13,17,14,14,13,13,17,15,15,12,12, + 17,14,14,12,12,17,15,15,12,12,13,15,14, 8, 8,14, + 14,14,19,19,14,15,15,18,19,14,14,14,18,19,14,15, + 14,19,19,15,16,15,19,19,15,16,16,19,20,15,15,15, + 19,19,15,16,16,19,19,15,16,16,19,19,15,15,15,19, + 19,15,16,16,20,20,15,15,15,19,19,15,15,15,19,19, + 15,15,15,19,19,15,15,15,19,19,15,16,16,20,19,15, + 15,15,19,19,15,15,15,19,19,15,15,15,19,19,15,16, + 15,19,19,15,16,16,21,19,15,15,15,20,20,15,15,15, + 20,21,15,15,15,19,20,14,12,12, 8, 8,14,14,14,19, + 19,14,13,13,19,19,14,14,14,19,19,14,13,14,19,19, + 15,15,15,20,20,15,14,14,20,19,15,15,15,19,20,15, + 14,14,19,20,15,15,15,20,19,15,15,15,19,20,15,14, + 14,20,20,15,15,15,20,19,15,14,14,19,19,15,15,15, + 19,19,15,15,15,20,19,15,14,14,21,19,15,15,15,20, + 21,15,14,14,21,19,15,15,15,19,19,15,15,15,20,20, + 15,14,14,19,21,15,15,15,19,19,15,14,14,19,20,15, + 15,15,19,19,13,12,12,13,13,17,16,16,11,11,17,16, + 15,12,12,18,16,16,11,11,17,16,16,11,11,18,17,17, + 13,13,18,16,16,13,13,17,17,17,12,13,18,17,16,13, + 13,18,17,17,13,13,17,17,17,13,13,17,16,16,13,13, + 18,16,17,12,12,17,16,16,13,12,17,17,17,12,12,18, + 17,17,13,12,18,16,16,13,13,18,17,17,12,12,17,16, + 16,12,12,17,17,17,11,11,17,16,16,12,12,17,16,16, + 13,13,17,16,16,11,11,17,16,16,12,12,17,17,17,11, + 11,13,14,14, 9, 9,16,14,14,13,13,16,15,15,14,14, + 17,14,14,12,12,16,14,14,13,13,17,15,15,14,14,17, + 15,16,15,15,17,15,15,14,14,17,15,16,14,15,18,15, + 15,14,14,17,15,15,14,14,16,16,16,15,15,18,15,15, + 13,14,17,15,15,14,14,18,15,15,14,14,17,15,15,14, + 14,17,16,16,15,15,17,15,15,13,13,17,15,15,14,14, + 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, + 15,15,13,13,17,15,15,14,14,18,15,15,13,13,13,11, + 11,10,10,16,14,14,12,12,16,14,14,13,13,17,14,14, + 11,11,17,14,14,12,12,17,15,15,14,14,17,14,14,14, + 14,17,15,15,13,13,17,15,14,13,13,16,15,15,13,13, + 16,15,15,13,13,17,14,14,14,14,17,15,15,13,13,17, + 14,14,13,13,16,15,15,13,13,16,15,15,13,13,17,14, + 14,13,13,17,15,15,12,12,17,14,14,12,12,16,15,15, + 12,12,17,15,15,13,13,17,14,14,13,13,17,15,15,12, + 12,17,14,14,12,12,16,15,15,12,12,14,14,14, 8, 8, + 14,14,14,18,18,14,15,15,19,18,14,14,14,18,18,14, + 14,14,18,19,15,16,15,19,19,15,17,16,20,20,15,15, + 15,19,19,15,16,16,19,19,15,15,15,19,19,15,16,15, + 18,19,15,16,16,20,20,15,15,15,19,19,15,16,16,19, + 20,15,15,15,19,19,15,15,16,19,19,15,16,16,20,20, + 15,15,15,19,19,15,15,15,19,20,15,15,15,19,19,15, + 15,15,19,19,15,16,16,20,20,15,15,15,19,20,15,16, + 16,20,20,15,15,15,19,19,13,12,12, 8, 8,14,14,14, + 19,20,14,14,14,19,19,14,14,14,18,19,14,14,14,19, + 20,15,15,15,19,20,15,14,14,21,20,15,15,15,20,20, + 15,15,14,19,19,15,15,15,19,19,15,15,15,19,19,15, + 14,14,19,20,15,15,15,19,20,15,14,14,19,19,15,15, + 15,19,19,15,15,15,19,19,16,14,14,19,19,15,15,15, + 20,20,15,14,14,21,19,15,15,15,19,19,15,15,15,19, + 20,16,14,14,19,20,15,15,15,19,19,15,14,14,19,19, + 15,15,15,20,19, +}; + +static const static_codebook _44p1_p3_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p1_p3_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p1_p3_1, + 0 +}; + +static const long _vq_quantlist__44p1_p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p1_p4_0[] = { + 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,14,14, 0, + 13,13,16,16, 0,13,13,15,14, 7, 8, 8,15,15, 9,10, + 10,16,16, 9, 8, 8,15,15, 0,13,13,17,16, 0,13,13, + 15,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,14, + 14, 0,13,13,17,18, 0,13,13,15,15, 0,14,14,16,16, + 0, 0, 0,19,18, 0,12,12,16,15, 0,15,16, 0,20, 0, + 14,14,16,16, 0,14,14,17,17, 0, 0, 0,19,18, 0,12, + 12,15,15, 0,17,17, 0,20, 0,14,14,16,16, 5, 6, 7, + 12,12, 9, 9, 9,14,14,10,10,10,14,14, 0,21,21,18, + 17, 0,20,20,18,17, 9,10,10,14,14,12,12,12,16,16, + 12,10,10,14,14, 0,20,19,18,17, 0, 0,20,17,18,11, + 10,10,14,14,14,13,13,18,18,13,11,11,14,14, 0,20, + 20,17,18, 0,21,21,17,17, 0,21, 0,18,18, 0, 0, 0, + 0, 0, 0,20,19,16,17, 0, 0, 0,19,19, 0, 0, 0,18, + 18, 0,21,21,18,18, 0, 0, 0, 0, 0, 0,20,20,16,17, + 0, 0, 0,21,21, 0, 0, 0,18,19, 6, 6, 6,13,12, 8, + 6, 6,11,11, 8, 6, 6,13,13, 0, 9, 9,11,11, 0,11, + 10,14,14, 9, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, + 13,13, 0,10,10,14,15, 0,10,10,13,13, 9, 7, 7,13, + 13,13,10, 9,13,13,10, 6, 6,13,13, 0,10,10,15,14, + 0,10,10,13,13, 0,11,11,15,15, 0,19,20,17,17, 0, + 9, 9,13,13, 0,13,13,20,20, 0,11,11,13,13, 0,11, + 11,15,15, 0,19,19,17,17, 0,10,10,13,13, 0,15,15, + 20,20, 0,12,12,13,13, 0,10,10,12,12, 0,11,11,15, + 15, 0,11,11,15,15, 0,15,15,20, 0, 0,16,16, 0,21, + 0,11,11,15,15, 0,14,14,18,17, 0,11,11,15,15, 0, + 15,16,19,20, 0,16,16,21,21, 0,12,12,15,15, 0,15, + 14,18,18, 0,11,11,16,16, 0,15,15,21,21, 0,16,15, + 0, 0, 0,16,16,21, 0, 0, 0, 0, 0, 0, 0,14,14,20, + 20, 0,18,18, 0, 0, 0,16,17,21, 0, 0,16,16,21,21, + 0, 0, 0, 0, 0, 0,15,15,21,21, 0,20,19, 0,21, 0, + 17,17, 0, 0, 0,10,10,12,11, 0,10,10,10,11, 0,11, + 11,12,12, 0,11,11, 9, 9, 0,13,13,11,12, 0,11,11, + 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,12,12,13, + 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, + 0,10,10,12,12, 0,13,13,14,14, 0,12,12,12,12, 0, + 14,14,14,13, 0,19,20,15,15, 0,12,11,12,12, 0,15, + 15,21,20, 0,13,13,11,11, 0,13,13,13,13, 0,19, 0, + 15,15, 0,12,12,12,12, 0,17,16,19, 0, 0,13,13,12, + 12, 7, 7, 7,16,16,11, 9, 9,15,15,12, 9, 9,16,16, + 0,13,13,15,14, 0,14,14,17,16,10, 9, 9,16,16,14, + 11,11,17,16,12, 9, 8,15,15, 0,13,13,18,18, 0,13, + 13,15,15,12,10,10,18,17,15,12,12,17,17,14, 9, 9, + 16,16, 0,13,13,18,19, 0,14,13,17,16, 0,14,14,18, + 18, 0, 0, 0,20,21, 0,12,12,16,16, 0,16,16,20,21, + 0,14,14,17,16, 0,14,14,18,19, 0, 0, 0,19,21, 0, + 13,13,17,17, 0,17,17, 0,21, 0,15,15,16,16, 8, 7, + 7,14,14,11,10,10,15,15,12,10,10,15,15, 0,20,20, + 18,18, 0, 0, 0,17,17,11,10,10,16,16,14,12,12,18, + 17,14,11,11,15,15, 0,20,21,18,18, 0, 0,19,18,17, + 12,10,10,16,16,17,14,14,19,19,14,11,11,15,15, 0, + 21,21,19,19, 0,21,20,19,18, 0,21, 0,18,19, 0, 0, + 0, 0, 0, 0,20,20,18,17, 0,21, 0, 0, 0, 0, 0, 0, + 19,18, 0, 0, 0,18,19, 0, 0, 0, 0, 0, 0, 0,21,17, + 18, 0, 0, 0, 0,21, 0, 0,21,18,19,11, 9, 9,14,14, + 13,10,10,13,13,13,11,11,15,15, 0,13,13,12,12, 0, + 15,15,16,16,13,10,10,15,15,16,12,12,15,15,15,10, + 10,15,15, 0,14,13,16,15, 0,14,13,15,15,13,10,10, + 15,15,18,14,14,15,15,15,10,10,14,15, 0,14,14,16, + 16, 0,14,14,16,15, 0,15,15,17,16, 0,21, 0,18,18, + 0,12,13,15,15, 0,16,16, 0, 0, 0,14,14,15,15, 0, + 15,15,16,16, 0,21,20,18,18, 0,13,13,15,15, 0,19, + 18, 0, 0, 0,15,15,15,15, 0,11,11,13,13, 0,12,12, + 16,16, 0,12,12,16,16, 0,15,16,20, 0, 0,16,17, 0, + 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16,17, + 0,15,15,20, 0, 0,16,16, 0, 0, 0,12,12,16,16, 0, + 15,15,19,19, 0,11,11,17,17, 0,16,16,21, 0, 0,16, + 16, 0, 0, 0,17,17,20,20, 0, 0, 0, 0, 0, 0,15,15, + 20, 0, 0,17,18, 0, 0, 0,17,17, 0, 0, 0,16,16, 0, + 21, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,19,18, 0, 0, + 0,18,17, 0, 0, 0,11,11,14,14, 0,11,11,15,15, 0, + 12,12,16,16, 0,13,13,14,14, 0,14,14,17,17, 0,12, + 12,16,16, 0,14,14,16,16, 0,11,11,16,15, 0,13,13, + 16,17, 0,13,13,16,16, 0,12,12,15,16, 0,15,14,16, + 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,16,16, + 0,15,14,18,18, 0,21, 0,19,19, 0,13,13,15,15, 0, + 16,16,20,20, 0,14,14,16,15, 0,14,14,17,17, 0,21, + 0,20,18, 0,13,13,15,15, 0,17,17, 0, 0, 0,14,14, + 16,15, 8, 8, 8,16,16,12, 9, 9,16,16,13, 9, 9,16, + 16, 0,14,14,18,17, 0,14,14,16,17,12,10,10,18,17, + 14,11,11,18,18,14, 9, 9,16,16, 0,13,13,18,18, 0, + 13,13,17,16,12, 9, 9,16,17,17,13,13,16,16,14, 9, + 9,15,15, 0,14,14,20,20, 0,13,13,15,15, 0,15,14, + 18,18, 0, 0, 0,20,21, 0,12,13,16,17, 0,16,16,20, + 21, 0,14,14,16,17, 0,14,14,18,17, 0, 0, 0,20,21, + 0,13,13,16,16, 0,19,17, 0,21, 0,14,15,16,16, 8, + 7, 7,14,13,12,10,10,15,15,13,10,10,15,15, 0,21, + 21,18,19, 0,20,21,18,18,12,10,10,16,15,15,12,12, + 17,17,14,11,11,15,15, 0,21,21,19,18, 0, 0,21,17, + 18,13,11,11,15,15,16,13,13,18,19,15,11,11,15,14, + 0,21, 0,19,19, 0, 0,21,18,18, 0, 0,21,19,19, 0, + 0, 0, 0, 0, 0,20,19,17,17, 0, 0, 0,21, 0, 0,21, + 0,18,19, 0, 0,20,20,19, 0, 0, 0, 0, 0, 0,21,20, + 18,17, 0, 0, 0, 0,20, 0, 0, 0,18,19, 0,10,10,15, + 14, 0,11,11,14,14, 0,11,11,15,16, 0,14,14,15,15, + 0,15,15,16,16, 0,11,11,16,16, 0,14,13,16,16, 0, + 11,11,15,15, 0,14,14,16,16, 0,14,14,15,15, 0,11, + 11,15,15, 0,13,13,15,15, 0,11,11,15,15, 0,15,15, + 18,17, 0,14,14,15,15, 0,15,16,18,18, 0, 0, 0,20, + 20, 0,14,13,16,15, 0,17,17,21, 0, 0,15,15,15,15, + 0,16,15,17,17, 0, 0, 0,19,19, 0,13,13,15,15, 0, + 20,19, 0, 0, 0,15,15,15,15, 0,11,11,13,13, 0,12, + 12,16,16, 0,12,12,16,16, 0,15,15,21,21, 0,17,16, + 0, 0, 0,12,12,16,16, 0,14,14,17,17, 0,11,11,16, + 16, 0,15,15, 0, 0, 0,16,16,21, 0, 0,12,12,17,16, + 0,14,15,20,20, 0,11,11,16,16, 0,15,15, 0,20, 0, + 16,16, 0,21, 0,16,17,21, 0, 0, 0, 0, 0, 0, 0,15, + 15, 0,21, 0,18,18, 0, 0, 0,17,16, 0, 0, 0,17,17, + 21, 0, 0, 0, 0, 0, 0, 0,15,15, 0,20, 0,19,20,21, + 0, 0,17,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, + 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, + 13,12,17,16, 0,14,14,17,16, 0,11,11,16,16, 0,14, + 14,17,17, 0,14,14,17,17, 0,12,12,16,16, 0,15,15, + 17,17, 0,11,11,16,16, 0,14,14,17,17, 0,14,14,16, + 16, 0,15,15,18,17, 0, 0, 0,19, 0, 0,13,13,16,16, + 0,16,16, 0,21, 0,14,14,16,16, 0,15,15,18,17, 0, + 0, 0,19,19, 0,13,13,16,16, 0,18,17, 0,21, 0,14, + 15,16,16, 0,11,11,16,16, 0,13,13,17,17, 0,13,13, + 17,17, 0,16,16,16,17, 0,16,16,18,18, 0,12,12,17, + 17, 0,16,15,18,17, 0,12,12,16,16, 0,16,15,19,19, + 0,16,15,17,17, 0,12,12,17,18, 0,16,16,18,18, 0, + 12,12,16,16, 0,16,16,19,19, 0,15,16,17,17, 0,15, + 16,18,18, 0, 0, 0,20,20, 0,13,13,16,16, 0,18,18, + 21,20, 0,15,15,16,16, 0,16,16,19,18, 0, 0, 0,19, + 20, 0,14,14,17,17, 0,19,19, 0,21, 0,15,16,16,16, + 0, 9, 9,14,14, 0,13,13,15,15, 0,14,14,15,15, 0, + 0,21,19,19, 0, 0,21,18,18, 0,12,12,15,15, 0,15, + 15,18,18, 0,14,13,15,15, 0,21,21,18,19, 0,21,20, + 18,18, 0,13,13,16,16, 0,17,17,18,19, 0,14,14,15, + 15, 0, 0,21,19,19, 0,21,20,18,19, 0,20,20,19,19, + 0, 0, 0, 0, 0, 0,19,20,17,17, 0, 0, 0,21,21, 0, + 21, 0,18,20, 0,21, 0,18,21, 0, 0, 0, 0, 0, 0,21, + 21,19,18, 0, 0, 0, 0, 0, 0, 0, 0,19,19, 0,18,18, + 15,15, 0,18,20,17,16, 0,20, 0,17,17, 0,21, 0,17, + 17, 0,21,20,19,20, 0,19,19,16,16, 0,21,21,17,18, + 0,19,19,17,17, 0,20,21,21,21, 0,20,20,18,18, 0, + 19,19,16,16, 0, 0,21,18,19, 0,18,19,16,17, 0,21, + 21,19,20, 0,21,19,18,18, 0,21,20,19,21, 0, 0, 0, + 20,21, 0,19,19,17,16, 0, 0, 0, 0, 0, 0,21,20,17, + 17, 0,20,21,19,18, 0, 0, 0, 0,21, 0,19,18,16,17, + 0, 0, 0, 0, 0, 0,20,20,17,17, 0,11,11,14,14, 0, + 13,13,16,16, 0,13,13,16,16, 0,17,17,21, 0, 0,17, + 18, 0, 0, 0,12,12,16,16, 0,15,15,17,18, 0,12,12, + 16,16, 0,16,16, 0,20, 0,17,17, 0,21, 0,12,12,17, + 17, 0,16,16,19,20, 0,12,12,17,17, 0,17,17, 0,20, + 0,17,17, 0, 0, 0,17,17,21, 0, 0, 0, 0, 0, 0, 0, + 15,15, 0,20, 0,19,19, 0, 0, 0,18,18, 0, 0, 0,17, + 17, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,20,19, + 0, 0, 0,19,18, 0, 0, 0,14,14,21,19, 0,16,16,20, + 21, 0,16,16,20,20, 0,17,17,20, 0, 0,17,17,20,20, + 0,15,15,20,20, 0,19,18,20, 0, 0,15,15,20,20, 0, + 17,18,21,20, 0,17,17,20,21, 0,15,15,19,19, 0,19, + 18,21,21, 0,15,15,19,20, 0,17,18, 0, 0, 0,17,17, + 20,20, 0,17,18,20,21, 0, 0, 0, 0, 0, 0,15,15,20, + 20, 0,19,19, 0, 0, 0,17,17,19,21, 0,17,17, 0,21, + 0, 0, 0, 0,21, 0,15,15,20,19, 0, 0,20, 0, 0, 0, + 17,17,21,20, 0,12,12,16,16, 0,14,14,17,17, 0,13, + 13,17,17, 0,16,16,17,18, 0,17,16,18,18, 0,13,13, + 18,17, 0,15,16,19,18, 0,13,13,16,16, 0,16,16,19, + 19, 0,16,16,17,17, 0,13,12,17,17, 0,16,16,18,17, + 0,12,12,16,16, 0,17,17,19,18, 0,16,15,16,16, 0, + 16,17,18,19, 0, 0, 0,20,20, 0,14,14,17,16, 0,18, + 18,21, 0, 0,16,16,16,16, 0,16,16,18,17, 0, 0,21, + 21,21, 0,14,14,16,16, 0,21,20,21, 0, 0,16,16,16, + 16, 0,10,10,14,14, 0,14,14,15,16, 0,14,14,15,15, + 0, 0,21,18,18, 0, 0,21,18,19, 0,13,13,16,16, 0, + 16,16,18,17, 0,14,14,15,15, 0,20, 0,18,18, 0,21, + 0,18,17, 0,13,13,16,15, 0,17,17,19,19, 0,14,14, + 15,15, 0,20,20,18,19, 0, 0, 0,18,17, 0, 0,21,18, + 18, 0, 0, 0, 0, 0, 0,20,21,18,17, 0, 0, 0, 0, 0, + 0, 0, 0,19,19, 0, 0,21,18,18, 0, 0, 0, 0, 0, 0, + 21, 0,18,17, 0, 0, 0, 0,21, 0, 0, 0,19,20, 0,19, + 19,16,16, 0, 0,21,18,17, 0,21, 0,18,18, 0,20, 0, + 19,18, 0,21,20,19,19, 0,21,19,17,18, 0, 0,21,19, + 19, 0,21,19,18,18, 0,21, 0,20,18, 0, 0,21,18,18, + 0,20,21,17,17, 0,21, 0,18,18, 0,21,19,17,17, 0, + 21, 0, 0,20, 0, 0,20,17,18, 0, 0, 0,19,20, 0, 0, + 0,20,19, 0,19,21,17,18, 0,21, 0, 0, 0, 0,21,21, + 18,17, 0, 0,21,18,18, 0, 0, 0, 0,21, 0,20,19,16, + 17, 0, 0, 0, 0, 0, 0,21,20,17,17, 0,11,11,13,13, + 0,13,13,16,16, 0,13,13,16,16, 0,17,17, 0,21, 0, + 18,19,21, 0, 0,12,12,16,16, 0,15,15,19,18, 0,13, + 13,16,16, 0,16,17,21,19, 0,17,17,21,21, 0,13,13, + 16,16, 0,16,16,20,18, 0,13,13,16,16, 0,17,17, 0, + 0, 0,18,18, 0, 0, 0,18,17, 0,20, 0, 0, 0, 0, 0, + 0,15,15,21,21, 0,19,18, 0, 0, 0,17,17,21,21, 0, + 17,17, 0, 0, 0, 0, 0, 0, 0, 0,15,15,20,21, 0,20, + 20, 0, 0, 0,19,19, 0, 0, 0,14,15,21,19, 0,16,16, + 0,21, 0,17,16,21,21, 0,17,18,21,20, 0,18,18, 0, + 21, 0,16,16, 0,20, 0,19,19, 0, 0, 0,16,15, 0,20, + 0,18,18, 0, 0, 0,17,17, 0,21, 0,16,16,20,20, 0, + 20,19, 0, 0, 0,15,16,21,22, 0,18,18, 0, 0, 0,18, + 17, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, + 21,20, 0,19,20, 0, 0, 0,18,17,21, 0, 0,17,18, 0, + 0, 0, 0, 0, 0, 0, 0,16,16, 0,20, 0, 0,20, 0, 0, + 0,18,18,22, 0, +}; + +static const static_codebook _44p1_p4_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p1_p4_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p1_p4_0, + 0 +}; + +static const long _vq_quantlist__44p1_p4_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p1_p4_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p1_p4_1 = { + 1, 7, + (long *)_vq_lengthlist__44p1_p4_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p1_p4_1, + 0 +}; + +static const long _vq_quantlist__44p1_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p5_0[] = { + 1, 6, 6, 7, 8, 8, 7, 8, 8, 7, 9, 8,10,11,11, 9, + 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7,10,10, + 10,10,10,10,10,10,10,14,13,13,12,11,11,10,10,10, + 14,14,13,12,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 9, + 7, 7,11,10,10, 9, 7, 7, 9, 7, 7,12,10,10,10, 7, + 7, 7, 8, 8,12,11,10,12,10,10,11,10,10,15,13,13, + 13,10,10,11,10,10,17,14,13,13,10,10, 7, 7, 7,12, + 11,12,12,11,11,12,11,11,16,14,14,13,12,12,12,11, + 11,17,15,14,14,12,12,10, 9, 9,13,11,11,13,11,11, + 13,11,11,17,14,13,14,11,11,12,11,11,16,15,14,14, + 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,15,13, + 13,14,11,10,12,10,10,16,14,14,14,10,10, 8, 7, 7, + 12,11,11,12,11,11,12,11,11,17,14,14,14,12,12,12, + 11,11,16,15,15,14,12,12,10,10,10,13,11,11,13,11, + 11,13,11,12,16,14,14,14,11,11,13,12,11,16,15,15, + 14,11,11, +}; + +static const static_codebook _44p1_p5_0 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p5_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p1_p5_0, + 0 +}; + +static const long _vq_quantlist__44p1_p5_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p5_1[] = { + 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 8, 8, 8, + 7, 7, 8, 8, 8, 9, 8, 8, 9, 7, 7, 6, 6, 6, 9, 8, + 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, + 10, 8, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 7, 7, 9, + 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 8, 8, 9, 7, + 7, 7, 8, 8,11, 9, 9,11, 9, 9,11, 8, 9,12, 9, 9, + 12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7,10, + 9, 9,10,10, 9,10, 9, 9,11,10,10,11, 9, 9,11, 9, + 9,11,10,11,11, 9, 9,10, 8, 8,11, 9, 9,10, 9, 9, + 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, + 9, 9, 9, 8, 8,11, 9, 9,12, 9, 9,11, 9, 9,12, 9, + 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 9, 7, 7, + 11, 9, 9,11,10,10,11, 9, 9,11,11,11,11, 9, 9,11, + 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11,10, + 10,11, 9, 9,11,10,10,11, 9, 9,11, 9,10,11,10,10, + 11, 9, 9, +}; + +static const static_codebook _44p1_p5_1 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p5_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p1_p5_1, + 0 +}; + +static const long _vq_quantlist__44p1_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p1_p6_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p1_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p1_p6_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p1_p6_0, + 0 +}; + +static const long _vq_quantlist__44p1_p6_1[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p1_p6_1[] = { + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,13,14,16,16,16,16, +}; + +static const static_codebook _44p1_p6_1 = { + 1, 25, + (long *)_vq_lengthlist__44p1_p6_1, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p1_p6_1, + 0 +}; + +static const long _vq_quantlist__44p1_p6_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p1_p6_2[] = { + 3, 4, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p1_p6_2 = { + 1, 25, + (long *)_vq_lengthlist__44p1_p6_2, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p1_p6_2, + 0 +}; + +static const long _huff_lengthlist__44p1_short[] = { + 4, 5, 7, 8,10,13,14, 4, 2, 4, 6, 8,11,12, 7, 4, + 3, 5, 8,12,14, 8, 5, 4, 4, 8,12,12, 9, 7, 7, 7, + 9,10,11,13,11,11, 9, 7, 8,10,13,11,10, 6, 5, 7, + 9, +}; + +static const static_codebook _huff_book__44p1_short = { + 2, 49, + (long *)_huff_lengthlist__44p1_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p2_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p2_l0_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 4, 6, 5, + 8, 7, 9, 8,10, 9,11,10,11,11, 4, 5, 6, 7, 8, 8, + 9, 9,10,10,10,10,11, 8, 9, 8,10, 8,10, 9,11,10, + 11,11,11,11, 8, 8, 9, 8,10, 9,10,10,11,11,11,11, + 11, 9,10,10,11,11,11,11,11,11,12,11,12,11, 9,10, + 10,10,11,11,11,11,11,11,12,11,12,10,11,11,12,11, + 12,12,12,12,12,12,12,12,10,11,11,11,11,12,12,12, + 13,12,12,12,12,11,12,12,12,12,13,13,12,12,12,12, + 12,12,11,12,12,12,12,13,13,12,13,12,12,12,12,12, + 13,13,13,13,13,13,12,13,12,13,12,12,12,13,13,13, + 13,13,13,13,12,13,12,12,12, +}; + +static const static_codebook _44p2_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p2_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p2_l0_0, + 0 +}; + +static const long _vq_quantlist__44p2_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p2_l0_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, + 5, 6, 6, 6, 5, 6, 5, 6, 6, +}; + +static const static_codebook _44p2_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p2_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p2_l0_1, + 0 +}; + +static const long _vq_quantlist__44p2_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44p2_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p2_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p2_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p2_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44p2_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p2_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p2_long[] = { + 3, 4, 9, 8, 8,10,13,16, 4, 2, 9, 5, 7,10,14,18, + 9, 7, 6, 5, 7, 9,12,16, 7, 5, 5, 3, 5, 8,11,13, + 8, 7, 7, 5, 5, 7, 9,11,10,10, 9, 8, 6, 6, 8,10, + 13,14,13,11, 9, 8, 9,10,17,18,16,14,11,10,10,10, +}; + +static const static_codebook _huff_book__44p2_long = { + 2, 64, + (long *)_huff_lengthlist__44p2_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p2_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p1_0[] = { + 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p2_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p2_p1_0, + 0 +}; + +static const long _vq_quantlist__44p2_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p2_p2_0[] = { + 1, 4, 4, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, + 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, + 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,11,10, 0, 0, 0, 0, 0, + 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, + 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, 0, + 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, + 0, 0, 0, 0, 0,10,10, 0, 0, 0,13,13, 0, 0, 0, 0, + 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, + 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, + 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, + 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,11, 0, 0, + 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, 0, + 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, 0, + 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, + 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, + 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, + 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, + 0, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10, + 10, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,14,13, + 0, 0, 0, 0, 0, 0, 0, 0,13,12, 0, 0, 0,13,13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11, + 11, 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, + 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, + 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, + 0, 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12, + 12, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0,12,12, + 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, + 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,14,14, 0, 0, + 0, 0, 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, + 12,12, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0,12, + 12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,14,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 11,11, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, 0, + 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, + 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, + 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,14,14, 0, 0, + 0, 0, 0, 0, 0, 0,14,14, 0, 0, 0, 0, 0, 0, 0, 0, + 12,12, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, +}; + +static const static_codebook _44p2_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p2_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p2_p2_0, + 0 +}; + +static const long _vq_quantlist__44p2_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p3_0[] = { + 1, 5, 5, 6, 7, 7, 0, 8, 8, 6, 9, 9, 8,11,11, 0, + 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 5, 7, 7, 7,10, + 10, 0,12,12, 8,11,11, 9,12,12, 0,11,12, 0,12,12, + 0,15,15, 0,12,12, 0, 6, 6, 0, 6, 6, 0, 7, 7, 0, + 7, 7, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, + 7, 6, 7, 7,10, 9, 9, 0,11,10,10, 9, 9,12,12,12, + 0,10,10, 0,11,11, 0,13,13, 0,11,11, 7, 6, 6,10, + 10,10, 0,11,11,11,11,11,12,12,12, 0,11,11, 0,12, + 12, 0,15,15, 0,11,11, 0,11,11, 0,11,11, 0,12,12, + 0,12,12, 0,14,14, 0,12,12, 0,12,12, 0,15,15, 0, + 11,11, 0, 8, 8, 0,10,10, 0,11,11, 0,11,11, 0,12, + 12, 0,12,12, 0,11,11, 0,15,15, 0,11,11, 0, 6, 6, + 0,10,10, 0,12,12, 0,10,10, 0,13,13, 0,12,12, 0, + 13,13, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p2_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p2_p3_0, + 0 +}; + +static const long _vq_quantlist__44p2_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p3_1[] = { + 2, 3, 3, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0, + 9, 9, 0, 9, 9, 0, 9, 9, 0, 8, 8, 0, 6, 6, 0, 7, + 7, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, + 0, 8, 8, 0, 8, 8, 0, 6, 6, 0, 6, 6, 0, 6, 6, 0, + 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 6, + 6, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0,10,10, 0,10,10, + 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0, 7, 7, 0, + 10,10, 0,10,10, 0,12,11, 0,12,12, 0,11,11, 0,11, + 11, 0,12,12, 0,10,10, 0, 7, 7, 0,10,10, 0,10,10, + 0,12,12, 0,11,12, 0,11,11, 0,11,11, 0,11,11, 0, + 10,10, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0,10,10, 0,10, + 10, 0,10, 9, 0,10,10, 0,10,10, 0, 9, 9, 0, 6, 6, + 0,10,10, 0,10,10, 0,11,11, 0,12,12, 0,11,11, 0, + 11,11, 0,12,12, 0,11,11, 0, 7, 7, 0, 9, 9, 0, 9, + 9, 0,11,11, 0,11,11, 0,10,10, 0,10,10, 0,11,11, + 0, 9, 9, +}; + +static const static_codebook _44p2_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p2_p3_1, + 0 +}; + +static const long _vq_quantlist__44p2_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p4_0[] = { + 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, + 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7, 9,11, + 11, 9,11,11,10,11,11,12,13,13,11,12,12,10,11,11, + 13,14,14,12,12,12, 6, 6, 6, 8, 6, 6, 8, 7, 7, 9, + 7, 7,11,10,10,10, 6, 6, 9, 7, 7,12,10,10,11, 6, + 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,14,13,13, + 13,10,10,12,11,11,15,13,13,14,10,10, 8, 7, 7,12, + 11,11,12,11,11,11,11,11,14,14,14,13,12,12,12,11, + 11,15,15,15,13,12,12, 0,10,10, 0,11,11, 0,11,11, + 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, + 11,11, 7, 8, 8,12,10,10,12,10,10,12,11,11,15,13, + 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, + 12,11,11,12,11,11,12,11,11,16,14,14,14,12,12,13, + 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, + 12, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,14,14, + 0,12,12, +}; + +static const static_codebook _44p2_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p2_p4_0, + 0 +}; + +static const long _vq_quantlist__44p2_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p2_p4_1[] = { + 3, 4, 4, 8, 8,11, 9, 9,12,12,11,10,10,12,12,12, + 10,10,11,11,12,12,12,12,12,12,11,11,13,13,12,12, + 12,13,13,12,10,10,12,12,12,11,11,13,13,12,13,13, + 13,13,12,11,11,13,13,12,12,12,13,13,12,10,10,12, + 12,12,11,11,13,13,12,13,13,12,12,12,11,11,13,13, + 12,13,13,13,13,12,11,11,12,12,12,11,11,12,12,12, + 13,13,12,12,12,13,13,13,13,12,13,13,13,13,13,13, + 13,12,12,12,13,13,13,13,12,13,13,12,12,11, 8, 8, + 10,10,12,11,11,11,11,12,10,10,10,10,13,11,11,10, + 10,13,11,11,10,10,13,12,12,12,12,13,11,11,11,11, + 13,12,12,11,11,13,12,12,11,11,13,12,12,12,11,13, + 12,12,12,12,13,11,11,11,11,13,12,12,11,11,13,11, + 12,11,11,13,12,12,11,11,14,12,12,11,11,13,11,11, + 11,11,14,12,12,11,11,13,11,12,10,10,14,12,12,11, + 11,14,12,12,11,11,14,11,11,11,11,14,12,12,11,11, + 13,12,12,11,11,14,12,12,11,11,11, 8, 8,10,10,12, + 7, 7,10,10,12, 9, 9,11,11,13, 9, 9, 9, 9,13,13, + 13,10,10,13, 9, 9,12,12,13,13,13,12,12,13, 9, 8, + 11,11,13,10,10,12,12,14,13,13,11,11,13, 9, 9,11, + 11,13,13,13,12,12,13, 9, 9,10,10,13,10,10,11,11, + 13,13,13,10,10,14,10,10,11,11,14,14,14,12,12,13, + 9, 9,10,10,13,10,10,11,11,14,13,14,10,10,14,14, + 14,11,12,14,14,14,14,14,14,13,13,10,10,13,14,14, + 11,11,14,14,14,10,10,14, 9, 9, 9, 9,14, 9, 9, 9, + 9,14,10,10, 9, 9,14,10,10, 8, 8,14,11,11, 8, 8, + 15,11,11,10,10,15,12,12,10,10,15,10,10,10,10,15, + 11,11,10,10,15,13,13,10,10,15,11,11,10,10,15,12, + 12,10,10,15,10,10,10,10,15,11,11,10,10,15,13,13, + 10,10,15,11,11,10,10,15,12,12,10,10,15,11,11, 9, + 9,15,11,11, 9, 9,15,13,13, 9, 9,15,13,13,10,10, + 15,12,12,10,10,15,13,13,10,10,15,13,12, 9, 9,15, + 13,13, 9, 9,14,12,12, 9, 9,14,13,13, 9, 9,14,13, + 13, 9, 9,14,13,13, 7, 7,14,13,13, 8, 8,15,14,14, + 10,10,15,14,14,10,10,15,14,14,10,10,15,14,14,10, + 10,15,14,14, 9, 9,15,14,14,10,10,15,14,14,10,10, + 14,14,14, 9, 9,15,14,14,10,10,14,14,14, 9, 9,15, + 14,14,10,10,15,14,14,10,10,14,14,14, 9, 9,14,14, + 14, 9, 9,14,14,14, 8, 8,15,14,14,10,10,15,14,14, + 11,11,15,14,14, 9, 9,15,14,14, 9, 9,14,14,14, 8, + 8,13, 9, 9,12,12,17,11,11,12,12,17,12,12,12,12, + 17,12,12,11,11,18,15,15,12,12,17,12,12,12,12,17, + 14,15,13,13,17,12,12,12,12,17,13,13,12,13,17,15, + 15,12,12,18,13,13,13,13,18,15,15,13,13,18,12,12, + 12,12,18,13,13,13,13,18,15,15,12,12,18,13,13,12, + 12,18,15,15,13,13,18,13,13,12,12,17,13,13,12,12, + 17,15,15,12,12,18,15,15,13,13,18,15,15,13,14,18, + 15,16,12,12,18,15,15,12,12,18,16,16,12,12,13, 8, + 8,10,10,14,15,14,11,11,14,15,15,12,12,15,14,14, + 12,11,15,15,15,12,12,15,15,15,12,12,15,15,15,13, + 13,15,15,15,12,12,15,15,15,13,13,15,15,15,13,13, + 15,15,15,13,13,15,15,16,13,13,15,15,15,12,12,15, + 15,15,13,13,15,15,15,13,13,15,15,15,13,13,15,15, + 15,13,13,15,15,14,12,12,15,15,15,12,12,16,15,14, + 12,12,16,15,15,13,13,16,16,16,13,13,16,15,15,12, + 12,15,15,15,13,13,15,15,15,12,12,13,12,12,10,10, + 14,14,14,11,11,15,14,14,12,12,15,14,14,11,11,15, + 14,14,11,11,15,15,15,13,13,15,14,14,13,13,15,15, + 15,12,12,15,14,15,13,13,16,15,15,12,12,15,15,15, + 13,13,16,14,14,13,13,15,15,15,12,12,15,15,15,13, + 13,16,15,15,12,12,16,15,15,12,12,16,14,14,13,13, + 15,15,15,11,11,15,15,15,12,12,16,15,15,11,11,16, + 15,15,13,13,16,14,15,14,14,16,15,15,12,12,16,15, + 14,12,12,16,15,15,12,12,14,10,10, 9, 9,14,11,11, + 12,12,14,12,12,13,13,14,12,12,12,12,15,14,14,13, + 13,15,13,13,14,14,15,14,14,15,15,15,12,12,13,13, + 15,13,13,14,14,15,14,14,13,13,15,13,13,13,14,15, + 14,14,15,15,15,12,12,13,13,15,13,13,14,14,15,14, + 14,13,13,15,13,13,14,14,15,14,14,15,15,15,13,13, + 12,12,15,13,13,13,13,15,14,14,13,12,15,15,15,14, + 15,15,15,14,20,20,15,14,14,13,13,15,14,14,13,13, + 15,14,14,13,13,14,12,12, 9, 9,14,14,14,12,12,14, + 13,13,12,13,14,14,14,12,12,15,14,14,12,12,15,14, + 14,14,13,15,14,14,14,14,15,14,14,13,13,15,14,14, + 13,13,15,15,15,14,14,15,14,14,13,13,15,14,14,14, + 14,15,14,14,13,13,15,14,14,13,13,15,15,15,15,14, + 15,15,15,13,13,15,14,14,14,14,15,14,14,13,13,15, + 14,14,13,13,14,15,15,14,14,15,15,15,14,14,15,14, + 14,14,14,15,15,15,14,14,15,14,14,13,14,15,15,15, + 14,14,13,10,10,12,12,17,11,11,12,12,17,12,12,12, + 12,17,12,12,11,11,17,15,15,12,11,18,13,13,13,13, + 18,15,15,13,13,17,12,12,12,12,18,13,13,13,13,17, + 15,15,12,12,17,12,12,12,12,17,15,15,13,13,17,12, + 12,12,12,17,13,13,12,12,17,15,15,12,12,18,14,13, + 12,12,18,15,15,13,13,18,13,13,12,12,18,13,13,12, + 12,18,16,16,12,12,18,16,16,12,12,18,15,15,13,13, + 18,16,16,12,12,17,15,15,12,12,17,16,16,12,12,13, + 8, 8,10,10,14,14,15,12,12,14,15,15,12,12,15,14, + 14,12,12,15,15,14,12,12,15,15,15,13,13,15,15,15, + 13,13,15,15,15,12,12,16,15,15,13,13,16,15,15,13, + 13,15,15,15,12,12,15,15,15,14,14,15,15,15,12,12, + 15,15,15,13,13,16,15,15,13,13,15,15,15,13,13,16, + 15,15,13,13,15,15,14,12,12,15,15,15,12,12,16,14, + 15,13,13,16,15,15,13,13,15,16,15,13,13,16,15,14, + 13,13,16,15,15,13,13,16,15,15,13,13,13,12,12,11, + 11,14,14,14,11,11,14,14,14,12,12,15,14,14,11,11, + 16,14,14,11,11,15,15,15,12,13,16,14,14,13,13,15, + 15,15,12,12,15,14,14,13,13,16,15,15,12,12,15,15, + 15,12,12,15,14,14,13,13,15,15,15,12,12,15,14,14, + 12,12,16,15,15,12,12,16,15,15,12,12,16,14,14,13, + 13,15,15,15,11,11,15,15,14,12,12,16,15,15,11,11, + 16,15,15,12,12,16,14,14,13,13,16,15,15,11,11,16, + 14,14,12,12,16,15,15,11,11,14,10,10, 9, 9,14,11, + 11,12,12,14,12,12,13,14,14,12,12,12,12,14,14,14, + 13,13,15,13,13,14,14,15,14,14,15,15,15,12,12,13, + 13,15,13,13,14,14,15,15,15,14,14,15,13,13,14,14, + 15,15,15,15,15,15,12,12,13,13,15,13,13,14,14,15, + 14,14,13,13,15,13,13,14,14,15,14,14,15,15,15,12, + 12,13,13,15,13,13,13,13,14,14,14,13,13,15,15,15, + 14,15,15,15,15,21,19,15,14,14,13,13,15,14,14,14, + 14,14,14,14,13,13,14,12,12, 9, 9,14,14,14,12,12, + 14,14,13,13,13,14,14,14,12,12,14,14,14,12,12,15, + 14,14,13,13,15,14,14,14,14,15,14,14,13,13,15,14, + 14,13,13,15,15,15,15,15,15,14,14,13,13,15,14,14, + 14,14,15,14,14,13,13,15,14,14,13,13,14,15,15,15, + 15,15,14,15,13,13,15,14,14,14,14,15,14,14,13,13, + 15,14,14,13,13,14,15,15,14,14,15,15,15,14,14,15, + 14,14,14,14,15,15,15,15,15,15,14,14,14,13,14,15, + 15,14,14,13,10,10,12,12,18,12,12,12,12,17,12,12, + 12,12,18,13,13,11,11,18,15,14,11,11,17,13,13,13, + 13,18,15,15,12,12,18,12,12,12,12,17,13,13,12,12, + 18,15,15,12,12,18,13,13,13,12,18,15,15,13,13,18, + 13,13,12,12,18,13,13,12,12,18,15,15,12,12,17,13, + 13,12,12,17,15,15,12,12,17,12,12,11,11,17,13,13, + 11,11,17,15,15,11,11,18,16,16,12,12,18,15,15,13, + 13,18,15,15,11,11,17,15,15,12,12,18,15,15,11,11, + 13, 8, 8,10,10,14,14,14,11,11,15,15,15,12,12,15, + 14,14,11,11,16,14,14,12,12,15,15,15,12,12,15,15, + 15,13,13,15,15,15,12,12,15,15,15,12,12,16,15,15, + 13,13,15,15,15,12,12,15,15,15,13,13,16,15,15,12, + 12,15,15,15,12,12,16,15,15,13,13,16,15,15,12,12, + 15,15,15,13,13,15,14,14,12,12,15,15,15,12,12,16, + 15,14,12,12,16,15,15,13,13,16,16,16,13,13,16,14, + 15,13,13,15,15,15,13,13,16,15,15,12,12,13,12,12, + 10,10,14,14,14,11,11,15,14,14,12,12,15,14,14,11, + 11,16,14,14,11,11,15,14,15,12,12,15,14,14,13,13, + 15,15,15,12,12,15,14,14,12,12,15,14,15,12,12,15, + 15,15,12,12,16,14,14,13,13,15,15,15,11,12,16,14, + 14,12,12,16,15,15,12,12,15,15,15,12,12,16,14,14, + 12,12,15,15,15,11,11,15,14,14,11,12,15,15,14,11, + 11,16,15,15,12,12,16,14,14,13,13,16,15,15,11,11, + 16,14,14,12,12,16,15,15,11,11,13,10,10, 8, 8,14, + 12,12,12,12,14,12,12,13,13,14,12,12,12,12,14,14, + 14,13,13,15,13,13,14,14,15,15,14,15,15,15,13,13, + 13,13,15,13,13,14,14,15,14,15,14,14,15,13,13,13, + 13,15,15,15,15,15,15,12,12,13,12,15,13,13,14,14, + 15,14,14,13,13,15,13,13,14,13,15,15,15,16,16,15, + 13,13,12,12,15,13,13,13,13,14,14,14,12,12,15,15, + 15,14,14,15,15,15,20,20,15,14,14,13,13,15,15,14, + 14,14,15,14,14,13,13,13,12,12, 9, 9,14,13,13,12, + 12,14,13,13,12,12,14,14,14,12,12,14,14,14,13,13, + 15,14,14,13,13,15,14,14,14,14,15,15,14,12,12,15, + 14,14,13,13,15,14,15,14,15,15,14,14,13,13,15,14, + 14,14,14,15,14,14,12,12,15,14,14,13,13,14,15,14, + 15,14,15,14,14,13,13,15,14,14,14,14,15,14,14,12, + 12,15,14,14,13,13,15,15,15,14,14,15,15,15,14,14, + 16,14,14,14,14,15,15,15,14,14,15,14,14,14,14,14, + 15,15,14,14,13,13,13,12,13,17,15,15,12,12,17,15, + 15,12,12,18,15,15,11,11,17,16,16,11,11,18,16,16, + 13,13,18,17,16,13,13,18,16,16,12,12,18,16,16,12, + 12,18,17,17,12,12,17,16,16,12,13,17,16,16,12,13, + 17,16,16,12,12,17,16,16,12,12,18,17,16,12,12,18, + 16,16,12,12,17,16,17,12,12,18,15,15,11,11,18,15, + 15,12,12,17,17,17,11,11,17,17,17,12,12,17,16,16, + 13,13,18,16,16,11,11,18,16,16,12,12,18,17,16,11, + 11,14,14,14,10,10,16,15,14,11,11,16,15,15,12,12, + 16,14,14,12,12,17,14,14,13,13,17,15,15,13,13,17, + 15,15,14,14,16,15,15,12,12,16,15,15,13,13,18,15, + 15,14,14,16,15,15,12,12,16,15,15,14,14,16,15,15, + 12,12,16,15,15,13,13,17,15,15,13,13,17,15,15,13, + 13,17,15,15,14,14,16,14,14,12,12,17,15,15,12,12, + 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, + 15,14,13,13,17,15,15,14,14,17,15,15,13,13,14,12, + 12,11,11,15,14,14,12,12,16,14,14,12,12,16,14,14, + 11,11,17,14,14,12,12,16,15,14,13,13,16,14,14,13, + 13,16,15,15,12,12,16,14,14,13,13,17,15,15,13,13, + 16,15,15,13,13,17,14,14,13,13,16,15,15,12,12,16, + 14,14,12,12,16,15,15,12,12,17,15,15,12,12,17,14, + 14,13,13,16,15,15,12,12,16,14,14,12,12,16,15,15, + 12,12,17,15,15,13,13,17,14,14,13,13,17,15,15,12, + 12,17,14,14,12,12,17,15,15,12,12,14,14,14, 8, 8, + 14,14,14,13,13,14,15,15,14,14,14,14,14,14,14,15, + 15,15,19,19,15,15,15,14,14,15,15,16,20,19,15,15, + 15,14,14,15,16,16,15,15,15,15,15,19,19,15,15,15, + 14,14,15,16,16,19,20,15,15,15,14,14,15,15,15,15, + 15,15,15,15,19,19,15,15,15,15,15,15,15,16,19,20, + 15,14,15,14,14,15,15,15,15,15,15,15,15,20,19,15, + 15,15,21,19,15,16,16,20,20,15,15,14,19,19,15,15, + 16,20,21,15,15,15,20,19,13,12,12, 9, 9,14,14,14, + 12,12,14,13,13,13,13,14,14,14,13,13,15,14,14,20, + 19,15,14,14,14,13,15,14,14,19,19,15,15,14,13,13, + 15,14,14,14,14,15,15,15,19,20,15,14,14,13,13,15, + 14,14,20,19,14,15,14,13,13,15,14,14,14,13,15,15, + 15,19,20,15,15,14,14,14,15,14,14,21,19,15,15,15, + 13,13,15,14,14,14,14,14,15,15,20,20,15,15,15,21, + 20,15,14,14,19,20,15,15,15,20,20,15,14,14,19,20, + 15,15,15,21,19, +}; + +static const static_codebook _44p2_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p2_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p2_p4_1, + 0 +}; + +static const long _vq_quantlist__44p2_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p2_p5_0[] = { + 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,15,15, 0, + 13,13,16,16, 0,13,13,15,15, 7, 8, 8,15,15, 9,10, + 10,17,16, 9, 8, 8,15,15, 0,13,13,18,17, 0,13,13, + 16,16, 8, 8, 8,15,15,12,11,11,16,17, 9, 8, 8,14, + 14, 0,13,13,18,17, 0,13,13,16,15, 0,14,14,18,17, + 0,20,22,18,20, 0,12,12,16,16, 0,16,16,22,20, 0, + 14,14,16,16, 0,14,14,17,17, 0,22,22,22,19, 0,12, + 13,16,16, 0,17,17, 0, 0, 0,15,15,16,16, 5, 7, 7, + 13,13, 9, 9, 9,15,14,10,10,10,14,14, 0,21,21,18, + 17, 0,21,22,18,17, 9,10,10,14,14,12,12,12,17,17, + 12,10,10,14,14, 0,19,21,18,17, 0,20,22,18,18,11, + 10,10,14,14,14,13,13,18,17,12,11,11,14,14, 0,22, + 19,17,18, 0,20, 0,18,17, 0,22,21,17,17, 0, 0, 0, + 0, 0, 0,20,22,17,17, 0,22, 0,21,19, 0,22, 0,18, + 18, 0, 0,22,18,19, 0, 0, 0, 0, 0, 0,19,21,17,17, + 0, 0, 0,20,20, 0, 0, 0,18,18, 6, 6, 6,13,12, 8, + 6, 6,11,11, 8, 6, 6,13,13, 0, 9, 9,11,11, 0,11, + 11,14,14, 9, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, + 13,13, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, + 14,13, 9, 9,13,13,10, 6, 6,13,12, 0,11,11,15,15, + 0,10,10,13,13, 0,12,12,15,15, 0,19, 0,17,17, 0, + 9, 9,13,13, 0,13,14,19,20, 0,11,11,13,13, 0,11, + 11,14,14, 0,19,20,17,18, 0,10,10,13,13, 0,15,15, + 21,19, 0,12,12,13,13, 0,10,10,12,13, 0,11,11,15, + 15, 0,11,11,15,15, 0,15,15,22, 0, 0,16,17,22, 0, + 0,11,11,15,15, 0,14,14,18,17, 0,11,11,15,16, 0, + 15,15,22,21, 0,16,16, 0,20, 0,12,12,16,15, 0,15, + 14,19,19, 0,11,11,16,16, 0,15,15,21, 0, 0,16,15, + 0, 0, 0,16,16,22,21, 0, 0, 0, 0, 0, 0,15,15,20, + 20, 0,18,18, 0, 0, 0,16,17, 0, 0, 0,17,17, 0,22, + 0, 0, 0, 0, 0, 0,15,15,21,22, 0,20,18, 0, 0, 0, + 18,17,22, 0, 0,10,10,12,11, 0,10,10,10,10, 0,11, + 11,12,12, 0,11,11, 9, 9, 0,13,13,12,12, 0,11,11, + 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,13,12,13, + 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, + 0,10,10,12,12, 0,13,13,13,14, 0,12,12,12,12, 0, + 13,14,14,14, 0,20,21,15,15, 0,12,11,12,12, 0,15, + 16,20,22, 0,13,12,11,11, 0,13,13,14,13, 0,20, 0, + 16,15, 0,12,12,12,12, 0,16,16,22,21, 0,13,13,12, + 12, 6, 7, 7,16,16,11, 9, 9,15,15,12, 9, 9,16,16, + 0,13,13,14,14, 0,14,14,16,17,10, 9, 9,16,16,14, + 12,12,16,16,12, 9, 9,15,15, 0,13,13,18,18, 0,13, + 13,15,16,12,10,10,17,18,15,12,12,17,17,13, 9, 9, + 16,16, 0,13,13,17,18, 0,14,14,16,16, 0,15,15,18, + 18, 0,22, 0,20,20, 0,12,12,16,16, 0,16,16,20,22, + 0,14,14,16,16, 0,15,14,18,18, 0, 0,22,19,21, 0, + 13,13,16,17, 0,17,17,22,22, 0,15,15,16,16, 7, 7, + 7,14,14,11,10,10,15,15,12,10,10,15,14, 0,22, 0, + 18,18, 0, 0,21,17,18,11,10,10,15,15,14,12,12,17, + 17,14,11,11,15,15, 0,22,20,18,18, 0, 0,20,18,17, + 12,10,10,16,16,17,14,14,19,18,14,11,11,15,15, 0, + 21,22,19,19, 0,21,22,18,18, 0,22, 0,19,21, 0, 0, + 0, 0, 0, 0,22,22,18,17, 0, 0, 0,21,20, 0,22,22, + 20,19, 0, 0,22,20,20, 0, 0, 0, 0, 0, 0,20,21,17, + 17, 0, 0,22,21,21, 0, 0, 0,18,18,10, 9, 9,14,14, + 13,10,10,13,13,13,10,11,14,14, 0,13,13,12,12, 0, + 15,15,16,16,13,10,10,15,15,15,12,12,14,14,15,10, + 10,14,15, 0,14,14,16,15, 0,14,14,15,15,13,10,10, + 15,15,18,13,13,15,15,15,10,10,14,15, 0,14,14,16, + 16, 0,14,14,15,15, 0,15,15,16,16, 0,22, 0,18,18, + 0,12,13,14,14, 0,17,17,22, 0, 0,14,14,14,14, 0, + 15,15,16,16, 0,22, 0,18,17, 0,13,13,14,14, 0,19, + 18,21,22, 0,15,15,14,14, 0,11,11,13,13, 0,12,12, + 16,16, 0,12,12,16,16, 0,15,16,21, 0, 0,16,17, 0, + 22, 0,12,12,16,16, 0,14,14,17,18, 0,11,11,16,16, + 0,15,15,21,22, 0,16,16, 0, 0, 0,12,12,16,16, 0, + 15,15, 0,19, 0,12,12,16,17, 0,16,16,22, 0, 0,16, + 16, 0,22, 0,17,17, 0,22, 0, 0, 0, 0, 0, 0,15,15, + 20,19, 0,18,18, 0, 0, 0,17,18, 0, 0, 0,17,17, 0, + 0, 0, 0, 0, 0, 0, 0,15,15, 0,22, 0,20,18, 0, 0, + 0,18,18,22,22, 0,11,11,14,14, 0,12,12,14,14, 0, + 12,12,15,15, 0,13,13,14,14, 0,14,14,17,16, 0,12, + 12,16,16, 0,14,14,16,16, 0,11,11,15,15, 0,13,13, + 16,16, 0,13,13,15,15, 0,12,12,15,15, 0,15,14,16, + 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,15,15, + 0,15,15,17,17, 0, 0, 0,19,18, 0,13,12,15,15, 0, + 16,16, 0, 0, 0,14,14,15,15, 0,14,14,16,17, 0,22, + 0,18,18, 0,13,13,15,15, 0,17,17, 0, 0, 0,14,14, + 15,15, 8, 8, 8,16,16,12,10,10,16,16,13, 9, 9,16, + 16, 0,14,14,17,17, 0,14,14,17,16,12,10,10,18,17, + 14,11,11,18,18,14, 9,10,16,16, 0,13,13,18,19, 0, + 14,13,16,16,12, 9, 9,16,16,17,13,13,17,17,14, 9, + 9,15,15, 0,14,14,19,20, 0,13,13,15,15, 0,15,15, + 18,19, 0, 0,22,22,22, 0,13,13,17,17, 0,16,16,19, + 21, 0,14,14,16,16, 0,14,14,18,18, 0, 0, 0, 0, 0, + 0,13,13,16,16, 0,18,18, 0, 0, 0,15,15,16,16, 8, + 7, 7,14,14,12,10,10,15,15,13,10,10,15,14, 0,22, + 0,18,18, 0,22, 0,18,18,12,10,10,16,15,15,12,12, + 17,17,14,11,11,15,15, 0,20,21,19,18, 0, 0, 0,17, + 18,13,11,11,15,15,16,13,13,18,18,15,11,11,14,14, + 0,22,21,19,19, 0,21,22,18,18, 0,22,22,20,18, 0, + 0, 0, 0, 0, 0,22,19,17,17, 0, 0, 0,22,21, 0, 0, + 22,19,17, 0, 0,22,19,19, 0, 0, 0, 0, 0, 0,22,21, + 18,17, 0, 0, 0,22, 0, 0, 0, 0,19,19, 0,10,10,14, + 14, 0,11,11,15,14, 0,11,11,15,15, 0,14,14,15,14, + 0,15,15,16,16, 0,11,11,16,16, 0,13,13,16,16, 0, + 11,11,15,15, 0,14,14,17,16, 0,14,14,15,15, 0,11, + 11,16,16, 0,14,13,15,15, 0,11,11,15,15, 0,15,15, + 17,17, 0,14,14,15,14, 0,16,16,17,17, 0, 0,22,18, + 18, 0,13,13,15,15, 0,17,17,22, 0, 0,15,15,15,14, + 0,15,16,16,17, 0, 0,22,18,19, 0,13,13,15,15, 0, + 20,18,21, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12, + 12,16,16, 0,12,12,16,15, 0,15,16,22,22, 0,17,17, + 0, 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16, + 16, 0,15,16,22,20, 0,16,16, 0,22, 0,12,12,16,16, + 0,15,15,18,20, 0,11,11,16,16, 0,15,15, 0, 0, 0, + 16,16, 0, 0, 0,17,17,22, 0, 0, 0, 0, 0, 0, 0,15, + 15, 0,21, 0,18,18, 0, 0, 0,17,16, 0, 0, 0,17,17, + 22,22, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,20,22, 0, + 0, 0,18,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, + 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, + 13,12,16,16, 0,14,14,16,16, 0,12,11,16,16, 0,14, + 14,17,17, 0,14,14,16,16, 0,12,12,16,16, 0,15,15, + 17,16, 0,11,11,15,16, 0,14,14,17,17, 0,14,14,16, + 16, 0,15,15,18,18, 0, 0, 0,22,19, 0,13,13,15,16, + 0,16,17, 0, 0, 0,14,14,16,16, 0,15,15,18,17, 0, + 0, 0,20,20, 0,13,13,16,15, 0,17,17,22,22, 0,14, + 14,15,15, 0,11,11,16,16, 0,13,13,16,17, 0,13,13, + 17,18, 0,16,16,17,17, 0,17,17,18,18, 0,12,12,17, + 17, 0,16,15,18,18, 0,12,12,16,16, 0,16,16,18,18, + 0,15,15,17,17, 0,12,12,17,17, 0,16,16,19,18, 0, + 12,12,16,17, 0,16,16,19,19, 0,15,16,16,17, 0,16, + 16,19,17, 0, 0, 0,20,22, 0,13,13,16,16, 0,19,18, + 21, 0, 0,15,15,16,16, 0,16,16,18,18, 0, 0, 0,22, + 21, 0,14,14,16,16, 0,21,19,21,22, 0,16,16,16,16, + 0, 9, 9,14,14, 0,13,13,15,15, 0,14,14,15,15, 0, + 0,20,18,19, 0, 0,22,18,18, 0,12,12,15,15, 0,15, + 15,17,18, 0,14,13,14,14, 0,20, 0,18,18, 0,21, 0, + 18,17, 0,13,13,15,16, 0,17,17,18,18, 0,14,14,15, + 15, 0,22,22,20,19, 0,20,21,18,18, 0,20,22,19,19, + 0, 0, 0, 0, 0, 0,20,20,17,17, 0, 0,22,22,21, 0, + 22, 0,18,18, 0,20,22,19,19, 0, 0, 0, 0, 0, 0,21, + 21,17,18, 0, 0, 0,21,20, 0, 0,22,19,18, 0,18,18, + 15,15, 0,22,21,17,16, 0, 0,22,17,17, 0,20,22,18, + 18, 0, 0,22,20,20, 0,21,19,16,16, 0,21,21,18,18, + 0,19,19,17,17, 0, 0,22,19,19, 0,22,20,17,17, 0, + 21,19,16,16, 0,22,22,19,18, 0,19,20,16,16, 0,22, + 21,19,21, 0,21,22,17,18, 0,21,20,18,18, 0, 0, 0, + 19,20, 0,20,19,16,16, 0,22,22, 0, 0, 0,21,21,17, + 16, 0,22,20,19,18, 0, 0, 0,20,20, 0,20,19,16,16, + 0, 0, 0, 0, 0, 0,21,22,17,17, 0,11,11,13,13, 0, + 13,13,15,16, 0,13,13,16,16, 0,17,18,21, 0, 0,17, + 18, 0, 0, 0,12,12,15,16, 0,15,15,19,18, 0,12,12, + 16,16, 0,17,17,22, 0, 0,17,17, 0,22, 0,12,12,17, + 16, 0,16,16,19,20, 0,12,12,16,16, 0,17,17, 0, 0, + 0,17,17, 0,21, 0,17,16,22, 0, 0, 0, 0, 0, 0, 0, + 15,15,20,22, 0,20,18, 0, 0, 0,18,18, 0, 0, 0,17, + 17,21, 0, 0, 0, 0, 0, 0, 0,15,15,21,22, 0,19,20, + 22, 0, 0,19,18, 0, 0, 0,14,14,18,18, 0,16,16,22, + 20, 0,16,16,22,19, 0,17,17,20,22, 0,19,19, 0, 0, + 0,15,15,20, 0, 0,18,21, 0,20, 0,15,15,21,20, 0, + 18,17, 0, 0, 0,17,17, 0,22, 0,15,15,19,19, 0,19, + 18, 0, 0, 0,15,15,20, 0, 0,18,18,22,22, 0,17,17, + 0,20, 0,18,18, 0, 0, 0, 0,22, 0, 0, 0,15,15,19, + 20, 0,20,19, 0, 0, 0,17,17,20,21, 0,17,18,20,22, + 0, 0, 0, 0,22, 0,15,15,20,20, 0,22,20, 0, 0, 0, + 17,18,20, 0, 0,12,12,17,16, 0,14,14,17,17, 0,13, + 13,17,17, 0,16,16,18,18, 0,17,16,17,17, 0,13,13, + 17,17, 0,15,16,18,18, 0,13,13,16,16, 0,16,16,18, + 18, 0,16,16,17,16, 0,13,13,16,16, 0,17,17,18,17, + 0,12,12,15,16, 0,17,17,19,19, 0,16,16,16,16, 0, + 16,17,19,18, 0, 0, 0,21,22, 0,14,14,16,16, 0,18, + 18, 0,22, 0,16,16,16,16, 0,16,16,18,17, 0, 0, 0, + 21,20, 0,14,14,16,16, 0,21,22,22, 0, 0,16,16,16, + 16, 0, 9, 9,14,13, 0,13,14,15,16, 0,14,13,15,14, + 0,22, 0,18,18, 0,21, 0,17,18, 0,13,13,15,15, 0, + 15,16,18,17, 0,14,14,15,14, 0,20,22,18,18, 0,22, + 21,17,17, 0,13,13,15,15, 0,17,17,19,19, 0,14,14, + 14,14, 0, 0,22,18,18, 0, 0,22,17,17, 0, 0,22,19, + 20, 0, 0, 0, 0, 0, 0,21,20,17,16, 0, 0, 0,21,22, + 0, 0, 0,18,19, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, + 22, 0,17,17, 0, 0, 0,20,22, 0, 0, 0,18,19, 0,18, + 19,16,16, 0,22,20,17,17, 0,22,22,17,18, 0,22,22, + 18,17, 0, 0,22,18,19, 0,20,20,17,18, 0, 0,22,19, + 18, 0,22,22,17,17, 0,22, 0,19,19, 0, 0,22,18,18, + 0,20,22,17,17, 0, 0,22,18,18, 0,19,20,17,17, 0, + 22, 0,20,19, 0,22,21,17,17, 0, 0, 0,18,18, 0, 0, + 0,22,19, 0,20, 0,17,17, 0,22, 0, 0,22, 0, 0,20, + 17,18, 0,22, 0,19,19, 0, 0, 0, 0,19, 0,19,21,17, + 17, 0, 0, 0, 0, 0, 0,20,21,17,16, 0,11,11,13,13, + 0,13,13,16,16, 0,13,13,15,16, 0,17,17,21,22, 0, + 17,18, 0, 0, 0,12,12,16,16, 0,15,15,18,18, 0,13, + 13,16,16, 0,17,16,21,21, 0,17,17, 0, 0, 0,13,13, + 16,16, 0,16,16,19,18, 0,13,13,16,16, 0,17,17, 0, + 22, 0,17,18,20,22, 0,17,18, 0, 0, 0, 0, 0, 0, 0, + 0,15,15,20, 0, 0,18,19, 0, 0, 0,17,17, 0, 0, 0, + 18,17,22, 0, 0, 0, 0, 0, 0, 0,15,16,21,20, 0,20, + 20, 0, 0, 0,18,19, 0, 0, 0,15,15,22,22, 0,17,16, + 20,22, 0,17,17,20,22, 0,18,18, 0,21, 0,19,18, 0, + 0, 0,16,16,20,20, 0,19,19,22, 0, 0,15,16,21,22, + 0,18,19,22, 0, 0,17,18, 0, 0, 0,16,16,22, 0, 0, + 19,19, 0,21, 0,15,16,20, 0, 0,18,18, 0,22, 0,18, + 17, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, + 22,21, 0,20,21, 0, 0, 0,17,18,22, 0, 0,18,18, 0, + 0, 0, 0, 0, 0, 0, 0,16,16,20,19, 0,22,21, 0, 0, + 0,18,18,22,22, +}; + +static const static_codebook _44p2_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p2_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p2_p5_0, + 0 +}; + +static const long _vq_quantlist__44p2_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p2_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p2_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p2_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p2_p5_1, + 0 +}; + +static const long _vq_quantlist__44p2_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p6_0[] = { + 1, 7, 7, 7, 8, 8, 7, 8, 8, 7, 9, 9,10,11,11, 9, + 8, 8, 7, 8, 9,11,11,11, 9, 8, 8, 6, 7, 7,10,10, + 10,10,10,10,10,10,10,14,14,14,12,11,11,10,11,11, + 15,14,14,13,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 8, + 7, 7,11,10,10, 9, 7, 7, 9, 7, 7,12,10,10,10, 7, + 7, 6, 8, 7,12,10,10,12,10,10,11,10,10,15,14,13, + 13,10,10,11,10,10,16,14,14,14,10,10, 7, 7, 7,12, + 11,11,12,11,11,11,11,11,16,14,14,13,12,12,11,11, + 11,17,15,15,14,12,12,10, 9, 9,13,11,11,13,11,11, + 12,11,11,16,14,13,14,11,11,12,11,11,17,15,14,14, + 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,13, + 14,13,10,10,11,10,10,17,14,14,14,10,10, 7, 7, 7, + 12,11,11,12,11,11,12,11,11,15,14,15,14,12,12,12, + 11,11,17,15,15,14,12,12,10,10, 9,13,11,11,13,11, + 11,13,11,11,16,14,14,14,11,11,13,11,11,16,15,15, + 15,11,11, +}; + +static const static_codebook _44p2_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p2_p6_0, + 0 +}; + +static const long _vq_quantlist__44p2_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p6_1[] = { + 2, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 8, + 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 7, 7, 9, 8, + 8, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, + 10, 8, 9,10, 8, 8, 7, 6, 6, 8, 6, 6, 9, 6, 6, 9, + 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 9, 8, 9, 7, + 7, 7, 7, 7,11, 8, 8,11, 9, 9,10, 9, 9,12, 9, 9, + 12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7,10, + 9, 9,10, 9, 9,10, 9, 9,11,10,11,11, 9, 9,11, 9, + 9,11,11,11,11, 9, 9,10, 8, 8,11, 9, 9,10, 9, 9, + 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,12,10,10,11, + 9, 9, 8, 8, 8,11, 9, 9,12, 9, 9,11, 9, 9,12, 9, + 9,12, 8, 8,12, 9, 9,12, 9,10,12, 8, 8, 9, 7, 7, + 11, 9, 9,11,10,10,11, 9, 9,11,11,11,11, 9, 9,11, + 10,10,12,11,11,11, 9,10,10, 9, 9,11, 9, 9,11,10, + 10,11,10,10,11,11,11,11, 9, 9,11, 9,10,11,11,11, + 11, 9, 9, +}; + +static const static_codebook _44p2_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p2_p6_1, + 0 +}; + +static const long _vq_quantlist__44p2_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p2_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p7_0, + 1, -513979392, 1633504256, 2, 0, + (long *)_vq_quantlist__44p2_p7_0, + 0 +}; + +static const long _vq_quantlist__44p2_p7_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p2_p7_1[] = { + 1, 9, 9, 6, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10, +}; + +static const static_codebook _44p2_p7_1 = { + 5, 243, + (long *)_vq_lengthlist__44p2_p7_1, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p2_p7_1, + 0 +}; + +static const long _vq_quantlist__44p2_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p2_p7_2[] = { + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44p2_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p2_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p2_p7_2, + 0 +}; + +static const long _vq_quantlist__44p2_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p2_p7_3[] = { + 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p2_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p2_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p2_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p2_short[] = { + 4, 4,12, 9, 8,12,15,17, 4, 2,11, 6, 5, 9,13,15, + 11, 7, 8, 7, 7,10,14,13, 8, 5, 7, 5, 5, 8,12,12, + 8, 4, 7, 4, 3, 6,11,12,11, 8, 9, 7, 6, 8,11,12, + 15,13,14,12, 9, 7,10,13,16,12,17,12, 7, 5, 8,11, +}; + +static const static_codebook _huff_book__44p2_short = { + 2, 64, + (long *)_huff_lengthlist__44p2_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p3_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p3_l0_0[] = { + 1, 4, 4, 8, 8, 8, 8, 9, 9,10,10,10,10, 4, 6, 5, + 8, 7, 9, 9, 9, 9,10, 9,11, 9, 4, 5, 6, 7, 8, 9, + 9, 9, 9, 9,10, 9,10, 8, 9, 8, 9, 8,10, 9,11, 9, + 12,10,12,10, 8, 8, 9, 8, 9, 9,10, 9,11,10,12,10, + 12, 9,10,10,11,10,12,11,12,11,12,12,12,12, 9,10, + 10,11,11,11,11,11,12,12,12,12,12,10,11,11,12,12, + 12,12,12,12,12,12,12,12,10,11,11,12,12,12,12,12, + 12,12,12,12,12,11,12,12,12,12,12,13,12,13,12,13, + 12,12,11,12,12,12,12,12,12,13,12,12,12,12,12,12, + 12,12,13,13,12,13,12,13,12,13,12,12,12,13,12,13, + 12,13,12,13,12,13,12,12,12, +}; + +static const static_codebook _44p3_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p3_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p3_l0_0, + 0 +}; + +static const long _vq_quantlist__44p3_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p3_l0_1[] = { + 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, + 5, 6, 5, 6, 5, 6, 5, 6, 5, +}; + +static const static_codebook _44p3_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p3_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p3_l0_1, + 0 +}; + +static const long _vq_quantlist__44p3_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44p3_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p3_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p3_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p3_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44p3_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p3_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p3_long[] = { + 3, 4,13, 9, 9,12,15,17, 4, 2,18, 5, 7,10,14,18, + 11, 8, 6, 5, 6, 8,11,14, 8, 5, 5, 3, 5, 8,11,13, + 9, 6, 7, 5, 5, 7, 9,10,11,10, 9, 8, 6, 6, 8,10, + 14,14,11,11, 9, 8, 9,10,17,17,14,13,10, 9,10,10, +}; + +static const static_codebook _huff_book__44p3_long = { + 2, 64, + (long *)_huff_lengthlist__44p3_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p3_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p1_0[] = { + 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p3_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p3_p1_0, + 0 +}; + +static const long _vq_quantlist__44p3_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p3_p2_0[] = { + 3, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, + 11,11, 0, 0, 0, 0, 0, 0, 0, 0,10, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,10,11, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, + 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,12,12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, + 5, 5, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 9, 9, 0, + 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, + 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0,11,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, + 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, + 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,11,11, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 7, + 7, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0,10,10, + 0, 0, 0,11,12, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,11, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,12,12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, + 9, 9, 0, 0, 0,10,10, 0, 0, 0,12,12, 0, 0, 0, 0, + 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 10,10, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, +}; + +static const static_codebook _44p3_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p3_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p3_p2_0, + 0 +}; + +static const long _vq_quantlist__44p3_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p3_0[] = { + 1, 5, 5, 5, 8, 8, 0, 8, 8, 6, 9, 9, 8,10,10, 0, + 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 4, 7, 7, 6,10, + 10, 0,12,12, 7,11,11, 9,12,12, 0,12,12, 0,13,13, + 0,15,15, 0,12,12, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, + 8, 8, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, + 7, 5, 7, 7, 9, 9, 9, 0,11,10, 9, 9, 9,11,12,12, + 0,10,10, 0,11,11, 0,13,13, 0,11,11, 6, 7, 7, 9, + 10,10, 0,12,12,10,11,11,11,12,12, 0,12,12, 0,13, + 13, 0,15,15, 0,12,12, 0,10,10, 0,11,11, 0,11,11, + 0,12,12, 0,13,13, 0,11,11, 0,12,12, 0,15,15, 0, + 11,11, 0, 8, 8, 0,10,10, 0,12,12, 0,11,11, 0,12, + 12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, 7, 7, + 0,10,10, 0,12,12, 0,10,10, 0,12,13, 0,12,12, 0, + 13,13, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p3_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p3_p3_0, + 0 +}; + +static const long _vq_quantlist__44p3_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p3_1[] = { + 3, 4, 4, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0,10,10, 0, + 8, 8, 0, 9, 9, 0,10,10, 0, 8, 8, 0, 7, 7, 0, 8, + 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, + 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 6, 6, 0, 7, 7, 0, + 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 6, + 5, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 9, 9, + 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 6, 6, 0, + 9,10, 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0,10, + 10, 0,11,11, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 8, 8, + 0, 9, 9, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0, + 7, 7, 0, 8, 8, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 9, + 9, 0, 7, 7, 0, 7, 7, 0, 9, 9, 0, 6, 6, 0, 6, 6, + 0,10,10, 0,10,10, 0,10,10, 0,12,12, 0, 9, 9, 0, + 10,10, 0,12,12, 0, 9, 9, 0, 8, 8, 0, 7, 7, 0, 8, + 8, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, + 0, 7, 7, +}; + +static const static_codebook _44p3_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p3_p3_1, + 0 +}; + +static const long _vq_quantlist__44p3_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p4_0[] = { + 1, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8,10,11,11, 9, + 8, 8, 8, 8, 8,11,11,11,10, 8, 8, 5, 7, 7, 9,11, + 11,10,11,11,10,11,11,12,13,14,11,12,12,10,11,11, + 13,14,14,12,12,12, 5, 6, 6, 8, 6, 6, 8, 7, 7, 8, + 7, 7,11,10,10,10, 7, 7, 9, 7, 7,12,11,11,11, 7, + 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,15,13,13, + 13,10,10,12,11,11,15,13,13,14,11,11, 7, 7, 7,11, + 11,11,12,11,11,12,11,11,14,14,14,14,12,12,12,12, + 12,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,11,12, + 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, + 11,11, 8, 8, 8,12,10,10,12,10,10,13,11,11,15,13, + 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, + 12,11,11,13,11,11,12,11,11,15,14,14,14,12,12,13, + 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, + 12, 0,12,12, 0,15,15, 0,12,12, 0,13,13, 0,14,15, + 0,12,12, +}; + +static const static_codebook _44p3_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p3_p4_0, + 0 +}; + +static const long _vq_quantlist__44p3_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p3_p4_1[] = { + 3, 4, 5, 8, 8,12,10,10,12,12,12,10,10,12,12,13, + 11,11,12,12,13,12,12,12,12,13,10,10,13,13,13,13, + 13,13,13,13,10,10,13,13,13,11,11,13,13,14,13,13, + 12,12,13,10,10,13,13,13,13,13,13,13,13,10,10,12, + 12,13,11,11,13,13,13,13,13,12,12,13,12,12,13,13, + 13,13,13,13,13,14,11,11,12,12,14,12,12,13,12,14, + 14,14,12,12,13,14,14,13,13,14,13,13,13,13,14,14, + 14,12,12,14,13,13,13,13,14,14,14,12,12,12, 8, 8, + 11,11,12,12,12,11,11,12,11,11,10,10,13,12,12,10, + 10,13,12,12,10,10,13,12,12,12,12,14,12,12,12,12, + 13,13,13,11,11,14,12,12,11,11,14,12,12,12,12,14, + 12,12,12,12,13,12,12,12,12,13,13,13,11,11,14,12, + 12,11,11,14,12,12,12,12,14,13,13,12,12,14,12,12, + 12,11,14,13,13,11,11,14,13,12,11,11,14,13,13,11, + 11,14,13,13,12,12,14,12,12,12,12,15,13,13,12,12, + 14,12,12,11,11,14,13,13,11,11,12, 9, 9,10,10,12, + 7, 7,11,11,12, 9, 9,12,12,13,10,10,10,10,14,14, + 14,11,11,13, 9, 9,12,12,14,14,14,12,12,13, 8, 8, + 11,11,14, 9, 9,12,12,14,14,14,11,11,13, 9, 9,12, + 12,14,14,14,12,12,14, 8, 8,11,11,14, 9, 9,12,12, + 14,14,14,11,11,14,10,10,12,12,14,14,14,13,13,14, + 9, 9,11,11,14,10,10,12,12,14,14,14,11,11,14,14, + 15,12,12,15,14,14,14,14,15,14,14,11,11,14,14,14, + 12,12,14,14,14,11,11,14,11,11,10,10,14,10,10,10, + 10,14,10,10,10,10,15,11,11, 9, 9,14,12,12, 9, 9, + 15,11,11,11,11,15,13,13,11,11,15,10,10,10,10,15, + 11,11,10,10,15,13,13,11,11,15,11,11,11,11,15,13, + 13,11,11,15,10,10,10,10,15,11,11,10,10,15,13,13, + 11,11,15,12,12,11,11,15,13,13,11,11,15,11,11,10, + 10,15,12,12,10,10,15,13,13,10,10,15,14,14,11,11, + 15,13,13,11,11,15,14,14,10,11,15,13,13,10,10,15, + 13,14,10,10,14,13,13,10,10,14,13,13,10,10,14,13, + 13,10,10,14,13,13, 9, 9,14,14,14, 9, 9,15,14,14, + 11,11,15,14,14,10,10,15,14,14,10,10,15,14,14,11, + 11,15,14,14,10,10,15,14,14,11,11,15,14,14,10,10, + 14,14,14,10,10,15,14,14,10,10,14,14,14,10,10,15, + 14,14,11,11,15,14,14,11,11,14,14,14,10,10,15,14, + 14,10,10,14,14,14, 9, 9,15,15,15,11,11,15,14,14, + 12,12,15,15,14,10,10,15,14,14,10,10,14,15,15, 9, + 9,14,10,10,12,12,17, 9, 9,12,12,17,10,10,13,13, + 17,11,11,12,12,18,14,14,12,12,17,10,10,13,13,17, + 14,14,12,12,17, 9, 9,12,12,17,11,11,12,12,17,14, + 14,12,12,18,10,10,13,13,18,14,14,13,13,18, 9, 9, + 12,12,18,10,10,13,13,18,14,14,12,12,18,11,11,13, + 13,18,14,14,13,13,18,10,10,12,12,17,11,11,12,12, + 17,14,14,12,12,18,15,15,13,13,18,14,14,14,14,18, + 15,15,12,12,18,14,14,12,12,18,15,15,12,12,13, 7, + 7,11,11,14,15,15,11,11,14,15,15,12,12,14,15,15, + 11,11,15,15,15,11,11,14,15,15,12,12,14,15,15,12, + 12,14,15,15,11,11,14,15,15,11,11,15,15,15,12,12, + 14,15,15,12,12,14,15,15,12,12,14,15,15,11,11,14, + 15,15,11,11,15,15,15,12,12,15,15,15,12,12,14,15, + 15,12,12,14,15,14,12,12,14,15,15,11,11,15,14,14, + 12,12,15,15,15,12,12,15,16,16,12,12,15,15,15,12, + 12,15,15,15,12,12,15,15,15,12,12,13,13,13,11,10, + 14,14,15,11,11,14,14,14,12,12,15,14,14,10,10,15, + 15,15,11,11,14,15,15,12,12,14,14,14,11,11,14,15, + 15,11,11,14,15,15,12,12,15,15,15,11,11,14,15,15, + 12,12,14,14,14,12,12,14,15,15,11,11,14,15,15,12, + 12,15,15,15,11,11,15,15,15,12,12,15,14,14,12,12, + 14,15,15,11,11,14,15,15,11,11,15,15,15,10,10,15, + 15,16,12,12,15,15,15,14,14,15,15,15,11,11,15,15, + 15,12,12,15,15,15,11,11,14,11,11,10,10,15, 9, 9, + 12,12,15,10,10,12,12,15,11,11,11,11,15,14,14,12, + 12,15,10,10,13,13,15,14,14,12,12,15, 9, 9,12,12, + 15,10,10,13,13,15,13,13,12,11,15,10,10,12,12,15, + 14,14,12,12,15, 9, 9,11,11,15,11,11,12,12,15,13, + 13,11,11,15,11,11,13,13,15,13,14,13,14,15,11,11, + 11,11,15,11,11,12,12,15,14,14,11,11,15,14,14,13, + 13,15,14,14,20,20,15,14,14,12,12,15,14,14,12,12, + 15,14,14,11,11,14,13,13,10,10,14,13,13,12,12,14, + 14,13,12,12,15,14,14,12,12,15,14,14,11,11,15,14, + 14,12,12,15,14,14,13,13,15,14,14,12,11,15,14,14, + 11,11,15,14,14,13,13,15,14,14,12,12,15,14,14,13, + 13,15,14,14,12,11,15,14,14,12,12,15,14,14,13,13, + 15,14,14,13,13,15,14,14,12,12,15,14,14,12,12,15, + 14,14,12,12,15,15,15,13,13,15,15,15,13,13,15,14, + 14,13,13,15,15,15,13,13,15,14,15,12,12,15,15,15, + 13,13,14,10,10,12,13,17, 9, 9,12,12,17,10,10,13, + 13,17,11,11,12,12,18,14,14,12,12,18,10,10,13,13, + 18,14,14,12,12,17, 9, 9,12,12,18,10,11,13,13,18, + 14,14,12,12,17,10,10,12,12,17,14,14,12,12,17, 9, + 9,12,12,17,11,11,12,12,17,14,14,12,12,18,11,11, + 12,12,18,14,14,13,13,18,11,11,12,12,18,11,11,12, + 12,18,14,14,12,12,18,15,15,12,12,18,14,14,13,13, + 18,15,15,12,12,17,14,14,12,12,17,15,15,12,12,13, + 7, 7,11,11,14,15,15,11,11,14,15,15,11,11,14,15, + 14,12,12,15,15,15,12,11,14,15,15,12,12,14,15,15, + 12,12,14,15,15,11,11,14,15,15,11,11,15,15,15,13, + 13,14,15,15,11,11,14,15,15,13,12,14,15,15,11,11, + 14,15,15,11,11,15,15,15,13,13,14,15,15,12,12,15, + 15,15,12,12,15,15,15,11,11,15,15,15,11,11,15,15, + 15,12,12,15,15,15,13,13,15,16,16,12,12,15,15,15, + 12,13,15,15,15,12,12,15,15,15,12,12,13,13,13,11, + 11,14,14,14,11,11,14,14,14,12,12,14,14,14,10,10, + 15,14,14,11,11,14,15,15,12,12,14,14,14,12,12,14, + 15,15,11,11,14,15,14,12,12,15,14,14,11,11,14,15, + 15,12,12,14,14,14,11,11,14,15,15,11,11,14,14,14, + 12,12,15,15,14,11,11,15,15,15,12,12,15,14,14,12, + 12,14,15,15,11,11,14,15,14,11,11,15,15,15,10,10, + 15,15,15,12,12,15,14,14,14,13,15,15,15,11,11,15, + 15,15,11,11,15,15,15,10,10,14,11,11,10,10,15, 9, + 9,12,12,15,10,10,12,12,15,11,11,11,11,15,14,14, + 12,12,15,10,10,13,13,15,13,13,12,12,15, 9, 9,12, + 12,15,11,11,13,13,15,14,14,12,12,15,10,10,13,13, + 15,13,14,12,12,15, 9, 9,12,12,15,10,10,13,13,15, + 13,13,11,11,15,11,11,13,13,15,14,14,13,13,15,10, + 10,11,11,15,11,11,12,12,15,14,14,11,11,15,14,14, + 13,13,15,14,14,21,20,15,14,14,11,11,15,14,14,12, + 12,15,14,14,11,11,14,13,13,10,10,14,13,13,11,11, + 15,14,14,12,12,15,14,14,12,12,14,14,14,12,12,15, + 14,14,12,12,15,14,14,13,13,14,14,14,11,11,15,14, + 14,11,11,15,14,14,13,13,15,14,14,12,12,15,14,14, + 13,13,14,14,14,11,11,15,14,14,11,11,14,14,14,13, + 13,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, + 15,14,14,12,12,14,14,14,13,13,15,15,15,13,13,16, + 14,14,12,13,15,15,15,13,13,15,14,14,12,12,15,15, + 15,13,13,15,11,11,13,12,18,10,10,12,12,17,11,11, + 12,12,18,12,12,11,11,18,14,14,12,12,18,11,11,13, + 13,17,14,14,12,12,18,10,10,12,12,18,12,12,12,12, + 18,14,15,12,12,18,11,11,13,13,18,14,14,12,12,17, + 10,10,12,12,18,11,11,12,12,18,15,14,12,12,17,12, + 12,12,12,17,14,14,12,12,17,11,11,11,11,17,12,12, + 12,11,17,15,15,11,11,18,15,15,12,12,18,14,15,13, + 13,18,15,15,11,11,17,15,15,12,12,18,15,15,11,11, + 14, 9, 9,11,11,14,15,15,11,11,15,15,15,11,11,15, + 15,15,12,11,15,15,15,12,12,15,15,15,11,11,15,15, + 15,13,13,14,15,15,11,11,15,15,15,11,11,15,15,15, + 13,13,15,15,15,11,11,15,15,15,13,13,15,15,15,11, + 11,15,15,15,11,11,15,15,15,13,13,15,15,15,12,12, + 15,15,15,13,13,15,15,14,11,11,15,15,15,12,12,15, + 15,15,12,12,16,15,15,13,13,15,16,16,13,13,16,15, + 15,12,12,15,15,15,13,12,15,15,15,12,12,13,12,12, + 11,11,14,14,14,11,11,14,14,14,12,12,15,14,14,11, + 11,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, + 14,15,15,11,11,15,14,14,12,12,15,14,14,11,11,15, + 14,14,12,12,15,14,14,12,12,14,15,15,11,11,15,14, + 14,12,12,15,14,14,11,11,15,15,15,12,12,15,14,14, + 12,12,15,15,15,11,11,15,14,14,11,11,15,14,15,11, + 11,15,15,15,12,12,15,14,14,13,13,16,15,15,11,11, + 15,14,14,12,12,15,15,15,11,11,14,11,11, 9, 9,15, + 10,10,12,12,14,11,11,12,12,15,12,12,12,12,15,14, + 14,13,13,15,11,11,13,13,15,14,14,13,13,15,10,10, + 12,12,15,12,12,13,13,15,14,14,13,13,15,11,11,12, + 12,15,14,14,13,13,14,10,10,12,12,15,12,12,13,13, + 15,14,14,12,12,15,12,12,13,13,15,14,14,15,15,15, + 11,11,12,12,15,12,12,12,13,15,14,14,12,12,15,15, + 15,14,14,15,14,14,20,20,15,14,14,12,12,15,14,14, + 13,13,15,14,14,12,12,14,13,13,10,10,14,13,13,11, + 11,14,13,13,12,12,14,14,14,12,12,15,14,14,13,13, + 15,14,14,12,12,14,14,14,14,14,14,14,14,11,11,15, + 14,14,12,12,15,14,14,14,14,15,14,14,12,12,14,14, + 14,14,14,14,14,14,11,11,15,14,14,12,12,14,14,14, + 14,14,15,14,14,12,12,15,14,14,13,13,15,14,14,12, + 12,15,14,14,12,12,14,14,14,14,13,15,15,15,14,14, + 15,14,14,13,13,15,15,15,14,14,15,14,14,13,13,15, + 15,15,13,13,14,13,13,13,13,18,15,15,12,12,18,15, + 15,13,12,18,15,16,11,11,18,16,17,12,12,18,15,15, + 13,13,18,17,17,12,12,18,15,15,12,12,17,15,15,12, + 12,18,17,17,12,12,18,15,15,13,13,18,16,17,12,12, + 17,15,15,12,12,18,15,15,12,12,18,16,17,11,12,18, + 16,16,12,12,17,16,17,12,12,18,15,15,11,11,18,15, + 15,12,12,18,17,17,11,11,17,17,17,12,12,18,16,16, + 13,13,18,17,17,11,11,18,16,16,12,12,18,17,17,11, + 11,15,14,14,11,11,16,15,15,11,11,16,15,15,12,12, + 16,15,15,12,12,17,15,15,14,13,16,15,15,12,12,17, + 15,15,14,14,16,15,15,11,11,16,15,15,12,12,18,15, + 15,13,13,16,15,15,11,11,17,15,15,14,14,16,15,15, + 11,11,16,15,15,12,12,17,15,15,13,13,16,15,15,12, + 12,17,16,15,14,14,16,14,15,12,12,16,15,15,12,12, + 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, + 15,15,13,13,17,15,15,14,14,18,15,15,13,13,15,12, + 13,11,11,15,14,14,12,12,16,14,14,12,12,16,14,14, + 12,12,16,14,14,12,12,16,14,14,13,12,17,14,14,13, + 13,16,15,15,12,12,16,14,14,12,12,17,14,14,12,12, + 16,14,14,12,12,17,14,14,13,13,15,15,15,12,12,16, + 14,14,12,12,17,14,14,12,12,17,15,15,12,12,17,14, + 14,13,13,16,15,15,12,12,16,14,14,12,12,17,15,15, + 12,12,18,15,15,13,13,17,14,14,13,13,17,15,15,12, + 12,17,14,14,12,12,17,15,15,12,12,14,15,15, 9, 9, + 15,15,15,12,12,15,15,15,13,13,15,15,15,14,14,15, + 15,15,19,19,15,15,16,13,13,15,15,16,19,20,15,15, + 15,13,12,15,16,16,14,14,15,15,15,19,19,15,15,15, + 13,13,15,16,15,20,19,14,15,15,13,13,15,15,15,14, + 14,15,15,15,19,19,15,15,15,14,14,15,16,16,19,20, + 15,15,15,14,14,15,15,15,14,14,15,15,15,19,19,15, + 15,15,20,19,15,16,16,20,19,15,15,15,19,19,15,16, + 16,20,20,15,15,15,19,20,14,13,13,10,10,14,14,14, + 11,11,14,14,14,12,12,15,14,14,13,13,15,14,14,19, + 20,15,14,14,12,12,14,14,14,20,19,14,14,14,11,11, + 15,14,14,12,12,15,14,14,20,20,15,14,14,12,12,14, + 14,14,20,19,14,14,14,11,11,15,14,14,12,12,15,14, + 14,19,20,15,14,14,13,13,15,14,14,22,19,15,15,14, + 12,12,15,14,14,13,13,14,15,15,22,20,15,15,15,20, + 20,15,14,14,21,20,15,15,15,20,21,15,14,14,20,20, + 14,15,15,20,20, +}; + +static const static_codebook _44p3_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p3_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p3_p4_1, + 0 +}; + +static const long _vq_quantlist__44p3_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p3_p5_0[] = { + 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,15,15, 0, + 12,12,15,15, 0,13,13,15,15, 7, 8, 8,15,15,10,10, + 10,16,16, 9, 8, 8,15,15, 0,13,13,18,17, 0,13,13, + 16,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,15, + 15, 0,13,13,18,18, 0,13,13,16,16, 0,14,14,17,17, + 0,20, 0,19,20, 0,12,12,16,16, 0,16,16,20,22, 0, + 14,14,16,16, 0,14,14,17,17, 0,20,22,20,19, 0,13, + 13,15,16, 0,17,18, 0,21, 0,15,15,16,16, 5, 7, 7, + 13,13, 8, 9, 9,14,14,10,10,10,14,14, 0,20,22,18, + 18, 0,22,21,18,17, 9,10,10,14,14,12,12,12,17,17, + 12,10,10,14,14, 0, 0,20,17,17, 0,22,21,17,18,11, + 10,10,14,14,14,13,13,18,18,12,11,11,14,14, 0,22, + 21,18,19, 0,20, 0,17,17, 0,22, 0,18,18, 0, 0, 0, + 0, 0, 0,20,20,17,17, 0,22, 0,22,21, 0,21, 0,19, + 18, 0,22,22,18,18, 0, 0, 0, 0, 0, 0,21, 0,17,17, + 0,22, 0,20,20, 0, 0, 0,19,18, 6, 6, 6,12,12, 8, + 6, 6,10,10, 8, 6, 6,13,12, 0,10,10,11,11, 0,11, + 11,13,13, 8, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, + 12,12, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, + 13,12,10,10,13,13,10, 6, 6,12,12, 0,11,11,15,15, + 0,10,10,13,13, 0,12,12,15,14, 0,19,20,16,17, 0, + 9, 9,13,13, 0,14,14,20,21, 0,12,11,13,12, 0,12, + 12,15,14, 0,20,19,17,17, 0,10,10,12,13, 0,15,15, + 22,21, 0,12,12,12,13, 0,10,10,12,12, 0,11,11,15, + 15, 0,11,11,15,15, 0,15,15,22,22, 0,16,17, 0, 0, + 0,11,11,15,15, 0,14,14,18,18, 0,11,11,16,16, 0, + 16,15, 0,21, 0,16,16, 0, 0, 0,12,12,15,15, 0,14, + 14,19,19, 0,11,11,15,15, 0,15,15,22, 0, 0,16,16, + 22, 0, 0,16,16, 0,21, 0, 0, 0, 0, 0, 0,15,15,19, + 20, 0,18,18, 0, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, + 0, 0, 0, 0, 0, 0,16,15,22,21, 0,20,20, 0, 0, 0, + 18,18, 0, 0, 0,10,10,12,12, 0,10,10,11,11, 0,11, + 11,12,12, 0,11,11, 9, 9, 0,13,12,12,12, 0,11,11, + 13,13, 0,13,13,12,12, 0,10,10,12,12, 0,13,12,13, + 13, 0,12,12,12,12, 0,11,11,13,13, 0,13,13,12,12, + 0,10,10,12,12, 0,13,13,14,13, 0,12,12,12,12, 0, + 14,13,13,14, 0,20,21,15,15, 0,11,11,12,12, 0,15, + 16,20,20, 0,12,13,10,10, 0,13,13,14,13, 0,20,20, + 15,15, 0,11,11,12,12, 0,16,17,21,21, 0,13,13,11, + 11, 6, 7, 7,16,15,11, 9, 9,14,15,12, 9, 9,16,16, + 0,13,13,15,15, 0,14,14,17,17,10, 9, 9,16,16,14, + 12,12,16,16,12, 9, 9,15,15, 0,13,13,17,18, 0,13, + 13,15,15,12,10,10,17,17,15,12,12,17,17,13, 9, 9, + 16,16, 0,13,13,18,19, 0,14,14,16,16, 0,15,15,18, + 18, 0, 0, 0,20,19, 0,12,12,17,16, 0,16,17, 0,21, + 0,14,15,16,16, 0,15,15,18,18, 0, 0,22,19,21, 0, + 13,13,16,16, 0,18,17,22,22, 0,15,15,16,16, 7, 7, + 7,13,13,11,10,10,15,15,12,10,10,14,14, 0,21, 0, + 18,17, 0,21,22,18,18,11,10,10,15,15,14,12,12,17, + 17,14,11,11,14,14, 0,21,20,18,18, 0,22,21,18,17, + 12,11,10,16,16,16,14,14,17,19,14,11,11,15,15, 0, + 0,22,19,19, 0,21,22,18,18, 0,21, 0,18,19, 0, 0, + 0,22, 0, 0,22,21,17,17, 0, 0, 0,20,22, 0, 0,21, + 18,18, 0, 0, 0,19,20, 0, 0, 0, 0, 0, 0, 0,21,17, + 17, 0, 0, 0,22,21, 0, 0, 0,19,19,10, 9, 9,14,13, + 13,10,10,12,12,13,10,10,14,14, 0,13,13,12,12, 0, + 15,14,16,15,13,10,10,14,14,15,12,12,14,14,15,10, + 10,14,14, 0,14,14,15,15, 0,14,13,14,14,13,10,10, + 15,15,17,13,13,15,15,14,10,10,14,14, 0,14,14,15, + 16, 0,14,14,15,15, 0,15,15,16,16, 0,21,22,17,18, + 0,12,12,14,14, 0,17,17,20,21, 0,14,14,14,14, 0, + 15,15,16,16, 0,21,22,18,18, 0,13,13,14,14, 0,18, + 18,22, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12,12, + 16,15, 0,12,12,16,16, 0,16,16, 0, 0, 0,16,17, 0, + 22, 0,12,12,16,16, 0,14,14,17,18, 0,11,11,16,16, + 0,15,15, 0,21, 0,16,16,21,22, 0,12,12,16,16, 0, + 15,15,19,19, 0,12,12,17,16, 0,16,16,21,22, 0,16, + 16, 0, 0, 0,17,17, 0,22, 0, 0, 0, 0, 0, 0,15,15, + 19,20, 0,17,19, 0, 0, 0,17,17,22, 0, 0,17,17, 0, + 22, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,19,20, 0, 0, + 0,19,18,22, 0, 0,11,12,14,14, 0,11,11,14,14, 0, + 12,12,15,15, 0,13,13,13,13, 0,14,14,16,16, 0,12, + 12,15,15, 0,14,14,16,15, 0,11,11,15,15, 0,13,13, + 16,16, 0,13,13,15,15, 0,12,12,15,15, 0,15,14,16, + 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,15,15, + 0,15,15,16,16, 0, 0, 0,18,18, 0,12,12,14,14, 0, + 16,16,22, 0, 0,14,14,15,15, 0,15,15,16,17, 0,21, + 22,18,18, 0,13,13,15,14, 0,18,17,22, 0, 0,14,14, + 15,15, 8, 8, 8,16,15,12,10,10,16,15,12,10,10,16, + 16, 0,14,14,16,17, 0,14,14,17,16,12,10,10,17,18, + 14,12,12,18,18,14,10,10,16,16, 0,14,14,18,18, 0, + 14,14,16,16,12, 9, 9,16,16,17,13,13,16,17,14, 9, + 9,15,15, 0,14,14,18,19, 0,13,13,15,15, 0,15,15, + 18,19, 0, 0, 0,22,21, 0,13,13,16,16, 0,16,16,22, + 0, 0,15,15,16,16, 0,14,14,18,17, 0, 0, 0,20, 0, + 0,13,13,16,16, 0,18,18, 0, 0, 0,15,15,16,16, 8, + 7, 7,13,13,12,10,10,15,15,12,10,10,14,14, 0,22, + 22,19,18, 0, 0, 0,18,18,12,10,10,15,15,14,13,13, + 17,17,14,11,11,15,15, 0,19,20,18,18, 0,22,21,17, + 18,13,11,11,15,15,16,13,13,18,18,14,11,11,14,15, + 0,22,21,20,19, 0,22,21,17,17, 0, 0,22,19,18, 0, + 0, 0, 0, 0, 0,22,20,17,17, 0, 0, 0,21,20, 0, 0, + 0,19,17, 0, 0,22,19,19, 0, 0, 0, 0, 0, 0,22,20, + 18,17, 0, 0, 0, 0, 0, 0, 0, 0,18,18, 0,10,10,14, + 14, 0,11,11,14,14, 0,11,11,15,15, 0,14,14,14,14, + 0,15,15,16,16, 0,11,11,16,16, 0,13,13,16,16, 0, + 11,11,15,15, 0,14,14,16,16, 0,14,14,15,15, 0,11, + 11,15,15, 0,13,13,15,15, 0,10,10,15,15, 0,15,15, + 17,17, 0,14,14,14,14, 0,16,16,16,16, 0, 0,22,19, + 19, 0,13,13,14,14, 0,17,17, 0, 0, 0,15,15,14,14, + 0,16,16,17,17, 0, 0,22,18,18, 0,13,13,14,14, 0, + 21,18, 0, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12, + 12,15,15, 0,12,12,16,15, 0,16,16, 0, 0, 0,17,17, + 22,22, 0,12,12,16,16, 0,14,14,18,18, 0,11,12,16, + 16, 0,15,16, 0,21, 0,16,16,22,21, 0,12,12,16,16, + 0,15,15,19,20, 0,11,12,16,16, 0,15,15,20,22, 0, + 16,16, 0,22, 0,17,17,22, 0, 0, 0, 0, 0, 0, 0,15, + 15,21,22, 0,19,18, 0, 0, 0,17,17, 0, 0, 0,17,17, + 0,22, 0, 0, 0, 0, 0, 0,16,15,22, 0, 0,19,19, 0, + 0, 0,17,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, + 0,12,12,15,15, 0,13,13,14,14, 0,15,15,16,17, 0, + 12,12,16,16, 0,14,14,16,16, 0,12,11,15,16, 0,14, + 14,16,17, 0,14,14,16,16, 0,13,12,16,16, 0,15,15, + 16,16, 0,11,11,15,15, 0,14,14,16,16, 0,14,14,15, + 15, 0,15,15,18,17, 0, 0,22, 0,20, 0,13,13,15,15, + 0,16,17,22,22, 0,14,14,15,15, 0,15,15,17,18, 0, + 20, 0,19,19, 0,13,13,15,15, 0,18,18,22, 0, 0,14, + 14,15,15, 0,11,11,16,16, 0,14,14,17,16, 0,13,13, + 17,17, 0,16,16,17,17, 0,17,17,18,19, 0,12,12,16, + 17, 0,15,15,18,18, 0,12,12,16,16, 0,16,16,19,18, + 0,16,16,17,16, 0,12,13,17,17, 0,17,16,18,17, 0, + 13,12,16,16, 0,16,16,18,19, 0,16,16,16,17, 0,16, + 16,18,18, 0,22, 0,22,22, 0,13,13,16,16, 0,19,18, + 22,20, 0,16,15,16,16, 0,16,17,18,18, 0, 0, 0,22, + 20, 0,14,14,16,16, 0,19,19, 0, 0, 0,16,16,16,16, + 0, 9, 9,13,13, 0,13,13,15,15, 0,14,14,15,15, 0, + 0,22,17,18, 0,22, 0,18,19, 0,12,12,15,15, 0,15, + 16,17,17, 0,14,14,14,14, 0,22, 0,18,18, 0,21,22, + 17,17, 0,13,13,15,15, 0,17,17,17,18, 0,14,14,15, + 15, 0,22,21,21,19, 0,20,21,17,17, 0,21,21,19,18, + 0, 0, 0, 0, 0, 0,21,21,17,17, 0, 0, 0,22,22, 0, + 0,22,19,18, 0, 0,21,19,18, 0, 0, 0, 0,22, 0,19, + 20,17,17, 0, 0, 0, 0,22, 0, 0, 0,19,18, 0,19,19, + 15,16, 0,21,19,16,17, 0, 0,21,17,17, 0, 0,22,17, + 17, 0,22,22,18,19, 0,20,20,16,16, 0, 0,22,18,18, + 0,20,19,16,17, 0,22,21,20,19, 0, 0,21,17,17, 0, + 21,20,17,17, 0, 0, 0,18,18, 0,19,19,17,16, 0,22, + 0,19,19, 0,21,22,17,18, 0, 0,22,19,18, 0, 0, 0, + 19,20, 0,19,19,16,16, 0,22,22,22, 0, 0,20,22,16, + 16, 0,22,20,18,19, 0, 0, 0,20,19, 0,20,20,16,16, + 0, 0, 0, 0, 0, 0,22,20,17,16, 0,11,11,13,13, 0, + 14,13,15,15, 0,13,13,16,15, 0,18,17,21, 0, 0,18, + 18,21, 0, 0,12,12,15,15, 0,15,16,17,18, 0,12,12, + 15,15, 0,17,17,22,20, 0,17,18,22, 0, 0,12,12,17, + 16, 0,16,17,19,19, 0,13,13,16,16, 0,17,17, 0,22, + 0,17,17, 0,21, 0,18,18,20,22, 0, 0, 0, 0, 0, 0, + 15,15,21,20, 0,20,19, 0, 0, 0,18,18,22, 0, 0,17, + 17,22, 0, 0, 0, 0, 0, 0, 0,15,16,20,22, 0,20,21, + 0, 0, 0,19,18, 0, 0, 0,15,15,19,19, 0,17,16,20, + 20, 0,16,17,20,21, 0,18,17, 0, 0, 0,19,19, 0, 0, + 0,15,15,21,19, 0,19,19, 0, 0, 0,15,15,22,22, 0, + 18,18, 0,22, 0,17,18,22,21, 0,15,15,20,19, 0,19, + 19, 0, 0, 0,15,15,20,22, 0,18,19,20, 0, 0,18,17, + 21,21, 0,18,18,19,22, 0, 0, 0, 0, 0, 0,15,15,20, + 19, 0,19,19, 0, 0, 0,18,18,21,22, 0,18,18,22, 0, + 0, 0, 0, 0, 0, 0,15,15,19,20, 0,21,21, 0, 0, 0, + 17,17,20,20, 0,12,12,17,17, 0,14,14,16,17, 0,13, + 14,17,17, 0,16,16,17,17, 0,17,17,17,19, 0,13,13, + 17,17, 0,16,16,18,18, 0,13,13,16,16, 0,16,16,18, + 18, 0,16,16,17,17, 0,13,13,17,17, 0,17,17,18,17, + 0,12,12,15,16, 0,17,18,19,20, 0,16,16,16,16, 0, + 17,16,18,19, 0, 0,22,21,22, 0,14,14,16,16, 0,19, + 19, 0, 0, 0,16,16,16,16, 0,16,16,18,17, 0, 0,22, + 21,21, 0,14,14,16,16, 0,22,20,22, 0, 0,16,16,15, + 15, 0, 9, 9,13,13, 0,14,14,15,15, 0,14,14,14,14, + 0,22,22,18,18, 0, 0,22,18,18, 0,12,12,15,15, 0, + 16,16,18,17, 0,14,14,14,14, 0,20,21,18,18, 0,22, + 21,17,17, 0,13,13,15,15, 0,17,17,18,18, 0,14,14, + 14,14, 0, 0,21,18,19, 0, 0,22,17,17, 0,22,22,19, + 18, 0, 0, 0, 0, 0, 0,19,21,17,17, 0, 0, 0,22,20, + 0, 0,21,18,19, 0, 0,22,18,18, 0, 0, 0, 0,22, 0, + 20,22,17,17, 0, 0, 0,20,22, 0, 0, 0,18,18, 0,19, + 21,16,16, 0,20,22,16,17, 0,20, 0,17,17, 0,22, 0, + 18,17, 0,21, 0,18,19, 0,20,20,17,17, 0,22, 0,18, + 18, 0,21,20,17,17, 0, 0,20,20,19, 0, 0,21,18,17, + 0,21,21,17,17, 0,22, 0,18,17, 0,19,19,17,17, 0, + 0,22,20,21, 0, 0,21,17,17, 0,22, 0,18,18, 0, 0, + 0,20,22, 0,20,19,16,16, 0, 0, 0, 0, 0, 0,22,22, + 17,17, 0,22, 0,18,19, 0, 0, 0,21,20, 0,19,21,16, + 17, 0, 0, 0, 0, 0, 0,22,22,17,16, 0,11,11,13,13, + 0,13,13,15,15, 0,13,13,15,15, 0,17,17,22,21, 0, + 18,18,22, 0, 0,12,13,16,15, 0,15,16,18,18, 0,13, + 13,16,16, 0,17,17, 0,22, 0,17,17,22,22, 0,13,13, + 16,16, 0,16,16,19,18, 0,13,13,16,16, 0,18,17, 0, + 20, 0,18,17,20, 0, 0,17,17,21, 0, 0, 0, 0, 0, 0, + 0,15,15,21,22, 0,19,20, 0, 0, 0,18,18, 0, 0, 0, + 18,17, 0, 0, 0, 0, 0, 0, 0, 0,16,16,22,22, 0,20, + 20, 0, 0, 0,21,19, 0, 0, 0,15,15,20,19, 0,16,16, + 22,20, 0,17,17, 0,22, 0,18,18, 0,22, 0,19,17, 0, + 0, 0,15,16,22,20, 0,18,19, 0, 0, 0,16,16,22,20, + 0,18,18, 0,22, 0,18,18,22, 0, 0,16,16,21,20, 0, + 19,20, 0,22, 0,16,16, 0,22, 0,18,18, 0,22, 0,18, + 18, 0,21, 0,19,18, 0,22, 0, 0, 0, 0, 0, 0,16,16, + 21,20, 0,20, 0, 0, 0, 0,18,18,21, 0, 0,18,18, 0, + 0, 0, 0, 0, 0, 0, 0,16,16,21,19, 0, 0, 0, 0, 0, + 0,18,18, 0,21, +}; + +static const static_codebook _44p3_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p3_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p3_p5_0, + 0 +}; + +static const long _vq_quantlist__44p3_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p3_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p3_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p3_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p3_p5_1, + 0 +}; + +static const long _vq_quantlist__44p3_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p6_0[] = { + 1, 6, 6, 7, 7, 7, 7, 8, 8, 7, 9, 9,11,11,11, 9, + 8, 8, 8, 9, 9,12,11,11, 9, 8, 8, 6, 7, 7,10,11, + 10,10,10,10,11,11,10,14,13,14,12,11,11,11,11,11, + 15,14,14,13,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, + 8, 8,12,10,10, 9, 7, 7, 9, 7, 8,12,10,10,10, 7, + 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, + 13,10,10,11,10,10,16,13,14,14,10,10, 7, 7, 7,12, + 11,11,12,11,11,11,11,11,16,15,15,14,12,12,12,11, + 11,16,15,16,14,12,12,10, 9, 9,14,11,11,13,11,11, + 12,11,11,16,14,14,14,11,11,12,11,11,17,15,15,14, + 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,14, + 13,14,10,10,12,10,10,17,14,14,14,10,10, 8, 7, 7, + 13,11,11,12,11,11,12,11,11,16,15,14,14,12,12,12, + 11,11,16,15,14,15,12,12,11,10,10,13,11,11,13,12, + 11,13,11,11,17,14,14,14,11,11,13,11,11,17,14,15, + 14,11,11, +}; + +static const static_codebook _44p3_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p3_p6_0, + 0 +}; + +static const long _vq_quantlist__44p3_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p6_1[] = { + 2, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, + 7, 7, 8, 8, 8, 9, 9, 9, 9, 7, 8, 6, 7, 7, 8, 8, + 8, 8, 8, 8, 9, 8, 8,10, 9, 9,10, 8, 8,10, 8, 8, + 10, 9, 9,10, 8, 8, 6, 6, 6, 8, 6, 6, 8, 7, 7, 8, + 7, 7,10, 8, 8, 9, 7, 7, 9, 7, 7,10, 8, 9, 9, 7, + 7, 7, 7, 7,10, 8, 8,11, 8, 8,10, 8, 8,12, 9, 9, + 12, 8, 8,11, 9, 9,12, 9, 9,11, 8, 8, 7, 7, 7,10, + 9, 9,10, 9, 9,10, 9, 9,11,10,10,10, 9, 9,11, 9, + 9,11,10,10,11, 9, 9, 9, 8, 8,10, 9, 9,10, 9, 9, + 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, + 9, 9, 8, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, + 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7, + 10, 9, 9,10, 9, 9,11, 9, 9,11,11,11,11, 9, 9,11, + 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11, 9, + 10,11,10, 9,11,10,10,11, 9, 9,11, 9,10,11,10,10, + 11, 9, 9, +}; + +static const static_codebook _44p3_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p3_p6_1, + 0 +}; + +static const long _vq_quantlist__44p3_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p3_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p7_0, + 1, -513979392, 1633504256, 2, 0, + (long *)_vq_quantlist__44p3_p7_0, + 0 +}; + +static const long _vq_quantlist__44p3_p7_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p3_p7_1[] = { + 1, 9, 9, 6, 9, 9, 5, 9, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10, +}; + +static const static_codebook _44p3_p7_1 = { + 5, 243, + (long *)_vq_lengthlist__44p3_p7_1, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p3_p7_1, + 0 +}; + +static const long _vq_quantlist__44p3_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p3_p7_2[] = { + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44p3_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p3_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p3_p7_2, + 0 +}; + +static const long _vq_quantlist__44p3_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p3_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p3_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p3_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p3_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p3_short[] = { + 4, 5,16, 9, 9,12,17,18, 4, 2,18, 6, 5, 9,13,15, + 10, 7, 7, 6, 7, 9,13,13, 8, 5, 6, 5, 5, 7,11,12, + 8, 4, 7, 4, 3, 6,10,12,11, 8, 9, 7, 6, 8,11,12, + 15,13,13,11, 9, 7,10,12,16,12,16,12, 6, 5, 8,11, +}; + +static const static_codebook _huff_book__44p3_short = { + 2, 64, + (long *)_huff_lengthlist__44p3_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p4_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p4_l0_0[] = { + 1, 4, 4, 8, 8, 9, 8, 9, 9,10,10,10,10, 4, 6, 5, + 8, 7, 9, 9, 9, 9,10, 9,10,10, 4, 5, 6, 7, 8, 9, + 9, 9, 9, 9,10, 9,10, 8, 9, 8, 9, 8,10, 9,11, 9, + 12,10,11,10, 8, 8, 9, 8, 9, 9,10, 9,11,10,11,10, + 12, 9,10,10,11,10,11,11,12,11,12,12,12,12, 9,10, + 10,11,11,11,11,11,12,12,12,12,12,10,11,11,12,12, + 12,12,12,12,12,12,12,12,10,11,11,12,12,12,12,12, + 12,12,12,12,12,11,12,12,12,12,12,12,12,12,12,13, + 12,12,11,12,11,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,13,12,12,12,12,12,12,11,13,12,12, + 12,13,12,12,12,12,12,12,12, +}; + +static const static_codebook _44p4_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p4_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p4_l0_0, + 0 +}; + +static const long _vq_quantlist__44p4_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p4_l0_1[] = { + 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, + 5, 6, 5, 6, 5, 6, 5, 6, 5, +}; + +static const static_codebook _44p4_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p4_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p4_l0_1, + 0 +}; + +static const long _vq_quantlist__44p4_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44p4_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p4_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p4_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p4_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44p4_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p4_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p4_long[] = { + 3, 5,13, 9, 9,12,16,18, 4, 2,20, 6, 7,10,15,20, + 10, 7, 5, 5, 6, 8,10,13, 8, 5, 5, 3, 5, 7,10,11, + 9, 7, 6, 5, 5, 7, 9, 9,11,10, 8, 7, 6, 6, 8, 8, + 15,15,10,10, 9, 7, 8, 9,17,19,13,12,10, 8, 9, 9, +}; + +static const static_codebook _huff_book__44p4_long = { + 2, 64, + (long *)_huff_lengthlist__44p4_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p4_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p1_0[] = { + 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p4_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p4_p1_0, + 0 +}; + +static const long _vq_quantlist__44p4_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p4_p2_0[] = { + 3, 9, 9, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 12,12, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, + 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,12,12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, + 5, 5, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 9, 9, 0, + 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, + 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, + 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, + 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, + 0, 0,10,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,11,11, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 7, + 7, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0,10,10, + 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, + 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,11, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,12,12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, + 9, 9, 0, 0, 0,10,10, 0, 0, 0,12,12, 0, 0, 0, 0, + 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, + 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, + 10,10, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, +}; + +static const static_codebook _44p4_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p4_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p4_p2_0, + 0 +}; + +static const long _vq_quantlist__44p4_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p3_0[] = { + 1, 6, 6, 5, 7, 8, 0, 8, 8, 6, 9, 9, 7,10,10, 0, + 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 4, 7, 7, 6,10, + 10, 0,12,12, 7,11,11, 8,12,12, 0,12,12, 0,13,12, + 0,15,15, 0,12,12, 0, 7, 7, 0, 7, 7, 0, 7, 7, 0, + 8, 8, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, + 7, 5, 7, 7, 8, 9, 9, 0,10,10, 8, 9, 9,11,11,11, + 0,10, 9, 0,11,11, 0,13,13, 0,10,10, 6, 7, 7, 8, + 10,10, 0,12,12, 9,10,10,10,12,12, 0,12,12, 0,12, + 12, 0,15,15, 0,12,12, 0,10,10, 0,11,11, 0,11,11, + 0,11,11, 0,13,13, 0,11,11, 0,11,11, 0,15,15, 0, + 10,10, 0, 8, 8, 0,10,10, 0,12,12, 0,11,11, 0,12, + 12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, 7, 7, + 0,10,10, 0,12,12, 0,10,10, 0,12,12, 0,12,12, 0, + 13,13, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44p4_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p4_p3_0, + 0 +}; + +static const long _vq_quantlist__44p4_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p3_1[] = { + 3, 5, 5, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0,10,10, 0, + 8, 8, 0, 8, 8, 0,10,10, 0, 8, 8, 0, 7, 7, 0, 8, + 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, + 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 6, 6, 0, 7, 7, 0, + 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 5, + 5, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 9, 9, + 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 6, 6, 0, + 9,10, 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0,10, + 10, 0,11,11, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 8, 8, + 0, 9, 9, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, + 7, 7, 0, 8, 8, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 9, + 9, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 6, 6, 0, 6, 6, + 0,10,10, 0,10,10, 0,10,10, 0,12,12, 0, 9, 9, 0, + 10,10, 0,12,12, 0, 9, 9, 0, 8, 8, 0, 7, 7, 0, 7, + 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, + 0, 6, 6, +}; + +static const static_codebook _44p4_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p4_p3_1, + 0 +}; + +static const long _vq_quantlist__44p4_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p4_0[] = { + 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, + 8, 8, 8, 8, 8,11,11,12, 9, 8, 8, 5, 7, 7, 9,11, + 11,10,11,11,10,11,11,12,14,14,11,12,12,10,12,12, + 13,14,14,12,12,12, 5, 6, 6, 7, 6, 6, 8, 7, 7, 8, + 7, 7,11,10,10,10, 7, 7, 9, 8, 8,12,11,11,10, 7, + 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,15,13,13, + 13,10,10,12,11,11,15,13,13,14,11,11, 7, 7, 7,11, + 11,11,12,11,11,12,11,11,14,14,14,13,12,12,12,12, + 12,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,12,12, + 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, + 11,11, 7, 8, 8,12,11,10,12,10,10,12,11,11,15,13, + 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, + 12,11,11,12,11,11,12,11,11,15,14,14,14,12,12,13, + 12,12,15,14,14,15,13,13, 0,11,11, 0,12,12, 0,12, + 12, 0,12,12, 0,15,15, 0,12,12, 0,13,13, 0,15,14, + 0,12,12, +}; + +static const static_codebook _44p4_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p4_p4_0, + 0 +}; + +static const long _vq_quantlist__44p4_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p4_p4_1[] = { + 4, 5, 5, 9, 9,12, 9, 9,12,12,12,10,10,13,13,13, + 11,11,12,12,13,13,13,12,12,13,10,10,13,13,13,13, + 13,13,13,13,10,10,13,12,13,11,11,13,13,13,14,14, + 13,12,13,10,10,13,13,12,13,13,13,13,13,10,10,12, + 12,13,11,11,13,13,13,14,14,12,12,13,12,12,13,13, + 13,13,13,13,13,13,11,11,12,12,13,11,11,13,13,13, + 14,14,12,12,13,14,14,13,13,14,13,13,14,14,14,14, + 14,12,12,13,14,14,13,13,14,14,14,12,12,12, 8, 8, + 12,12,13,12,12,11,11,13,11,11,11,11,14,12,12,11, + 11,14,12,12,10,11,14,12,12,12,12,14,12,12,12,12, + 13,13,13,11,11,14,12,12,11,11,14,12,12,12,12,14, + 12,12,12,12,14,12,12,12,12,14,13,13,11,11,14,12, + 12,11,11,14,12,12,12,12,14,13,13,12,12,14,12,12, + 12,12,14,13,13,11,11,14,12,12,11,11,14,13,13,11, + 11,15,13,13,12,12,14,12,12,12,12,15,13,13,12,12, + 14,12,12,11,11,15,13,13,11,11,12, 9, 9,11,11,13, + 7, 7,11,11,13, 8, 8,12,12,14,10,10,10,10,14,14, + 14,11,11,14, 8, 8,12,12,14,14,14,12,12,14, 7, 7, + 11,11,14, 9, 9,12,12,14,14,14,11,11,14, 8, 8,12, + 12,14,14,14,12,12,14, 7, 7,11,11,14, 9, 9,12,12, + 14,14,14,11,11,14,10,10,12,12,14,14,14,13,13,14, + 9, 9,11,11,14,10,10,12,11,15,14,14,11,11,14,15, + 15,12,12,15,14,14,14,14,15,14,14,11,11,15,14,14, + 12,12,15,14,14,11,11,14,11,11,10,10,15,10,10,10, + 10,15,10,10,10,10,15,11,11, 9, 9,15,12,13, 9, 9, + 15,11,11,11,11,15,13,13,11,11,15,10,10,10,10,15, + 11,11,10,10,15,13,13,11,11,15,11,11,11,11,15,13, + 13,11,11,15,10,10,10,10,15,11,11,10,10,15,13,13, + 10,11,15,12,12,11,11,15,13,13,11,10,15,11,11,10, + 10,15,11,12,10, 9,15,13,13,10,10,15,14,14,11,11, + 15,13,13,11,11,15,14,14,10,10,15,13,13,10,10,15, + 14,14,10,10,14,13,13,10,10,15,13,13,10,10,15,13, + 13,10,10,14,14,14, 8, 9,15,14,14, 9, 9,15,14,14, + 11,11,15,14,14,10,10,15,14,14,10,10,15,14,14,11, + 11,15,14,14,10,10,15,14,14,11,11,15,14,14,10,10, + 15,14,14,10,10,15,14,14,10,10,15,14,14, 9, 9,15, + 14,14,11,11,15,14,14,11,11,15,14,14,10,10,15,14, + 14,10,10,14,14,14, 9, 9,15,15,15,11,11,15,14,14, + 12,12,15,15,15,10,10,15,14,15,10,10,15,15,15, 9, + 9,15,10,10,13,13,17, 8, 8,12,12,17,10, 9,13,13, + 18,11,11,12,12,18,14,14,12,12,17, 9, 9,13,13,17, + 13,13,12,12,18, 8, 8,12,12,18,10,10,12,12,18,14, + 14,12,12,18,10,10,13,13,18,13,13,13,13,18, 9, 9, + 12,12,18,10,10,13,13,18,14,14,12,12,18,11,11,13, + 13,18,14,14,13,13,18,10,10,12,12,17,11,11,12,12, + 18,14,14,12,12,18,14,14,13,13,18,14,14,13,13,19, + 14,15,12,12,18,14,14,12,12,18,15,15,12,12,13, 7, + 7,11,11,14,15,15,11,11,14,16,15,11,11,14,15,15, + 11,11,14,15,15,11,11,14,15,15,11,12,14,15,15,12, + 12,13,15,15,11,11,14,15,15,11,11,15,15,15,12,12, + 14,15,15,12,12,14,16,16,12,12,14,15,15,11,11,14, + 15,15,11,11,15,15,15,12,12,15,15,15,12,12,14,15, + 15,12,12,14,15,15,11,11,14,15,15,11,11,15,14,15, + 12,12,15,15,15,12,12,15,16,16,12,12,15,15,15,12, + 12,14,15,15,12,12,15,15,15,12,12,13,13,13,11,11, + 14,14,15,11,11,14,14,14,12,12,14,15,15,10,10,15, + 15,15,11,11,14,15,15,12,12,14,14,14,11,11,14,15, + 15,11,11,14,15,15,12,12,15,15,15,11,11,14,15,15, + 12,12,14,14,15,11,11,14,15,15,11,11,14,15,15,12, + 12,15,15,15,11,11,15,15,15,12,12,14,15,15,12,12, + 14,15,15,10,10,14,15,15,11,11,15,15,15,10,10,15, + 15,15,12,12,15,15,15,14,14,15,15,15,11,11,15,15, + 15,11,11,15,15,15,11,11,14,10,10,10,10,15, 9, 9, + 12,11,15,10,10,12,12,15,11,11,11,11,15,13,13,12, + 12,16,10,10,12,12,15,13,13,12,12,15, 9, 9,11,11, + 15,10,10,13,12,15,13,13,11,11,15,10,10,12,12,15, + 13,13,12,12,15, 9, 9,11,11,15,10,10,12,12,15,13, + 13,11,11,15,11,11,12,12,15,13,13,13,13,15,10,10, + 11,11,15,11,11,12,12,15,13,14,11,11,15,14,14,13, + 13,16,14,14,20,19,15,14,14,11,11,15,13,14,12,12, + 15,14,14,11,11,14,13,13,10,10,14,14,13,11,11,15, + 13,14,12,12,15,14,14,12,12,15,14,14,11,11,15,14, + 14,12,12,15,15,14,13,13,15,14,14,11,11,15,14,14, + 11,11,15,14,14,13,13,15,14,14,12,12,15,14,14,13, + 13,15,14,14,11,11,15,14,14,11,11,15,14,14,13,13, + 15,14,14,12,12,15,14,14,12,12,15,14,14,12,12,15, + 14,14,11,11,15,15,15,12,12,15,15,15,13,13,16,14, + 14,12,12,15,15,15,13,13,15,15,15,12,12,15,15,15, + 12,12,14,10,10,13,13,17, 9, 9,12,12,17, 9, 9,13, + 13,17,11,11,12,12,18,14,14,12,12,18,10,10,13,13, + 18,14,13,12,12,18, 9, 9,12,12,18,10,10,12,13,18, + 14,14,12,12,17, 9, 9,12,12,17,13,14,12,12,17, 9, + 9,12,12,17,10,10,12,12,17,14,14,11,11,18,11,11, + 12,12,18,14,14,12,13,18,10,10,12,12,18,11,11,12, + 12,18,14,14,11,11,18,15,15,12,12,18,14,14,13,13, + 18,14,15,12,12,17,14,14,12,12,17,15,15,12,12,13, + 7, 7,11,11,14,15,15,11,11,14,15,15,11,11,14,15, + 15,11,11,14,15,15,11,11,14,15,15,11,11,14,15,15, + 12,12,14,15,15,11,11,14,15,15,11,11,15,15,15,12, + 12,14,15,15,11,11,14,15,15,12,12,14,15,15,11,11, + 15,15,15,11,11,15,15,15,12,12,14,15,15,12,12,14, + 15,16,12,12,14,15,15,11,11,14,15,15,11,11,15,15, + 15,12,12,15,15,15,12,12,15,16,16,12,12,15,15,15, + 12,12,15,15,15,12,12,15,15,15,12,12,13,13,13,12, + 12,14,14,14,11,11,14,14,14,12,12,14,14,14,10,10, + 15,15,15,11,11,14,15,15,12,12,14,14,14,11,11,14, + 15,15,11,11,14,14,14,12,12,15,15,14,11,11,14,15, + 15,12,12,14,14,14,11,11,14,15,15,11,11,14,14,14, + 11,11,15,14,14,10,10,14,15,15,12,12,14,14,14,12, + 12,14,15,15,10,10,14,15,15,11,11,15,15,15,10,10, + 15,15,15,12,12,15,14,14,13,13,15,15,15,10,10,15, + 14,14,11,11,15,15,15,10,10,14,10,10,10,10,14, 9, + 9,12,12,15,10,10,12,12,14,11,11,11,11,15,13,14, + 12,12,15,10,10,13,13,15,13,13,12,12,15, 9, 9,12, + 12,15,10,10,13,13,15,13,14,11,11,15,10,10,12,12, + 15,13,13,12,12,15, 9, 9,11,11,15,10,10,12,12,15, + 13,13,11,11,15,11,11,12,12,15,13,13,13,13,15,10, + 10,11,11,15,11,11,12,12,15,14,14,11,11,15,14,14, + 13,13,15,14,14,20,19,15,14,14,11,11,15,14,14,12, + 12,15,14,14,11,11,14,13,13,11,11,15,13,13,11,11, + 15,14,13,12,12,15,14,14,11,12,15,14,14,11,11,15, + 14,14,12,12,14,14,14,13,13,15,14,14,11,11,15,14, + 14,11,11,15,14,14,13,13,15,14,14,12,12,15,14,14, + 13,13,14,14,14,11,11,15,14,14,11,11,15,14,14,13, + 13,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, + 15,14,14,11,11,14,14,14,12,12,15,15,15,13,13,16, + 14,14,12,12,15,15,15,13,13,15,14,14,12,12,15,15, + 15,12,12,15,11,11,13,13,18,10,10,12,12,17,11,11, + 12,12,18,12,12,11,11,18,14,14,12,12,18,10,10,13, + 13,18,14,14,12,12,18,10,10,12,12,18,11,11,12,12, + 18,14,14,12,12,18,11,11,12,13,18,14,14,12,12,18, + 10,10,12,12,18,11,11,12,12,18,14,14,11,11,18,11, + 11,12,12,18,14,14,12,12,17,10,10,11,11,17,12,12, + 11,11,17,14,14,11,11,18,15,15,12,12,18,14,14,13, + 13,18,15,15,11,11,18,15,14,12,12,18,15,15,11,11, + 14, 8, 8,11,11,14,15,15,10,10,14,15,15,11,11,14, + 15,15,11,11,15,15,15,12,12,15,15,15,11,11,15,15, + 15,12,12,14,15,15,10,10,15,15,15,11,11,15,15,15, + 12,12,15,15,15,11,11,15,15,15,13,13,14,15,15,10, + 10,15,15,15,11,11,15,15,15,12,12,15,15,15,12,12, + 15,16,16,12,12,15,14,14,11,11,15,15,15,11,11,15, + 15,15,12,12,16,15,15,13,13,15,16,16,13,13,16,15, + 15,12,12,15,15,15,12,12,15,15,15,12,12,14,13,13, + 11,11,14,14,14,11,11,14,14,14,12,12,15,14,14,11, + 11,15,15,14,11,11,15,14,14,12,12,15,14,14,12,12, + 14,15,15,11,11,15,14,14,12,12,15,14,14,11,11,15, + 14,15,12,12,15,14,14,12,12,14,15,15,11,11,15,14, + 14,11,11,15,14,14,11,11,15,15,14,12,12,15,14,14, + 12,12,15,15,15,10,11,15,14,14,11,11,15,15,15,10, + 10,15,15,15,12,12,16,14,14,13,13,15,15,15,11,11, + 15,14,14,11,11,15,15,15,11,11,14,11,11, 9, 9,14, + 10,10,12,12,15,11,11,12,12,15,12,12,12,12,15,14, + 14,13,13,15,11,11,12,12,15,14,14,13,13,14,10,10, + 12,12,15,11,11,13,13,15,14,14,12,12,15,10,10,12, + 12,14,14,14,13,13,14,10,10,11,11,15,11,11,12,12, + 15,14,14,12,12,15,12,12,13,13,15,14,14,14,14,15, + 11,11,11,11,15,12,11,12,12,15,14,14,11,11,15,15, + 15,13,14,15,14,14,20,19,15,14,14,12,12,15,14,14, + 13,13,15,14,14,12,12,14,13,13,10,10,14,13,13,11, + 11,14,13,13,11,11,15,14,14,12,12,15,14,14,12,12, + 15,14,14,12,11,14,14,14,13,13,15,14,14,11,11,15, + 14,14,11,11,15,14,14,14,14,15,14,14,11,12,15,14, + 14,13,13,14,14,14,11,11,15,14,14,11,11,15,14,14, + 14,14,15,14,14,12,12,15,14,14,13,13,15,14,14,11, + 11,14,14,14,12,12,15,14,14,13,13,15,15,15,13,13, + 15,14,14,13,13,15,15,15,13,13,15,14,14,13,13,15, + 15,15,13,13,15,14,14,13,13,18,15,15,12,12,18,15, + 15,12,12,18,16,16,11,11,18,17,17,12,12,18,15,15, + 13,13,18,17,17,12,12,18,15,15,12,12,18,15,16,12, + 12,18,17,17,12,12,18,15,15,13,12,17,16,17,12,12, + 17,15,15,11,12,18,15,15,12,12,18,17,17,11,11,18, + 16,16,12,12,18,17,16,12,12,18,15,15,11,11,18,15, + 15,12,12,18,17,17,11,11,18,17,17,12,12,18,16,16, + 13,13,18,17,17,11,11,17,16,16,11,11,18,17,17,11, + 11,15,15,15,11,11,16,15,15,11,11,16,15,15,11,11, + 16,15,15,12,12,17,15,15,14,14,16,15,15,11,11,17, + 15,15,14,14,16,15,15,11,11,16,15,15,12,12,18,15, + 15,13,13,16,15,15,11,11,17,15,15,14,14,16,15,15, + 11,11,16,15,15,12,12,17,15,15,13,13,16,15,15,12, + 12,17,16,15,14,14,16,15,15,11,11,16,15,15,12,12, + 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,18, + 14,15,13,13,18,15,15,14,14,18,15,15,13,13,15,13, + 13,12,12,15,14,14,12,12,16,14,14,12,12,16,14,14, + 12,12,17,14,15,12,12,16,14,14,12,12,17,14,14,13, + 13,16,15,15,12,12,16,14,14,12,12,17,14,14,12,12, + 16,14,14,12,12,17,14,14,13,13,15,15,15,11,11,16, + 14,14,12,12,17,14,14,12,12,16,15,15,12,12,17,14, + 14,13,12,16,15,15,11,11,16,14,14,12,12,17,15,15, + 11,11,17,15,15,13,13,17,14,14,13,13,18,15,15,12, + 12,17,14,14,12,12,17,15,15,12,12,14,15,15, 9, 9, + 14,15,15,12,12,15,16,15,13,13,15,15,15,14,14,15, + 15,15,21,19,15,15,15,13,13,15,15,15,19,19,15,15, + 15,12,12,15,16,16,14,14,15,15,15,19,19,15,16,15, + 13,13,15,16,16,19,20,15,15,15,12,13,15,16,16,14, + 14,15,15,15,20,19,15,15,15,14,14,15,16,16,19,19, + 15,15,15,14,13,15,15,15,14,14,15,15,15,19,19,15, + 16,16,20,19,15,17,16,21,20,15,15,15,20,19,15,16, + 16,20,20,15,15,15,19,20,14,13,13,10,10,14,14,14, + 11,11,14,14,14,12,12,15,14,14,13,13,15,15,14,20, + 20,15,14,14,12,12,14,14,14,19,19,15,14,14,11,11, + 15,14,14,12,12,15,14,14,20,19,15,14,14,12,12,14, + 14,14,20,20,14,14,14,11,11,15,14,14,12,12,15,14, + 14,20,21,15,14,14,13,13,15,14,14,20,20,15,14,14, + 12,12,15,14,14,13,13,14,15,15,20,20,15,15,15,20, + 19,15,14,14,20,19,15,15,15,20,20,15,14,14,21,20, + 15,15,15,20,20, +}; + +static const static_codebook _44p4_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p4_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p4_p4_1, + 0 +}; + +static const long _vq_quantlist__44p4_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p4_p5_0[] = { + 1, 7, 6,15,15, 7, 8, 8,15,15, 8, 8, 8,15,15, 0, + 13,13,16,16, 0,14,14,16,16, 7, 9, 9,16,16,10,11, + 11,17,17,10, 8, 8,15,16, 0,14,14,18,18, 0,14,14, + 16,16, 9, 9, 9,16,16,12,11,11,17,17,10, 9, 9,15, + 15, 0,14,14,19,19, 0,14,14,16,16, 0,15,15,18,17, + 0, 0, 0,20,20, 0,13,13,16,16, 0,17,17,22,20, 0, + 15,15,17,17, 0,15,15,18,18, 0,22,21,20,21, 0,13, + 13,16,16, 0,18,18, 0,22, 0,15,15,17,17, 6, 7, 7, + 13,13, 9,10,10,15,15,11,10,10,15,15, 0,21,22,18, + 18, 0, 0, 0,18,18,10,10,10,15,15,12,13,13,17,17, + 12,11,11,15,15, 0,22,22,18,18, 0, 0,21,18,18,12, + 11,11,15,15,15,14,14,18,18,13,11,11,15,15, 0, 0, + 21,18,19, 0,21,22,18,19, 0,22, 0,18,19, 0, 0, 0, + 0, 0, 0,21,21,18,18, 0,22, 0, 0,21, 0, 0, 0,19, + 18, 0, 0, 0,18,19, 0, 0, 0, 0, 0, 0,20,20,18,17, + 0, 0,22, 0,21, 0, 0, 0,19,19, 6, 6, 6,13,13, 8, + 6, 6,11,11, 9, 7, 7,13,13, 0,10,10,11,11, 0,12, + 12,14,14, 9, 8, 8,14,14,12,10,10,13,13,10, 7, 7, + 13,13, 0,11,11,15,15, 0,11,11,13,13, 9, 8, 8,14, + 14,13,10,10,13,14,11, 7, 7,13,13, 0,11,11,15,15, + 0,11,11,13,13, 0,12,12,15,15, 0,21,21,17,17, 0, + 10,10,13,13, 0,14,14,20,20, 0,12,12,13,13, 0,12, + 12,15,15, 0,21,22,17,18, 0,10,10,13,13, 0,16,16, + 20,21, 0,12,12,13,13, 0,11,11,13,13, 0,12,12,16, + 16, 0,12,12,16,16, 0,16,16, 0,21, 0,17,18, 0, 0, + 0,12,12,15,15, 0,15,15,18,18, 0,12,12,16,16, 0, + 16,16,21,22, 0,17,17,22,21, 0,12,12,16,16, 0,15, + 15,19,19, 0,12,12,16,16, 0,16,16,22,22, 0,17,16, + 22, 0, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,15,15,21, + 20, 0,19,20, 0,22, 0,18,18, 0, 0, 0,18,17, 0, 0, + 0, 0, 0, 0, 0, 0,16,16,22,21, 0,20,20, 0,22, 0, + 20,19, 0, 0, 0,11,11,12,12, 0,10,10,11,11, 0,11, + 11,12,12, 0,12,12,10,10, 0,13,13,12,12, 0,11,11, + 13,13, 0,13,13,12,12, 0,10,10,12,12, 0,13,13,14, + 13, 0,12,12,12,12, 0,12,12,13,13, 0,14,14,13,13, + 0,10,10,12,12, 0,13,13,14,14, 0,13,12,12,12, 0, + 14,14,14,14, 0,21,21,16,16, 0,12,12,12,12, 0,16, + 16,20,21, 0,13,13,11,11, 0,14,14,14,14, 0,20,20, + 16,15, 0,12,12,12,12, 0,17,17,20,20, 0,13,13,11, + 11, 7, 8, 8,16,16,11,10,10,15,15,12,10,10,17,17, + 0,14,14,16,15, 0,15,15,17,17,11, 9, 9,16,16,14, + 12,12,17,17,13, 9, 9,16,15, 0,14,14,19,18, 0,14, + 14,16,16,12,10,10,17,18,16,13,13,17,18,14,10,10, + 16,16, 0,14,14,19,19, 0,14,15,17,17, 0,15,15,18, + 19, 0, 0, 0,20,20, 0,13,13,17,17, 0,17,18, 0,22, + 0,15,15,16,17, 0,15,15,18,18, 0, 0, 0,20,21, 0, + 14,14,17,17, 0,19,18, 0, 0, 0,16,16,17,17, 8, 7, + 7,14,14,12,11,11,15,15,13,11,11,15,15, 0, 0, 0, + 18,19, 0,21,20,18,18,12,10,11,15,16,14,13,13,18, + 18,14,11,11,15,15, 0,20,20,19,18, 0,20, 0,18,18, + 13,11,11,16,16,17,15,15,19,19,14,12,12,15,15, 0, + 21, 0,18,20, 0,22,22,18,19, 0,22,22,19,19, 0, 0, + 0, 0, 0, 0,21,22,19,18, 0, 0, 0, 0,21, 0, 0, 0, + 19,19, 0, 0,22,20,20, 0, 0, 0, 0, 0, 0,22, 0,18, + 18, 0, 0, 0, 0,22, 0, 0, 0,19,20,11,10,10,14,14, + 14,11,11,13,13,14,11,11,15,15, 0,14,13,12,12, 0, + 15,15,16,16,13,11,11,15,15,16,13,13,15,15,15,10, + 10,14,15, 0,14,14,16,16, 0,14,14,15,15,13,11,11, + 15,15,18,14,14,15,15,15,10,10,15,14, 0,14,14,16, + 16, 0,14,14,15,15, 0,15,15,17,16, 0,21,22,18,18, + 0,13,13,14,14, 0,18,17,20,21, 0,15,15,14,14, 0, + 15,16,16,17, 0, 0, 0,19,18, 0,13,13,15,14, 0,19, + 19, 0, 0, 0,15,15,14,14, 0,12,12,14,13, 0,13,13, + 16,16, 0,12,12,16,16, 0,16,16,22, 0, 0,17,18, 0, + 22, 0,13,13,16,16, 0,15,15,18,18, 0,12,12,16,16, + 0,16,16,22,22, 0,17,17, 0, 0, 0,13,13,17,17, 0, + 16,16,19,20, 0,12,12,17,17, 0,17,17,22, 0, 0,17, + 17,22,21, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, + 21,21, 0,19,19, 0, 0, 0,18,18, 0,22, 0,18,18, 0, + 22, 0, 0, 0, 0, 0, 0,16,16,22, 0, 0,20,20, 0, 0, + 0,19,18, 0, 0, 0,12,12,15,15, 0,12,12,15,14, 0, + 13,13,15,15, 0,14,14,14,14, 0,15,15,16,16, 0,13, + 13,15,16, 0,15,15,16,16, 0,12,12,15,15, 0,14,14, + 16,16, 0,14,14,15,15, 0,13,13,15,16, 0,15,15,16, + 16, 0,12,12,15,15, 0,15,15,17,17, 0,14,14,15,15, + 0,15,15,17,17, 0,21,21,19,19, 0,13,13,14,14, 0, + 17,17,22, 0, 0,14,14,15,15, 0,15,15,17,17, 0,22, + 0,18,20, 0,13,13,15,15, 0,18,18, 0,22, 0,15,15, + 14,15, 8, 8, 8,17,16,12,10,10,16,16,13,10,10,17, + 16, 0,15,15,17,17, 0,15,15,17,17,12,11,11,18,18, + 15,12,12,18,18,15,10,10,16,17, 0,14,14,18,18, 0, + 14,14,17,17,13,10,10,16,16,17,14,14,17,17,15,10, + 10,16,15, 0,15,15,19,20, 0,14,14,15,16, 0,16,16, + 19,19, 0, 0, 0,21,22, 0,13,13,17,17, 0,18,17, 0, + 21, 0,15,15,17,17, 0,15,15,18,19, 0, 0,22, 0,21, + 0,13,13,16,17, 0,19,19, 0,22, 0,16,15,16,16, 9, + 8, 8,14,14,12,11,11,15,15,13,11,11,15,15, 0,21, + 20,19,18, 0, 0, 0,19,18,12,11,11,16,15,15,13,13, + 17,18,14,11,11,15,15, 0,22,22,19,18, 0,22,21,18, + 18,14,11,11,15,15,17,14,14,18,18,15,12,12,15,15, + 0,22,22,20,19, 0, 0,21,18,18, 0, 0,22,20,20, 0, + 0, 0, 0, 0, 0,20,21,18,18, 0, 0, 0,21,21, 0, 0, + 0,20,19, 0,22,21,19,19, 0, 0, 0, 0, 0, 0, 0,22, + 17,18, 0, 0,22, 0,22, 0,22, 0,19,19, 0,11,11,15, + 15, 0,11,11,14,14, 0,12,12,15,15, 0,15,15,14,14, + 0,16,16,16,16, 0,12,12,16,16, 0,14,14,16,16, 0, + 11,11,15,15, 0,15,15,17,17, 0,15,15,15,15, 0,12, + 12,16,16, 0,14,14,15,15, 0,11,11,15,15, 0,15,15, + 17,17, 0,15,15,14,15, 0,16,16,17,17, 0, 0, 0,19, + 19, 0,14,14,15,15, 0,18,18,21, 0, 0,15,15,14,15, + 0,16,16,17,17, 0,21, 0,19,19, 0,14,14,15,15, 0, + 20,20,22, 0, 0,16,15,14,14, 0,12,12,13,13, 0,12, + 12,16,16, 0,12,12,16,16, 0,16,16,22,21, 0,18,17, + 21, 0, 0,13,13,16,16, 0,15,15,18,19, 0,12,12,16, + 16, 0,16,17,22, 0, 0,17,17, 0,22, 0,13,13,17,16, + 0,15,15,19,19, 0,12,12,16,16, 0,16,16,21,20, 0, + 17,16,22, 0, 0,18,18,22,21, 0, 0, 0, 0, 0, 0,15, + 16,21,21, 0,19,19, 0, 0, 0,18,17, 0, 0, 0,18,18, + 21, 0, 0, 0, 0, 0, 0, 0,16,16,22,22, 0,20,21, 0, + 0, 0,18,19, 0,22, 0,13,13,16,16, 0,12,12,15,15, + 0,13,13,16,16, 0,14,14,15,15, 0,15,15,17,17, 0, + 13,13,17,16, 0,15,15,17,17, 0,12,12,16,16, 0,15, + 15,17,17, 0,14,14,16,16, 0,13,13,16,17, 0,15,15, + 17,17, 0,12,12,16,16, 0,14,14,17,17, 0,14,14,16, + 16, 0,16,16,17,17, 0,21, 0,21,19, 0,13,13,16,16, + 0,17,17, 0, 0, 0,15,15,16,16, 0,16,15,18,18, 0, + 22, 0,20,20, 0,13,13,15,15, 0,18,18, 0, 0, 0,15, + 15,15,15, 0,12,12,17,17, 0,14,14,17,17, 0,14,14, + 17,17, 0,17,17,18,17, 0,17,17,19,18, 0,13,13,17, + 17, 0,16,16,18,18, 0,13,13,16,16, 0,17,17,19,19, + 0,16,16,17,17, 0,13,13,18,18, 0,17,17,18,18, 0, + 13,13,17,17, 0,17,17,19,19, 0,16,17,17,17, 0,17, + 17,19,19, 0,21, 0,21,19, 0,14,14,16,16, 0,20,19, + 0,21, 0,16,16,16,16, 0,17,18,19,19, 0, 0, 0, 0, + 21, 0,15,15,16,17, 0,21,20, 0, 0, 0,17,18,16,17, + 0, 9, 9,14,14, 0,14,14,15,16, 0,14,14,15,15, 0, + 0, 0,18,18, 0,21, 0,18,19, 0,12,12,15,15, 0,16, + 16,17,17, 0,14,14,14,14, 0,22, 0,19,18, 0,22, 0, + 17,18, 0,14,14,16,15, 0,18,18,19,18, 0,14,15,15, + 15, 0, 0,21,20,20, 0, 0, 0,18,18, 0,21,21,19,19, + 0, 0, 0, 0, 0, 0,21,21,18,18, 0,22, 0,20,20, 0, + 22, 0,19,19, 0,22, 0,19,20, 0, 0, 0, 0, 0, 0, 0, + 21,17,18, 0, 0, 0,22,22, 0, 0, 0,19,18, 0,18,20, + 16,16, 0,21,20,17,17, 0, 0,21,18,18, 0,22,21,18, + 18, 0, 0,22,19,19, 0,20,20,17,17, 0, 0, 0,18,18, + 0,19,20,17,17, 0,22, 0,19,21, 0,22,21,18,18, 0, + 20,19,17,18, 0, 0, 0,19,19, 0,20,20,17,17, 0,22, + 22,21,21, 0,20, 0,18,18, 0,22,22,18,18, 0, 0, 0, + 20,22, 0,20,20,16,16, 0, 0, 0,21, 0, 0,21,20,16, + 17, 0,22, 0,19,20, 0, 0, 0,21,20, 0,19,21,17,17, + 0, 0, 0, 0, 0, 0,21,21,17,17, 0,12,12,13,13, 0, + 14,14,16,16, 0,14,14,16,16, 0,18,18, 0, 0, 0,19, + 18,22, 0, 0,13,13,16,16, 0,16,16,18,18, 0,13,13, + 16,16, 0,17,18,21, 0, 0,18,18,21, 0, 0,13,13,16, + 16, 0,17,17,19,20, 0,13,13,16,17, 0,18,18,21, 0, + 0,18,18,21, 0, 0,18,19, 0,21, 0, 0, 0, 0, 0, 0, + 16,16,21,20, 0,20,20, 0, 0, 0,18,19, 0, 0, 0,18, + 18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0,22,22, + 0, 0, 0,19,19, 0, 0, 0,16,16,19,20, 0,17,16,22, + 21, 0,17,17,21,20, 0,19,18, 0,22, 0,19,19,22,22, + 0,16,15,22,22, 0,19,19, 0,21, 0,15,15,20,20, 0, + 18,19, 0,21, 0,18,18,22,22, 0,16,16,21,20, 0,20, + 19,21,22, 0,16,15,20,20, 0,19,19, 0,22, 0,18,18, + 21, 0, 0,19,18,21,22, 0, 0, 0, 0, 0, 0,16,16,19, + 21, 0,20,22, 0,22, 0,18,18,20,21, 0,19,18, 0,22, + 0, 0, 0,22, 0, 0,16,16,20,20, 0,21,21, 0, 0, 0, + 18,18,21, 0, 0,12,12,17,17, 0,15,14,17,17, 0,14, + 14,18,18, 0,17,17,17,18, 0,18,18,18,18, 0,13,13, + 18,18, 0,16,17,19,18, 0,13,13,16,17, 0,17,17,18, + 19, 0,17,17,17,17, 0,13,13,17,17, 0,17,18,18,18, + 0,13,13,16,16, 0,18,18,19,20, 0,16,17,17,16, 0, + 17,18,19,18, 0, 0, 0,22,21, 0,15,15,16,16, 0,20, + 20,21,22, 0,17,17,16,16, 0,16,17,18,18, 0, 0, 0, + 21,21, 0,15,15,16,16, 0,21,20, 0, 0, 0,17,17,16, + 16, 0,10,10,14,14, 0,14,14,15,15, 0,14,14,15,15, + 0,22, 0,18,18, 0, 0, 0,19,19, 0,13,13,15,16, 0, + 17,16,18,18, 0,14,14,15,15, 0,21,21,19,18, 0,22, + 21,18,17, 0,14,14,15,15, 0,18,18,19,18, 0,15,15, + 14,14, 0,22,21,19,19, 0,22,21,17,18, 0, 0, 0,19, + 19, 0, 0, 0, 0, 0, 0,20,22,17,17, 0, 0,22,22,20, + 0, 0, 0,19,18, 0,21,22,19,18, 0, 0, 0, 0, 0, 0, + 22,22,17,18, 0, 0, 0,21,22, 0, 0, 0,19,18, 0,20, + 20,17,17, 0,21,21,17,18, 0,21,22,18,18, 0,21, 0, + 18,18, 0,22, 0,19,19, 0,19,21,18,18, 0, 0,22,18, + 18, 0,22,21,17,17, 0,22, 0,20,20, 0, 0, 0,18,18, + 0,22,21,18,18, 0,21, 0,19,19, 0,20,21,17,17, 0, + 0,22,22,20, 0,21,22,17,17, 0, 0,21,19,18, 0, 0, + 0,21,21, 0,21,20,16,17, 0, 0, 0, 0, 0, 0,21, 0, + 17,17, 0,21, 0,19,20, 0, 0, 0,20,22, 0,20,20,17, + 17, 0, 0, 0, 0, 0, 0,21,21,17,17, 0,12,12,13,13, + 0,14,14,16,16, 0,14,14,16,16, 0,18,18,21, 0, 0, + 19,19,22, 0, 0,13,13,16,16, 0,16,16,18,18, 0,13, + 13,16,16, 0,18,18,21,22, 0,18,18, 0,22, 0,13,13, + 16,16, 0,17,17,20,18, 0,13,13,16,16, 0,19,18, 0, + 22, 0,18,18,22,21, 0,18,19, 0, 0, 0, 0, 0, 0, 0, + 0,16,16,21,21, 0,21,21, 0, 0, 0,18,19, 0, 0, 0, + 19,19,21, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0,20, + 20, 0, 0, 0,20,20, 0, 0, 0,16,16,21,20, 0,18,17, + 21,22, 0,17,18, 0,21, 0,18,19,22,22, 0,19,19, 0, + 22, 0,16,17,21,22, 0,20,19, 0, 0, 0,16,16,20,21, + 0,19,19, 0, 0, 0,19,19, 0,22, 0,17,17,21,21, 0, + 19,20, 0, 0, 0,16,16, 0,20, 0,19,20, 0,21, 0,18, + 18, 0,22, 0,19,20,22,22, 0, 0, 0, 0,22, 0,17,17, + 0,21, 0,21,21, 0, 0, 0,18,19,23,21, 0,20,19, 0, + 0, 0, 0, 0, 0, 0, 0,17,17, 0,20, 0, 0, 0, 0, 0, + 0,19,19,23,22, +}; + +static const static_codebook _44p4_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p4_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p4_p5_0, + 0 +}; + +static const long _vq_quantlist__44p4_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p4_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p4_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p4_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p4_p5_1, + 0 +}; + +static const long _vq_quantlist__44p4_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p6_0[] = { + 1, 7, 7, 7, 8, 8, 7, 8, 8, 7, 9, 9,11,11,11, 9, + 8, 8, 8, 9, 9,12,11,12, 9, 8, 8, 6, 7, 7,10,11, + 11,10,10,10,11,11,11,14,14,14,12,11,12,11,11,11, + 15,15,14,13,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, + 7, 7,12,10,10,10, 7, 6, 9, 8, 8,12,10,10,10, 6, + 6, 7, 8, 8,12,10,10,12,10,10,11,10,10,16,14,14, + 13,10,10,12,10,10,15,14,14,14,10,10, 7, 7, 7,13, + 11,11,13,11,11,12,11,11,16,14,14,14,12,12,12,11, + 11,18,15,15,14,12,12,10, 9,10,14,11,11,13,11,11, + 12,11,11,17,14,14,14,11,11,13,11,11,16,15,15,14, + 11,11, 7, 8, 8,13,11,11,12,10,10,12,10,10,16,14, + 13,13,10,10,12,10,10,17,14,14,14,10,10, 8, 7, 7, + 12,11,11,13,11,11,12,11,11,16,15,14,14,12,12,12, + 11,11,16,15,15,14,12,12,11,10,10,14,11,11,13,11, + 11,13,11,11,17,14,14,14,11,11,13,11,11,18,14,15, + 15,11,10, +}; + +static const static_codebook _44p4_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p4_p6_0, + 0 +}; + +static const long _vq_quantlist__44p4_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p6_1[] = { + 2, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, + 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 7, 7, 8, 8, + 8, 8, 8, 8, 9, 8, 8, 9, 8, 9, 9, 8, 8,10, 8, 8, + 10, 9, 9,10, 8, 8, 6, 6, 6, 8, 6, 6, 8, 7, 7, 8, + 7, 7,10, 8, 8, 9, 7, 7, 9, 7, 7,10, 8, 8, 9, 7, + 7, 7, 7, 7,10, 8, 8,11, 9, 9,10, 9, 9,11, 9, 9, + 11, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 7, 7, 7,10, + 9, 9,10, 9, 9,10, 9, 9,11,10,10,10, 9, 9,11, 9, + 10,11,10,11,10, 9, 9, 9, 8, 8,10, 9, 9,10, 9, 9, + 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, + 9, 9, 8, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, + 9,12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7, + 10, 9, 9,10, 9, 9,10, 9, 9,11,11,11,11, 9, 9,11, + 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11, 9, + 10,11,10,10,11,10,10,11, 9, 9,11,10,10,11,10,10, + 11, 9, 9, +}; + +static const static_codebook _44p4_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p4_p6_1, + 0 +}; + +static const long _vq_quantlist__44p4_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p4_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p7_0, + 1, -513979392, 1633504256, 2, 0, + (long *)_vq_quantlist__44p4_p7_0, + 0 +}; + +static const long _vq_quantlist__44p4_p7_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p4_p7_1[] = { + 1, 9, 9, 7, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, + 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 5,10, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 8,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10, +}; + +static const static_codebook _44p4_p7_1 = { + 5, 243, + (long *)_vq_lengthlist__44p4_p7_1, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p4_p7_1, + 0 +}; + +static const long _vq_quantlist__44p4_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p4_p7_2[] = { + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44p4_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p4_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p4_p7_2, + 0 +}; + +static const long _vq_quantlist__44p4_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p4_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p4_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p4_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p4_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p4_short[] = { + 3, 5,16, 9, 9,13,18,21, 4, 2,21, 6, 6,10,15,21, + 16,19, 6, 5, 7,10,13,16, 8, 6, 5, 4, 4, 8,13,16, + 8, 5, 6, 4, 4, 7,12,15,13,10, 9, 7, 7, 9,13,16, + 18,15,13,12, 9, 7,10,14,21,18,13,13, 7, 5, 8,12, +}; + +static const static_codebook _huff_book__44p4_short = { + 2, 64, + (long *)_huff_lengthlist__44p4_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p5_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p5_l0_0[] = { + 1, 4, 4, 8, 8,10,10,10,10, 9, 8,11,11, 4, 6, 5, + 8, 6,10,10,10,10,10, 9,10, 9, 4, 5, 6, 6, 9,10, + 10,10,10, 9,10, 9,10, 8, 9, 8, 9, 8, 9, 9,10, 9, + 11,10,12,10, 8, 8, 9, 8, 9, 9, 9, 9,10,10,11,10, + 12, 9,10,10,11,10,11,10,12,11,12,11,13,11, 9,10, + 10,10,11,10,11,11,12,11,12,11,12,11,12,12,12,12, + 13,12,13,12,13,12,13,13,11,12,12,12,12,12,12,12, + 13,13,13,13,13,12,12,12,13,13,13,13,13,13,13,13, + 13,13,12,13,12,13,13,13,13,13,13,13,13,13,13,12, + 13,13,13,14,14,13,13,13,13,13,13,13,12,13,12,13, + 13,13,13,13,13,13,13,13,13, +}; + +static const static_codebook _44p5_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p5_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p5_l0_0, + 0 +}; + +static const long _vq_quantlist__44p5_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p5_l0_1[] = { + 4, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 4, 4, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p5_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p5_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p5_l0_1, + 0 +}; + +static const long _vq_quantlist__44p5_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44p5_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p5_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p5_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p5_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44p5_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p5_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p5_long[] = { + 3, 7,12,14,14,16,18,19, 6, 2, 4, 6, 8, 9,12,14, + 12, 3, 3, 5, 7, 8,11,13,13, 6, 4, 5, 7, 8,10,11, + 14, 8, 7, 7, 7, 7, 9,10,15, 9, 8, 7, 7, 6, 8, 9, + 17,11,11,10, 9, 8, 9, 9,19,14,13,11,10, 9, 9, 9, +}; + +static const static_codebook _huff_book__44p5_long = { + 2, 64, + (long *)_huff_lengthlist__44p5_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p5_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p1_0[] = { + 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, + 10, 8, 9,10, 8, 9,10, 9,10,12,10,11,11, 8,10,10, + 10,11,11, 9,11,11, 5, 8, 7, 8, 9, 9, 8,10, 9, 8, + 10,10, 9,11,11,10,11,11, 8,10, 9,10,11,11, 9,12, + 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9, 9, 9,10,11, + 9,11,11, 8,10, 9,10,11,11,10,11,11, 7, 9, 9, 9, + 10,11, 9,11,11, 9, 9,11,10,10,13,11,11,12, 9,11, + 11,11,12,13,11,13,12, 7, 9, 9, 9,11,11, 9,11,10, + 9,11,10,10,11,12,11,13,12, 9,11,11,11,12,13,11, + 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10,10,11, + 11,10,11,11, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, + 9,10,11, 9,11,11, 9,11,11,11,11,13,11,13,12, 9, + 10,11,11,12,13,10,12,11, 7, 9, 9, 9,11,11, 9,11, + 10, 9,11,11,11,12,13,11,13,12, 9,11, 9,11,12,11, + 10,13,10, +}; + +static const static_codebook _44p5_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p5_p1_0, + 0 +}; + +static const long _vq_quantlist__44p5_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p5_p2_0[] = { + 4, 6, 6, 9, 9, 6, 7, 8,10,10, 6, 8, 7,10,10, 8, + 10,10,12,13, 8,10,10,13,12, 6, 7, 8,10,10, 7, 8, + 9,10,11, 8, 9, 9,11,11,10,10,11,12,14,10,11,11, + 14,13, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 9, 8,11, + 10,10,11,11,13,14,10,11,10,14,12, 9,10,10,12,12, + 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, + 14,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, + 10,13,12,13,13,14,14,15,12,13,12,15,12, 6, 7, 8, + 10,11, 8, 9,10,11,12, 8, 9, 9,11,12,10,11,12,13, + 14,10,11,11,14,13, 8, 9,10,11,12, 9,10,11,12,13, + 9,10,11,12,13,11,12,13,13,15,12,12,13,15,14, 8, + 9, 9,12,12, 9,10,11,12,13, 9,10,10,13,12,12,12, + 13,14,15,11,12,12,14,14,11,11,12,13,14,11,12,13, + 13,15,12,13,13,14,15,14,13,15,14,16,14,15,15,16, + 16,11,12,11,14,13,12,13,13,15,14,11,13,12,14,13, + 14,15,15,15,16,13,14,14,16,14, 6, 8, 7,11,10, 8, + 9, 9,11,12, 8,10, 9,12,11,10,11,11,13,14,10,12, + 11,14,13, 8, 9, 9,12,12, 9,10,10,12,13, 9,11,10, + 13,12,11,12,12,13,14,12,13,12,15,14, 8,10, 9,12, + 11, 9,11,10,13,12, 9,11,10,13,12,12,13,12,14,15, + 11,13,12,15,13,11,11,12,13,14,11,12,13,13,15,12, + 13,13,14,15,13,14,14,14,16,14,15,15,16,16,11,12, + 11,14,13,12,13,13,15,14,11,13,12,15,13,14,15,15, + 16,16,13,15,13,16,14, 9,10,11,12,14,11,11,12,13, + 15,11,12,12,13,14,13,14,15,15,17,13,14,14,15,16, + 11,11,12,13,15,12,12,13,14,16,12,13,13,14,15,14, + 14,16,15,17,15,15,15,16,17,11,12,12,14,14,12,13, + 13,15,16,12,13,13,15,15,15,15,15,16,17,14,15,15, + 16,16,14,14,15,15,17,14,15,15,15,17,15,15,16,16, + 17,16,16,17,16,18,17,17,17,18,18,14,15,14,16,16, + 15,15,16,17,17,14,15,15,17,16,17,17,17,18,18,16, + 16,16,17,17, 9,11,10,14,12,11,12,12,14,13,11,12, + 11,15,13,13,14,14,16,15,13,15,14,17,15,11,12,12, + 15,14,12,13,13,15,15,12,13,13,15,15,14,15,15,16, + 16,15,15,15,17,16,11,12,11,15,13,12,13,13,15,14, + 12,13,12,16,14,15,15,15,17,16,14,15,14,17,15,14, + 14,15,16,16,14,15,15,16,16,15,16,15,17,17,16,16, + 16,17,17,17,17,17,18,17,14,15,14,16,15,15,15,15, + 17,16,15,15,15,17,15,17,17,17,18,18,16,17,16,18, + 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, + 10,11,11,13,14,10,12,11,14,13, 7, 9, 9,11,12, 9, + 10,10,12,13, 9,10,10,13,13,11,11,12,13,15,11,12, + 12,15,14, 8, 9, 9,12,11, 9,11,10,13,13, 9,11,10, + 13,12,12,13,12,14,15,11,13,12,15,13,10,11,12,13, + 14,11,12,12,13,15,12,12,13,14,15,13,13,14,14,16, + 14,15,15,16,16,11,12,11,14,13,12,13,13,15,14,11, + 13,12,15,13,14,15,15,15,16,13,14,14,16,14, 7, 9, + 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12,12, + 14,15,11,12,12,15,14, 9, 9,11,11,13,10,10,12,12, + 14,10,11,12,13,14,12,12,13,14,16,12,13,13,15,15, + 9,11,10,13,13,10,12,12,13,14,10,12,11,14,13,12, + 13,13,15,16,12,13,13,15,14,11,11,13,13,15,12,12, + 14,13,16,13,13,13,14,15,14,14,15,14,17,15,15,15, + 16,16,12,13,12,15,14,13,14,14,15,15,12,14,13,16, + 14,15,15,16,16,17,14,15,14,17,15, 7, 9, 9,12,11, + 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,14,11, + 13,12,15,14, 9,10,10,13,12,10,10,11,12,13,10,12, + 11,14,13,12,12,13,13,15,12,14,13,16,15, 9,10,10, + 13,12,11,11,12,13,13,10,12,10,14,12,13,13,13,15, + 15,12,13,12,15,13,11,12,12,14,14,12,12,13,14,15, + 13,14,13,15,15,14,13,15,13,16,15,16,15,17,16,12, + 13,12,14,14,13,14,14,15,15,12,13,12,15,14,15,15, + 16,16,17,14,15,13,16,13,10,11,12,13,14,11,12,13, + 14,15,12,13,13,15,15,14,14,15,15,17,14,15,15,16, + 16,12,12,13,12,15,12,12,14,13,16,13,13,14,14,16, + 14,14,16,15,17,15,15,16,16,17,12,13,13,15,15,13, + 14,14,16,16,13,14,13,16,15,15,16,16,17,17,14,15, + 15,17,16,14,14,15,14,17,15,15,16,15,17,15,15,16, + 15,17,16,16,17,16,18,17,17,17,17,18,14,15,15,17, + 16,15,16,16,17,17,15,16,15,17,16,17,17,17,18,18, + 16,17,16,18,17,10,12,11,14,14,12,13,13,15,15,12, + 13,12,15,14,14,15,15,16,16,14,15,15,17,16,11,13, + 12,15,14,12,13,13,15,15,13,14,13,16,14,15,15,15, + 16,16,15,16,15,17,16,12,13,13,15,15,13,14,14,16, + 16,12,14,13,16,15,15,16,16,17,17,15,16,15,17,16, + 14,15,15,16,16,14,15,15,16,16,15,16,16,17,16,16, + 16,16,16,17,17,18,17,18,17,14,15,15,17,16,15,16, + 16,17,17,15,16,15,17,16,17,17,18,18,18,16,17,16, + 18,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, + 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, + 9,10,11,12,13, 9,10,11,13,13,11,12,13,13,15,12, + 12,12,15,14, 7, 9, 9,12,11, 9,10,10,13,13, 9,10, + 10,13,12,11,12,12,14,15,11,12,11,15,13,11,11,12, + 13,14,11,12,13,13,15,12,13,13,14,15,13,14,14,14, + 16,14,15,15,16,16,10,12,11,14,13,12,13,12,14,14, + 11,12,12,15,13,14,15,15,16,16,13,14,13,16,14, 7, + 9, 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12, + 13,14,15,11,12,12,14,14, 9,10,10,12,13,10,10,12, + 12,14,11,12,11,13,13,12,12,14,13,15,13,13,13,15, + 15, 9,10,10,12,13,10,11,12,13,14,10,11,10,13,12, + 13,13,14,15,16,12,13,12,15,13,12,13,13,14,14,12, + 12,13,14,15,13,14,14,15,15,14,13,15,13,16,15,16, + 15,17,16,11,12,12,14,14,13,13,14,15,15,12,13,12, + 15,14,15,15,16,16,17,14,14,13,16,13, 7, 9, 9,12, + 11, 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,15, + 11,12,12,15,14, 9,10,11,13,13,10,11,12,13,14,10, + 12,12,14,13,12,13,13,14,16,12,13,13,16,15, 9,11, + 9,13,11,10,12,11,13,13,10,12,10,14,12,12,13,13, + 15,15,12,13,12,16,14,12,12,13,14,15,12,13,14,14, + 15,13,14,14,15,15,14,14,15,15,17,15,16,15,17,16, + 11,13,11,15,13,13,14,13,15,14,12,14,12,16,13,15, + 15,15,16,16,14,15,14,17,14,10,11,12,14,14,12,12, + 13,14,15,12,13,13,15,15,14,15,15,16,17,14,15,15, + 16,16,12,12,13,15,15,13,13,14,15,16,13,14,14,16, + 16,15,15,16,16,17,15,16,16,17,17,11,12,13,14,15, + 13,13,14,15,16,12,13,13,15,15,15,15,16,16,17,15, + 15,15,16,16,14,15,15,16,17,15,15,16,16,17,15,16, + 16,17,17,16,16,17,16,18,17,17,17,18,18,14,15,15, + 16,16,15,16,16,16,17,15,15,15,16,16,17,17,17,18, + 18,16,16,16,17,16,10,12,11,14,13,12,13,13,15,15, + 11,13,12,15,14,14,15,15,16,16,14,15,14,17,15,12, + 13,13,15,15,13,13,14,16,16,13,14,14,16,16,15,15, + 15,16,17,15,16,16,17,17,12,13,12,15,12,13,14,13, + 16,14,12,14,12,16,13,15,16,15,17,16,14,16,14,17, + 15,14,15,15,16,17,15,15,16,17,17,15,16,16,17,17, + 16,16,17,17,18,17,18,17,18,18,14,15,14,17,14,15, + 16,15,17,15,15,16,15,17,15,17,17,17,18,17,16,17, + 16,18,16, 9,11,11,14,14,11,12,12,14,14,11,12,12, + 15,14,13,14,14,16,16,13,15,14,16,16,10,11,12,14, + 14,11,12,13,15,15,12,13,13,15,15,13,14,15,16,17, + 14,15,15,17,16,11,12,12,15,14,12,13,13,15,15,12, + 13,13,15,15,14,15,15,16,16,14,15,15,17,16,12,13, + 14,15,16,13,14,14,15,16,13,14,15,16,16,15,15,16, + 16,18,16,16,16,18,17,14,14,14,16,15,15,15,15,17, + 16,14,15,15,17,16,16,17,17,18,17,16,16,16,18,16, + 10,12,12,14,14,11,12,13,15,15,12,13,13,15,15,13, + 14,15,16,17,14,15,15,17,16,11,12,13,14,15,12,12, + 14,15,16,13,13,14,15,16,14,14,15,16,17,15,15,16, + 17,17,12,13,13,15,15,13,14,14,16,16,13,14,13,16, + 15,15,16,15,17,17,15,16,15,17,16,13,13,15,14,17, + 14,13,16,15,17,15,14,16,15,17,15,15,17,16,18,16, + 16,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, + 15,17,16,17,17,17,18,18,16,17,16,18,17,10,12,11, + 14,14,11,12,13,15,15,12,13,12,15,15,14,15,15,16, + 16,14,15,15,17,16,11,12,12,15,15,12,13,13,15,15, + 13,14,13,16,15,14,15,15,16,16,15,16,15,17,16,11, + 13,13,15,15,13,14,14,15,15,12,14,13,16,15,15,16, + 15,17,17,15,16,15,17,16,13,15,14,16,16,14,15,14, + 16,16,15,16,15,17,16,15,16,16,16,17,16,17,16,18, + 17,14,15,15,16,16,15,16,16,17,17,15,15,15,17,16, + 17,17,17,18,18,16,16,16,18,16,12,13,13,15,16,13, + 14,14,15,16,13,14,14,16,16,15,15,16,16,18,15,16, + 16,17,17,13,13,14,15,16,14,14,15,15,17,14,15,15, + 16,17,15,15,17,16,18,16,16,17,17,17,13,14,14,16, + 16,14,15,15,17,17,14,15,14,17,16,16,17,16,17,18, + 16,17,16,18,17,15,15,16,14,17,16,15,17,14,18,16, + 16,16,15,18,16,16,18,15,19,18,18,18,17,19,15,16, + 16,18,17,16,17,17,18,17,16,17,16,18,17,18,18,18, + 19,19,17,18,16,18,17,11,12,12,15,15,13,13,14,15, + 16,13,14,13,16,15,15,16,16,16,17,15,16,16,17,16, + 12,14,13,16,15,13,13,14,15,16,14,15,14,17,15,15, + 15,16,16,17,16,17,16,18,17,12,13,14,15,16,14,15, + 15,16,16,13,14,13,16,15,16,16,16,17,17,15,16,15, + 17,15,15,16,15,17,16,15,15,15,16,16,16,17,16,18, + 16,16,15,16,15,17,17,18,17,18,17,15,15,16,17,17, + 16,16,17,17,17,15,16,15,17,16,18,18,18,18,18,16, + 17,16,18,15, 9,11,11,14,14,11,12,12,14,15,10,12, + 12,15,14,13,14,15,16,16,13,14,14,16,16,11,12,12, + 14,15,12,12,13,15,15,12,13,13,15,15,14,15,15,16, + 17,14,15,15,16,16,10,12,12,14,14,12,13,13,15,15, + 11,13,12,15,15,14,15,15,16,17,13,15,14,16,16,14, + 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, + 17,16,18,16,17,17,17,17,12,14,13,16,15,13,15,14, + 16,16,13,14,14,16,15,16,16,16,17,17,15,16,15,17, + 16,10,11,11,14,14,12,12,13,14,15,11,13,12,15,14, + 14,15,15,16,17,14,15,15,16,16,12,13,13,15,15,12, + 13,14,15,16,13,14,14,15,15,15,15,16,16,17,15,15, + 16,17,17,11,12,12,15,15,13,13,14,15,16,12,13,13, + 15,15,15,15,16,16,17,14,15,15,16,16,14,15,15,16, + 16,15,15,15,16,17,15,16,16,17,17,16,16,17,16,18, + 17,17,17,17,18,13,14,15,16,16,15,15,16,16,17,14, + 14,14,16,16,16,16,17,17,18,16,16,16,17,16,10,12, + 12,14,14,12,13,13,15,15,11,13,12,15,15,14,15,15, + 16,17,13,15,14,17,16,12,13,13,15,15,13,13,14,15, + 16,13,14,14,16,16,15,15,16,16,17,15,15,16,17,17, + 11,13,12,15,14,13,14,13,16,15,12,14,12,16,15,15, + 16,15,17,17,14,15,14,17,16,14,15,15,16,17,15,15, + 16,16,17,15,16,16,17,17,16,16,17,17,18,17,17,17, + 18,18,13,15,13,17,14,14,16,14,17,16,14,15,13,17, + 15,16,17,16,18,17,15,17,15,18,16,11,12,12,15,15, + 13,13,14,15,16,13,14,13,16,15,15,16,16,16,17,15, + 16,16,17,16,12,14,13,16,15,13,13,14,15,16,14,15, + 15,16,16,16,15,16,16,17,16,16,16,17,17,12,13,14, + 15,16,14,14,15,15,17,13,14,13,16,15,16,16,17,17, + 18,15,16,15,17,15,15,16,15,17,17,15,15,16,16,17, + 16,17,16,17,17,16,15,17,15,18,17,18,17,18,18,15, + 15,16,16,17,16,16,17,16,18,15,15,15,16,16,17,17, + 18,17,18,16,16,15,17,15,12,13,13,15,15,13,14,14, + 16,16,13,14,14,16,16,15,16,16,17,18,15,16,15,18, + 16,13,14,14,16,16,14,14,15,16,17,14,15,15,17,17, + 16,16,17,17,18,16,16,17,18,17,13,14,13,16,14,14, + 15,15,17,16,14,15,14,17,15,16,17,17,18,17,15,17, + 15,18,16,15,16,16,17,17,16,16,17,17,18,16,17,17, + 18,18,17,16,18,17,19,18,18,18,18,18,15,16,15,17, + 14,16,16,16,18,15,16,17,15,18,14,18,18,18,18,17, + 17,18,16,19,15, +}; + +static const static_codebook _44p5_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p5_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p5_p2_0, + 0 +}; + +static const long _vq_quantlist__44p5_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p3_0[] = { + 1, 5, 6, 5, 7, 8, 5, 8, 7, 5, 7, 8, 7, 8,10, 8, + 10,10, 5, 8, 7, 8,10,10, 7,10, 8, 6, 8, 9, 8,10, + 11, 9,10,10, 9,10,11,10,11,12,11,12,12, 9,11,10, + 11,12,12,10,12,11, 6, 9, 8, 9,10,10, 8,11,10, 9, + 10,11,10,11,12,11,12,12, 9,11,10,11,12,12,10,12, + 11, 6, 9, 9, 8,10,11, 9,11,10, 8,10,10,10,10,12, + 11,12,12, 9,11,10,11,12,12,10,12,11, 8,10,10,10, + 11,12,10,12,11,10,10,12,11,11,13,12,13,13,10,12, + 11,12,13,13,11,13,11, 7,10,10,10,11,12,10,12,11, + 10,12,11,11,11,12,12,14,13,10,12,12,12,14,14,11, + 13,11, 6, 9, 9, 9,10,11, 8,11,10, 9,10,11,10,11, + 12,11,12,12, 8,11,10,11,12,12,10,12,10, 7,10,10, + 10,11,12,10,12,11,10,12,12,11,11,13,12,13,13,10, + 11,12,12,13,14,11,12,11, 8,10,10,10,11,12,10,12, + 11,10,11,12,11,11,13,12,13,13,10,12,10,12,13,13, + 11,13,11, +}; + +static const static_codebook _44p5_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p5_p3_0, + 0 +}; + +static const long _vq_quantlist__44p5_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p3_1[] = { + 5, 6, 6, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 7, 8, 7, + 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, + 8, 9, 9, 8, 9, 9, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, + 8, 6, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 9, + 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, + 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 8, 9, 8, 9, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, 8, + 9, 9, 6, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, + 8, 8, 9, 8, 9, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 8, + 8, 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, + 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p5_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p5_p3_1, + 0 +}; + +static const long _vq_quantlist__44p5_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p4_0[] = { + 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, + 10,10, 5, 8, 7, 9,10,10, 7,10, 7, 6, 8, 9, 9,10, + 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, + 11,12,13,11,13,11, 6, 9, 8, 9,11,11, 9,12,10, 9, + 11,11,11,11,13,11,13,12, 9,11,10,12,13,13,11,13, + 11, 6, 9, 9, 8,10,11, 9,12,11, 9,10,11,10,10,12, + 11,13,13, 9,11,11,11,13,12,11,13,11, 8,10,10, 9, + 10,12,10,12,11,10,10,12,10,10,13,12,13,13,10,12, + 11,12,13,13,10,13,10, 7,10,10,11,11,13,11,14,11, + 10,12,11,11,11,13,13,14,13,10,12,12,14,14,14,11, + 14,11, 6, 9, 9, 9,11,12, 8,11,10, 9,11,11,11,11, + 13,11,12,13, 8,11,10,11,13,13,10,12,10, 7,10,10, + 11,11,14,11,13,11,10,12,12,11,11,14,14,14,14,10, + 11,12,13,13,14,11,13,11, 8,10,10,10,11,12, 9,12, + 10,10,11,12,11,10,13,12,13,13,10,12,10,12,13,13, + 11,13,10, +}; + +static const static_codebook _44p5_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p5_p4_0, + 0 +}; + +static const long _vq_quantlist__44p5_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p5_p4_1[] = { + 5, 7, 7,10,10, 7, 8, 9,10,11, 7, 9, 8,11,10, 9, + 10,10,11,11, 9,10,10,11,11, 7, 9, 9,10,10, 8, 9, + 10,10,11, 9,10,10,11,11,10,10,11,11,11,10,11,11, + 12,12, 7, 9, 9,10,10, 9,10,10,11,11, 8,10, 9,11, + 10,10,11,11,11,11,10,11,10,11,11,10,10,10,11,11, + 10,10,11,11,11,11,11,11,11,11,11,11,12,11,12,11, + 12,11,12,12,10,10,10,11,11,10,11,11,11,11,10,11, + 10,11,11,11,12,11,12,12,11,12,11,12,11, 8, 9, 9, + 11,11, 9,10,10,11,12, 9,10,10,11,11,10,11,11,12, + 12,10,11,11,12,12, 9,10,10,11,11,10,10,11,11,12, + 10,11,11,12,12,11,11,12,12,12,11,12,12,12,12, 9, + 10,10,11,11,10,11,11,12,12,10,11,10,12,12,11,12, + 12,12,12,11,12,12,12,12,11,11,11,12,12,11,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12, 8, 9, 9,11,11, 9, + 10,10,11,11, 9,10,10,11,11,10,11,11,12,12,10,11, + 11,12,12, 9,10,10,11,11,10,10,11,12,12,10,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12, 9,10,10,11, + 11,10,11,11,12,12,10,11,10,12,11,11,12,12,12,12, + 11,12,11,12,12,11,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, + 11,12,12,11,12,12,12,12,11,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,10,11,11,12,12,11,12,12,12, + 12,11,12,12,12,12,12,12,13,13,13,12,12,12,13,13, + 11,12,12,12,12,12,12,12,12,13,12,12,12,13,13,12, + 12,13,13,13,12,13,13,13,13,11,12,12,12,12,12,12, + 12,13,13,12,12,12,13,13,12,13,13,13,13,12,13,13, + 13,13,12,12,12,12,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, + 13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,10,11,11,12,12,11,12,12,12,12,11,12, + 11,12,12,12,12,12,13,12,12,12,12,13,13,11,12,12, + 12,12,12,12,12,13,13,12,12,12,13,13,12,13,13,13, + 13,12,13,13,13,13,11,12,12,12,12,12,12,12,13,13, + 12,12,12,13,12,12,13,13,13,13,12,13,12,13,13,12, + 12,12,12,13,12,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,12,12,12,13,12,13,13,13, + 13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13, 8, 9, 9,11,11, 9,10,10,11,11, 9,10,10,12,11, + 10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11,10, + 10,11,11,12,10,11,11,12,12,11,11,12,12,12,11,12, + 12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11,10, + 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, + 12,11,11,12,12,12,11,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, + 10,11,11,10,10,11,12,12,10,11,11,12,12,11,11,12, + 12,12,11,12,12,12,12,10,10,11,11,12,11,11,12,12, + 12,11,11,12,12,12,11,11,12,12,13,12,12,12,12,12, + 10,11,11,12,12,11,12,11,12,12,11,12,11,12,12,12, + 12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,12, + 12,12,12,12,12,12,12,13,12,12,13,12,13,12,12,13, + 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,13,12,12,12,12,13,12, 8,10,10,11,11, + 10,11,11,12,12,10,11,10,12,12,11,12,12,12,12,11, + 12,12,12,12,10,11,10,12,12,10,10,11,12,12,11,12, + 12,12,12,12,12,12,12,13,12,12,12,13,13,10,11,11, + 12,12,11,12,12,12,12,10,12,11,12,12,12,12,12,13, + 13,12,13,12,13,12,11,12,12,12,12,11,12,12,12,13, + 12,12,12,13,13,12,12,13,12,13,12,13,13,13,13,11, + 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, + 13,13,13,12,13,12,13,12,11,11,11,12,12,11,12,12, + 12,13,11,12,12,12,12,12,12,12,13,13,12,12,13,13, + 13,11,12,12,12,12,12,12,12,12,13,12,12,13,13,13, + 12,12,13,13,13,13,13,13,13,13,11,12,12,12,12,12, + 13,12,13,13,12,12,12,13,13,12,13,13,13,13,12,13, + 13,13,13,12,12,12,12,13,12,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,10,11,11,12,12,11,12,12,12,13,11, + 12,12,13,12,12,13,13,13,13,12,13,13,13,13,11,12, + 12,12,12,12,12,12,13,13,12,13,12,13,13,13,13,13, + 13,13,13,13,13,13,13,11,12,12,13,12,12,13,12,13, + 13,12,13,12,13,13,13,13,13,13,13,13,13,13,13,13, + 12,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13, 8, 9, 9,11,11, 9,10,10,11,12, 9,10,10,11, + 11,10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11, + 10,10,11,12,12,10,11,11,12,12,11,11,12,12,12,11, + 12,12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11, + 10,12,12,11,12,12,12,12,11,12,11,12,12,11,11,11, + 12,12,11,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 8, + 10,10,11,11,10,10,11,12,12,10,11,11,12,12,11,12, + 12,12,12,11,12,12,12,12,10,11,11,12,12,10,11,12, + 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, + 13,10,10,11,12,12,11,12,12,12,12,10,11,10,12,12, + 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,11, + 12,12,12,13,12,12,12,13,13,12,12,13,12,13,12,13, + 13,13,13,11,12,12,12,12,12,12,12,13,13,11,12,12, + 13,12,12,13,13,13,13,12,13,12,13,12, 9,10,10,11, + 11,10,11,11,12,12,10,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, + 11,12,12,12,12,12,12,12,13,12,12,12,13,12,10,11, + 10,12,11,11,12,11,12,12,11,12,11,12,12,12,12,12, + 12,12,12,12,11,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,13,12,13,12,13,13,13,13, + 11,12,11,12,12,12,12,12,13,12,12,12,12,12,12,12, + 13,12,13,13,12,12,12,13,12,10,11,11,12,12,11,12, + 12,12,13,11,12,12,13,12,12,12,13,13,13,12,13,13, + 13,13,11,12,12,12,13,12,12,13,13,13,12,12,13,13, + 13,13,13,13,13,13,13,13,13,13,13,11,12,12,12,12, + 12,12,13,13,13,12,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13,12,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,13, + 13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, + 11,12,12,12,12,12,12,13,13,13,12,13,12,13,13,11, + 12,12,12,12,12,12,13,13,13,12,12,13,13,13,12,13, + 13,13,13,12,13,13,13,13,11,12,12,12,12,12,13,12, + 13,13,12,12,12,13,12,13,13,13,13,13,12,13,12,13, + 13,12,12,12,13,13,12,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,12,12,12,13,12,13, + 13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,10,11,11,12,12,11,12,12,12,12,11,12,12, + 12,12,12,12,12,13,13,12,12,12,13,13,11,12,12,12, + 12,11,12,12,13,13,12,12,12,13,13,12,12,13,13,13, + 12,13,13,13,13,11,12,12,12,12,12,12,12,13,13,12, + 12,12,13,12,12,13,13,13,13,12,13,12,13,13,12,12, + 12,12,12,12,12,13,13,13,12,13,13,13,13,12,13,13, + 13,13,13,13,13,13,13,12,12,12,13,12,12,13,13,13, + 13,12,13,12,13,13,13,13,13,13,13,13,13,13,13,13, + 10,11,11,12,12,11,12,12,12,13,11,12,12,13,12,12, + 12,12,13,13,12,12,12,13,13,11,12,12,12,12,12,12, + 13,13,13,12,12,12,13,13,12,12,13,13,13,12,13,13, + 13,13,11,12,12,12,12,12,12,12,13,13,12,12,12,13, + 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,13, + 12,12,13,13,13,12,13,13,13,13,12,13,13,13,13,13, + 13,13,13,13,12,12,12,13,13,13,13,13,13,13,12,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,10,11,11, + 12,12,11,12,12,12,13,11,12,12,13,12,12,13,13,13, + 13,12,13,12,13,13,11,12,12,13,13,12,12,12,13,13, + 12,12,13,13,13,12,13,13,13,13,13,13,13,13,13,11, + 12,12,13,12,12,13,12,13,13,12,13,12,13,13,13,13, + 13,13,13,12,13,13,13,13,12,12,12,13,13,12,13,13, + 13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,11,11,11,12,12,11, + 12,12,12,12,11,12,12,12,12,12,12,12,13,13,12,12, + 12,13,13,11,12,12,12,12,12,12,12,12,13,12,12,12, + 13,13,12,12,13,13,13,12,13,13,13,13,11,12,12,12, + 12,12,12,12,13,13,12,12,12,13,12,12,13,13,13,13, + 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, + 13,13,13,13,12,13,13,12,13,13,13,13,13,13,12,12, + 12,12,12,12,13,13,13,13,12,13,12,13,13,13,13,13, + 13,13,12,13,13,13,12,10,11,11,12,12,11,12,12,12, + 12,11,12,12,12,12,12,12,12,13,13,12,13,12,13,13, + 11,12,12,12,12,12,12,12,13,13,12,12,12,13,13,12, + 12,13,13,13,13,13,13,13,13,11,12,12,12,12,12,13, + 12,13,13,12,13,12,13,13,12,13,13,13,13,12,13,12, + 13,13,12,12,12,12,12,12,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, + 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13,10,11,11,12,12,11,12,12,12,12,11,12, + 12,12,12,12,12,12,13,13,12,12,12,13,13,11,12,12, + 12,12,12,12,12,13,13,12,12,12,13,13,12,12,13,13, + 13,12,12,13,13,13,11,12,11,12,12,12,12,12,13,13, + 11,12,12,13,13,12,13,13,13,13,12,13,12,13,13,12, + 12,12,12,12,12,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,12,12,12,13,12,12,13,13, + 13,13,12,13,12,13,13,13,13,13,13,13,12,13,13,13, + 13,10,11,11,12,12,11,12,12,12,13,11,12,12,13,12, + 12,12,13,13,13,12,13,13,13,13,11,12,12,13,13,12, + 12,13,13,13,12,12,13,13,13,12,13,13,13,13,13,13, + 13,13,13,11,12,12,13,12,12,13,12,13,13,12,12,12, + 13,13,12,13,13,13,13,13,13,13,13,13,12,12,13,13, + 13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,12,12,12,13,13,13,13,13,13,13,12, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,12, + 11,12,12,11,12,12,12,13,11,12,12,12,12,12,12,12, + 13,13,12,12,12,13,13,11,12,12,12,13,12,12,12,13, + 13,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, + 11,12,12,13,12,12,12,12,13,13,12,12,12,13,13,12, + 13,13,13,13,12,13,12,13,13,12,13,12,13,13,12,13, + 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,12,12,12,13,12,13,13,13,13,13,12,13,12,13, + 13,13,13,13,13,13,12,13,13,13,13,10,11,11,12,12, + 11,12,12,12,13,11,12,12,12,12,12,12,12,13,13,12, + 12,12,13,13,11,12,12,12,12,12,12,13,13,13,12,13, + 13,13,13,12,12,13,13,13,13,13,13,13,13,11,12,12, + 12,12,12,13,12,13,13,12,12,12,13,13,12,13,13,13, + 13,12,13,12,13,13,12,12,12,12,13,12,13,13,13,13, + 12,13,13,13,13,12,13,13,13,13,13,13,13,13,13,12, + 12,12,12,12,12,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,12,13,13,13,13,11,12,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, + 12,11,12,12,12,12,12,12,12,12,13,12,12,12,13,13, + 12,12,13,13,13,12,13,13,13,13,11,12,12,12,12,12, + 12,12,13,13,12,12,12,13,12,12,13,13,13,13,12,13, + 12,13,13,12,12,12,12,12,12,12,13,13,13,12,13,13, + 13,13,13,13,13,12,13,13,13,13,13,13,12,12,12,12, + 12,12,13,13,13,13,12,13,12,13,12,13,13,13,13,13, + 13,13,13,13,12, +}; + +static const static_codebook _44p5_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p5_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p5_p4_1, + 0 +}; + +static const long _vq_quantlist__44p5_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p5_p5_0[] = { + 1, 6, 6,10,10, 6, 7, 9,11,13, 5, 9, 7,13,11, 8, + 11,12,13,15, 8,12,11,15,13, 6, 7, 8,11,11, 7, 8, + 10,11,13, 9,10,10,13,13,11,11,13,12,16,12,13,13, + 16,15, 6, 8, 7,11,11, 9,10,10,13,13, 7,10, 7,13, + 11,12,13,13,15,16,11,13,11,16,12,10,11,11,11,13, + 11,11,13,12,15,13,13,13,14,15,13,12,15,12,17,15, + 16,16,16,16,10,11,11,14,11,13,13,13,15,14,11,13, + 11,15,12,15,15,16,16,16,13,15,12,17,12, 6, 8, 9, + 12,12, 9,10,12,13,15, 9,11,11,15,14,12,13,15,16, + 18,13,14,14,17,16, 9,10,11,13,14,11,10,13,14,16, + 11,12,12,15,15,14,13,16,15,18,14,15,15,17,17, 9, + 11,11,14,14,11,12,13,15,16,11,13,11,15,14,15,15, + 15,17,18,14,15,14,17,15,13,14,14,15,16,14,14,15, + 15,17,15,16,15,17,17,16,16,17,15,19,17,18,18,19, + 18,13,14,14,16,15,15,15,16,17,17,14,15,14,18,15, + 17,17,17,19,19,16,17,15,19,16, 6, 9, 8,13,12, 9, + 11,11,14,15, 9,12,10,15,13,13,14,14,16,17,12,15, + 13,18,16, 9,11,11,14,14,11,11,13,14,15,11,13,12, + 16,15,14,14,15,15,18,14,15,15,18,17, 9,11,10,14, + 13,11,12,12,15,15,11,13,10,16,14,14,15,15,16,18, + 14,16,13,18,15,13,14,14,16,16,14,14,15,15,17,15, + 16,15,17,17,16,16,17,16,19,17,18,17,18,19,13,14, + 14,16,15,15,15,15,17,17,14,15,14,17,15,17,17,17, + 18,19,16,17,15,19,15,11,13,13,15,16,13,14,15,16, + 18,14,15,15,17,17,16,16,18,18,20,17,18,17,19,20, + 13,14,14,16,17,15,15,16,17,18,15,16,16,17,17,18, + 17,19,18,19,18,18,18,19,21,14,14,15,16,17,15,15, + 16,18,18,15,16,16,17,18,18,18,19,19,21,18,19,19, + 22,20,16,16,17,17,19,17,17,17,18,20,17,18,18,20, + 19,19,19,20,19, 0,19,19,20,20,21,17,17,17,19,18, + 18,18,20,19,19,18,18,18,20,20,19,19,20,20,20,20, + 21,20,21,19,11,13,13,16,15,14,15,15,17,17,14,15, + 14,18,16,16,18,18,20,19,16,19,17,21,18,13,14,15, + 16,17,15,15,16,18,18,15,16,15,19,18,18,18,18,19, + 19,18,18,18,22,20,13,14,14,16,16,15,16,16,18,17, + 15,16,15,18,17,18,18,18,19,19,17,18,17,21,18,16, + 17,17,18,18,17,18,19,19,19,18,20,18,19,19,19,20, + 21,19,21,20,20,20, 0,21,16,17,17,19,19,18,18,18, + 19,21,17,18,18,19,18,20,19,21,20,21,19,20,20,22, + 19, 7, 9, 9,13,13, 8,10,11,14,15, 9,12,11,15,14, + 11,13,14,16,17,13,15,14,17,16, 8,10,11,14,14,10, + 10,12,14,16,11,12,12,16,15,13,12,15,15,18,14,15, + 15,19,17, 9,11,11,14,14,11,12,12,15,15,11,13,11, + 16,14,14,15,14,17,17,14,16,14,18,15,12,13,14,15, + 16,13,13,15,14,17,15,15,15,17,17,15,14,17,14,19, + 17,18,18,19,18,13,14,14,16,16,15,15,15,17,17,14, + 15,14,18,15,17,18,17,18,17,16,18,16,19,15, 7,10, + 10,13,13, 9,10,12,14,15,10,12,11,15,14,12,13,14, + 16,17,13,15,14,18,16,10,10,12,13,14,10,10,13,13, + 16,12,12,13,15,15,13,12,15,15,18,15,15,16,18,17, + 10,11,11,14,14,12,13,13,15,16,10,13,10,16,14,14, + 15,15,17,17,14,15,13,17,15,13,13,14,15,16,14,13, + 15,14,18,15,15,16,16,17,16,15,18,15,18,17,18,18, + 18,18,13,15,14,17,16,15,16,16,17,17,14,15,13,17, + 15,17,17,18,18,18,16,17,14,20,14, 8,10,10,14,14, + 11,11,13,14,16,11,13,11,16,14,14,15,16,16,18,14, + 16,15,18,16,10,12,11,15,14,11,11,13,14,16,13,14, + 13,16,15,15,14,16,15,19,16,17,16,20,18,10,11,12, + 14,15,13,13,14,16,16,11,14,11,16,14,16,16,17,18, + 19,15,17,14,20,15,14,15,14,17,16,13,14,15,15,18, + 16,17,16,19,18,16,15,18,15,19,18,19,18,21,21,14, + 14,15,16,17,16,16,17,18,18,13,15,14,17,15,18,18, + 19,18,22,16,18,15,21,15,12,13,14,16,16,14,14,16, + 16,18,14,15,15,17,18,16,16,18,18,20,18,18,17,20, + 20,13,14,15,15,17,15,14,16,16,18,16,16,16,17,19, + 17,15,18,17,21,18,18,18,19,19,14,15,15,18,17,15, + 16,16,18,19,15,16,15,18,18,17,18,18,20,21,17,19, + 17,20,19,16,16,17,16,19,17,17,18,17,20,18,18,18, + 18,19,19,18,20,17,22,20,20,19,20,20,17,17,18,18, + 19,18,18,20,21,20,17,18,17,20,20,21,21,21,21,21, + 19,21,18,22,20,11,13,13,17,16,14,14,16,16,18,14, + 16,14,18,16,17,18,19,19,20,18,19,18,21,19,14,15, + 14,17,16,14,14,16,18,18,16,17,16,18,17,18,17,19, + 18,20,19,19,18,20,20,13,14,15,16,17,16,16,17,18, + 19,14,16,14,19,17,18,19,18,20,20,18,20,17,21,18, + 17,17,17,19,18,16,17,18,18,19,18,19,18,21,21,18, + 18,20,17,21,19,20,20,22,21,16,17,18,18,19,18,18, + 19,21,20,16,17,17,20,18,21,21,22,21,22,18,21,18, + 0,18, 7, 9, 9,13,13, 9,11,12,14,15, 8,11,10,15, + 14,13,14,15,16,18,11,14,13,17,15, 9,11,11,14,14, + 11,11,13,14,16,11,12,12,15,15,14,14,16,15,18,14, + 14,15,17,17, 8,11,10,14,14,11,12,12,15,15,10,12, + 10,16,14,14,15,15,17,18,13,15,12,18,15,13,14,14, + 16,16,14,14,15,15,17,15,15,15,16,17,16,15,17,15, + 19,17,17,17,18,18,12,14,13,16,15,15,15,15,17,17, + 13,15,13,17,14,17,18,18,18,19,15,17,14,19,14, 8, + 10,10,14,14,11,11,13,14,16,11,13,11,16,14,14,15, + 16,17,19,14,16,15,18,17,10,12,11,15,14,11,11,14, + 14,17,13,14,13,17,15,15,14,17,15,19,16,17,16,19, + 17,10,11,12,14,15,13,13,14,15,17,11,13,11,17,14, + 16,16,17,18,19,15,16,14,18,15,14,15,14,16,16,13, + 14,15,15,18,16,16,16,18,18,16,15,18,15,20,18,19, + 18,21,18,14,14,15,16,17,16,16,17,17,18,13,15,14, + 17,16,19,19,19,19,19,15,18,15,20,15, 7,10,10,13, + 13,10,11,12,14,15, 9,12,10,15,14,13,14,15,16,17, + 12,15,13,17,16,10,11,11,14,14,10,10,13,14,16,12, + 13,13,16,15,14,13,16,15,18,15,15,16,17,17,10,12, + 10,14,13,12,13,12,15,15,10,13,10,16,13,15,16,15, + 17,18,13,16,12,18,15,13,14,14,16,17,14,13,15,15, + 18,15,16,15,17,17,16,14,17,15,19,17,18,18,19,19, + 13,15,13,17,14,15,15,15,18,17,14,15,13,17,14,18, + 17,18,18,19,15,17,15,19,15,11,13,13,16,17,14,14, + 16,16,18,14,16,15,18,17,17,18,19,18,21,18,18,17, + 20,18,13,15,14,17,16,14,14,16,17,18,16,17,16,19, + 17,18,17,19,18,22,18,19,19,21,21,13,14,15,16,18, + 16,16,17,17,20,14,16,14,18,17,18,18,19,19,21,17, + 18,17,21,18,17,18,17,19,18,16,17,17,18,19,18,18, + 18,22,22,18,17,19,17, 0,20,21,19,21,20,17,17,18, + 18,21,18,18,18,19,21,17,17,17,19,19,20,20,22,21, + 21,19,20,18,20,17,12,14,13,17,16,14,15,15,17,18, + 14,16,14,18,16,17,18,18,21,20,16,18,16,21,18,14, + 15,15,17,17,15,15,16,18,18,15,17,16,18,18,17,17, + 19,19,20,18,19,18,20,19,14,15,14,17,15,15,16,16, + 18,17,15,16,14,19,15,18,18,18,19,20,17,20,15,21, + 17,16,17,18,18,19,17,17,18,18,20,18,19,18,19,21, + 19,18,19,19,21,20, 0,19,21,20,16,17,16,19,16,18, + 18,18,19,19,17,18,17,20,17,19,20,20,22, 0,19,20, + 17,21,17,11,13,14,16,17,14,15,15,17,18,14,15,15, + 18,18,16,17,17,19,20,16,18,17,19,21,13,14,15,17, + 17,14,15,16,17,19,15,16,16,18,19,16,17,18,19,21, + 17,18,20,21,21,13,15,15,17,17,15,16,16,18,19,15, + 16,16,18,19,17,17,18,19,22,17,19,18,22,19,15,16, + 17,19,19,16,17,18,18,20,17,18,18,19,20,19,18,20, + 18,22,20,19,19,22,21,16,17,17,18,19,18,18,18,19, + 20,17,18,18,20,19,20,19,20,22,20,19,20,21,21,20, + 12,14,14,16,16,13,14,16,17,18,14,16,15,18,18,15, + 17,17,19,19,17,18,18,19,19,13,14,15,16,17,14,14, + 16,16,20,15,16,16,17,19,16,15,18,17,20,18,17,19, + 19,19,14,15,15,17,17,16,16,16,18,18,15,16,15,19, + 18,17,18,18,20,21,17,18,17,21,18,16,15,17,17,19, + 17,15,18,17,20,19,17,18,19,20,18,16,19,17,22,20, + 19,20,19,20,17,17,18,19,19,18,18,19,20,20,17,18, + 17,18,18,21,21,20,20,21,18,20,17,21,19,11,14,14, + 16,17,15,14,16,17,19,14,16,14,18,17,18,18,19,19, + 21,17,19,18,20,20,13,15,14,17,17,14,14,16,17,18, + 16,17,16,19,18,18,17,19,18,20,18,21,18,20,20,13, + 15,15,16,17,16,16,17,18,19,14,16,15,19,18,19,19, + 19,21,20,18,19,17,20,18,16,17,16,19,18,16,17,17, + 19,20,17,19,18,20,19,18,17,21,18, 0,21,20,20, 0, + 20,17,17,18,18,19,18,19,19,20,22,16,17,17,20,18, + 21,22,20,20,22,18,22,18,22,18,12,14,14,17,17,14, + 15,16,17,19,14,16,15,17,17,17,17,18,18,21,17,19, + 17,20,19,14,15,15,16,18,15,14,16,16,19,16,17,16, + 19,18,17,16,20,17,20,18,20,19,19,20,14,15,15,18, + 17,16,16,17,18,19,14,16,15,19,17,18,21,18,19,21, + 17,18,17,19,18,17,17,18,17,20,17,16,18,17,21,18, + 19,19,19,19,18,17,19,17,20,20,21,20,21,20,17,17, + 17,19,19,19,18,18,20,21,16,18,16,19,18,20,20,21, + 21,20,18,19,16, 0,17,12,14,14,17,17,15,15,18,17, + 19,15,18,15,20,16,20,19,21,18,22,20,20,20,22,19, + 14,16,14,20,17,14,15,17,17,20,18,18,17,20,18,18, + 17,19,17,21,20,21,20, 0,21,14,15,16,17,19,18,17, + 19,18,21,14,18,15,21,17,21,20,21,20, 0,18,21,17, + 21,17,18,19,17,20,18,16,17,17,19,19,19,21,20, 0, + 20,18,17,21,17, 0,22, 0,21, 0,22,17,17,19,18,20, + 20,20,21,19,22,16,17,18,20,18,22,22, 0,22, 0,17, + 21,17,22,17,11,14,13,16,16,14,15,15,17,18,14,15, + 14,18,17,17,18,18,19,20,16,17,17,21,19,13,14,15, + 17,17,15,16,16,18,18,15,16,16,19,18,18,18,18,19, + 20,17,18,18,20,19,13,15,14,17,17,15,16,16,17,18, + 14,16,15,19,17,17,18,19,21,21,17,18,17,20,18,16, + 17,17,19,19,17,18,19,19,20,18,19,18,21,21,21,20, + 19,21,22,20,20,19,21,20,15,17,16,19,19,17,18,18, + 20,21,16,18,17,20,18,19,19,21,21,21,19,19,19,20, + 18,11,14,13,17,16,14,14,16,16,19,14,16,15,19,16, + 18,18,18,19,22,17,18,17,20,19,13,15,14,17,17,15, + 15,16,17,19,16,17,16,20,18,18,17,19,18,21,19,19, + 18,22, 0,13,14,15,17,18,16,16,17,17,19,14,16,15, + 19,18,18,19,19,20,21,18,18,17,20,18,17,18,17,20, + 18,16,17,17,18,20,18,19,18,20,20,18,18,21,17,21, + 20,21,21, 0,19,16,16,18,18,19,19,18,20,19,20,16, + 17,17,20,18,21,20,21,22,22,18,20,17,21,17,12,14, + 14,17,16,14,15,16,18,18,13,15,14,18,17,17,18,18, + 19,19,15,17,16,19,19,14,15,15,17,17,15,15,16,18, + 19,15,16,16,19,18,17,17,18,18,20,18,18,18,21,20, + 13,15,14,17,16,15,16,15,18,18,14,16,14,18,17,18, + 18,18,19,21,16,18,16,20,17,17,18,17,18,19,17,17, + 18,18,19,18,19,19,21,19,19,18,20,18,21,21,20,20, + 21,20,16,17,15,20,17,17,19,17,19,19,17,18,15,20, + 17,19,20,19,21,22,17,20,16, 0,17,12,14,14,17,18, + 16,15,18,16,20,16,18,15,21,17,20,18,21,19,22,19, + 21,19, 0,19,14,16,15,19,17,14,15,17,16,21,18,19, + 18,21,17,19,17,21,17,22,20,21,21, 0,21,14,15,16, + 17,19,18,17,19,18,21,14,17,15,20,17,21,22,21,20, + 22,18,21,17,21,17,17,19,17,21,18,16,17,17,19,20, + 19,21,20,21,20,17,18,20,17,21, 0,22,20,21,22,17, + 17,20,18,21,21,20,22,20,21,16,17,17,21,19, 0,22, + 0,21,21,18,22,17,21,17,12,14,14,17,16,14,15,16, + 17,18,14,16,15,18,17,17,17,20,19,20,16,18,17,21, + 18,14,15,15,17,17,14,15,16,17,19,16,17,16,18,18, + 17,16,19,18,19,18,19,18,21,20,14,15,15,18,17,16, + 16,16,19,18,15,16,14,20,16,18,18,19,19,20,16,19, + 16,21,17,17,17,18,19,19,16,16,18,18,19,19,19,18, + 20,20,18,16,19,18,20,22,21,20,19,20,16,18,17,20, + 16,18,19,18,19,18,16,18,16,20,17,21,20,21,20,20, + 18,19,17,21,16, +}; + +static const static_codebook _44p5_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p5_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p5_p5_0, + 0 +}; + +static const long _vq_quantlist__44p5_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p5_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p5_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p5_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p5_p5_1, + 0 +}; + +static const long _vq_quantlist__44p5_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p6_0[] = { + 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, + 9,10, 5, 8, 7, 9,10, 9, 7,10, 7, 6, 9, 9, 9,10, + 12,10,12,11, 9,10,11,11,10,13,12,12,13,10,11,11, + 12,13,13,11,13,11, 6, 9, 9,10,11,12, 9,12,11,10, + 11,11,11,11,13,12,13,13, 9,11,10,12,13,13,11,13, + 10, 6, 9,10, 9,11,12,10,12,11, 9,10,11,10,10,13, + 11,13,13,10,11,11,12,13,12,11,13,11, 7, 9,10, 9, + 10,12,10,11,11,10,10,11,10,10,12,12,11,12,10,11, + 10,12,12,12,10,12,10, 7,10,10,11,11,13,11,13,11, + 10,12,11,11,10,13,13,14,13,10,11,12,13,13,14,11, + 13,10, 6,10, 9,10,11,12, 9,12,11, 9,11,11,11,11, + 13,12,12,13, 9,11,10,12,13,13,10,13,10, 7,10,10, + 11,11,14,11,13,11,10,12,11,11,10,14,13,14,13,10, + 11,12,13,13,14,11,13,10, 7,10, 9,10,10,12, 9,12, + 10,10,11,11,10,10,12,12,12,12, 9,11,10,11,12,12, + 10,12, 9, +}; + +static const static_codebook _44p5_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p5_p6_0, + 0 +}; + +static const long _vq_quantlist__44p5_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p6_1[] = { + 2, 6, 6, 5, 7, 8, 5, 8, 7, 6, 7, 7, 7, 7, 8, 8, + 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 6, 8, 8, 8, 9, + 10, 8, 9, 9, 8, 9, 9, 9, 9,10,10,10,10, 8, 9, 9, + 10,10,10, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 9, + 9, 9, 9, 9,10,10,10,10, 8, 9, 9,10,10,10, 9,10, + 9, 6, 8, 9, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9,10, + 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 8, 9, 8, + 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9,10,10, 9,10,10, + 9,10, 9, 9, 9,10,10,10,10, 9,10, 9,10,10,10, 9, + 10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, + 10, 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, + 9,10,10, 9,10, 9, 9, 9,10,10, 9,10,10,10,10, 9, + 9, 9,10,10,10, 9,10, 9, 7, 9, 8, 8, 9, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p5_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p5_p6_1, + 0 +}; + +static const long _vq_quantlist__44p5_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p5_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p7_0, + 1, -513979392, 1633504256, 2, 0, + (long *)_vq_quantlist__44p5_p7_0, + 0 +}; + +static const long _vq_quantlist__44p5_p7_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p5_p7_1[] = { + 1, 7, 7, 6, 9, 9, 7, 9, 9, 6, 9, 9, 9, 9, 9, 9, + 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10, +}; + +static const static_codebook _44p5_p7_1 = { + 5, 243, + (long *)_vq_lengthlist__44p5_p7_1, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p5_p7_1, + 0 +}; + +static const long _vq_quantlist__44p5_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p5_p7_2[] = { + 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11,12,12,13,13,14,14,14,14, +}; + +static const static_codebook _44p5_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p5_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p5_p7_2, + 0 +}; + +static const long _vq_quantlist__44p5_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p5_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p5_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p5_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p5_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p5_short[] = { + 4, 7,12,14,15,18,20,20, 5, 3, 4, 6, 9,11,15,19, + 9, 4, 3, 4, 7, 9,13,18,11, 6, 3, 3, 5, 8,13,19, + 14, 9, 6, 5, 7,10,16,20,16,11, 9, 8,10,10,14,16, + 21,14,13,11, 8, 7,11,14,21,14,13, 9, 6, 5,10,12, +}; + +static const static_codebook _huff_book__44p5_short = { + 2, 64, + (long *)_huff_lengthlist__44p5_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p6_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p6_l0_0[] = { + 1, 4, 4, 7, 7,10,10,12,12,12,12,13,12, 5, 5, 5, + 8, 6,11, 9,12,12,13,12,12,12, 4, 5, 5, 6, 8, 9, + 11,12,12,13,12,12,12, 7, 7, 8, 9, 9,11, 8,12, 9, + 12,12,12,12, 7, 8, 8, 9, 9, 8,11, 9,12,12,12,11, + 12,10,10,10,11,11,11,11,11,10,11,11,12,11,10,10, + 10,11,11,11,11,10,11,11,11,11,12,11,11,11,12,11, + 12,11,12,11,13,11,13,11,11,11,11,11,12,11,12,10, + 13,11,12,11,13,12,12,12,13,12,13,13,13,12,14,12, + 14,13,12,12,12,12,13,13,13,12,14,12,14,13,14,13, + 14,14,14,14,14,14,14,14,15,14,15,14,13,14,13,14, + 14,14,14,14,15,14,14,14,15, +}; + +static const static_codebook _44p6_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p6_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p6_l0_0, + 0 +}; + +static const long _vq_quantlist__44p6_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p6_l0_1[] = { + 4, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, + 5, 5, 4, 5, 5, 5, 5, 5, 4, +}; + +static const static_codebook _44p6_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p6_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p6_l0_1, + 0 +}; + +static const long _vq_quantlist__44p6_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_l1_0[] = { + 1, 3, 2, 5, 5, 6, 6, 6, 6, +}; + +static const static_codebook _44p6_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44p6_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p6_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p6_lfe[] = { + 2, 3, 1, 3, +}; + +static const static_codebook _huff_book__44p6_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p6_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p6_long[] = { + 2, 7,13,15,16,17,19,20, 6, 3, 4, 7, 9,10,12,15, + 13, 4, 3, 4, 7, 8,11,13,14, 7, 4, 4, 6, 7,10,11, + 16, 9, 7, 6, 7, 8, 9,10,16, 9, 8, 7, 7, 6, 8, 8, + 18,12,10,10, 9, 8, 8, 9,20,14,13,12,11, 8, 9, 9, +}; + +static const static_codebook _huff_book__44p6_long = { + 2, 64, + (long *)_huff_lengthlist__44p6_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p6_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p1_0[] = { + 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, + 10, 8, 9, 9, 8, 9,10, 9,10,12,10,11,11, 8, 9,10, + 10,11,11, 9,11,11, 5, 8, 7, 8, 9, 9, 8,10, 9, 8, + 10, 9, 9,11,11,10,11,11, 8,10, 9,10,11,11, 9,12, + 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9, 9, 9,10,11, + 9,11,11, 8,10,10,10,11,11,10,12,11, 7, 9, 9, 9, + 10,11, 9,11,11, 9, 9,11,10,10,13,11,11,12, 9,11, + 11,11,12,13,11,13,12, 7, 9, 9, 9,11,11, 9,12,10, + 9,11,10,10,11,12,11,13,12, 9,11,11,11,13,13,11, + 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8,10,10,10,11, + 11,10,11,11, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, + 9,10,12, 9,11,11, 9,11,11,11,11,13,11,13,13, 9, + 10,11,11,12,13,10,12,11, 7, 9, 9, 9,11,11, 9,11, + 10, 9,11,11,11,12,13,11,13,12, 9,11, 9,11,12,11, + 10,13,10, +}; + +static const static_codebook _44p6_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p6_p1_0, + 0 +}; + +static const long _vq_quantlist__44p6_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p6_p2_0[] = { + 4, 6, 6, 9, 9, 6, 7, 8,10,10, 6, 8, 7,10,10, 8, + 10,10,12,13, 8,10,10,13,12, 6, 8, 8,10,10, 7, 8, + 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, + 14,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 9, 8,11, + 10,10,11,11,13,14,10,11,10,13,12, 9,10,10,12,12, + 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, + 14,13,15,14, 9,10,10,13,12,10,11,11,13,13,10,11, + 10,13,12,13,13,14,14,15,12,13,12,15,12, 6, 8, 8, + 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,12,13, + 14,10,11,11,14,13, 8, 9, 9,11,12, 9,10,11,12,13, + 9,10,11,12,13,11,11,13,13,15,11,12,12,14,14, 8, + 9, 9,12,12, 9,10,11,12,13, 9,10,10,13,12,11,12, + 13,14,15,11,12,12,14,14,11,11,12,13,14,11,12,13, + 13,15,12,13,13,14,15,13,13,14,14,16,14,15,15,16, + 16,11,12,11,14,13,12,13,13,14,14,11,13,12,14,13, + 14,15,15,16,16,13,14,14,16,14, 6, 8, 8,11,10, 8, + 9, 9,12,11, 8,10, 9,12,11,10,11,11,13,13,10,12, + 11,14,13, 8, 9, 9,12,12, 9,10,10,12,13, 9,11,10, + 13,12,11,12,12,14,14,11,13,12,15,14, 8, 9, 9,12, + 11, 9,10,10,13,12, 9,11,10,13,12,12,12,12,14,14, + 11,13,12,15,13,11,11,12,13,14,11,12,13,13,14,12, + 13,13,14,15,13,13,14,14,16,14,15,15,16,16,11,12, + 11,14,13,12,13,13,15,14,11,13,12,15,13,14,15,15, + 16,16,13,15,13,16,14, 9,10,11,12,13,11,11,12,13, + 14,11,12,12,13,14,13,13,14,14,16,13,14,14,15,16, + 11,11,12,13,14,12,12,13,14,15,12,13,13,14,15,14, + 14,15,15,17,14,15,15,16,17,11,12,12,14,14,12,13, + 13,14,15,12,13,12,15,15,14,15,15,16,17,14,15,15, + 16,16,13,14,14,15,16,14,14,15,15,17,15,15,15,16, + 17,16,16,17,16,18,16,17,17,18,18,13,14,14,16,15, + 14,15,15,17,16,14,15,15,16,16,16,17,17,18,18,16, + 16,16,17,16, 9,11,10,13,12,11,12,12,14,13,11,12, + 11,15,13,13,14,14,16,15,13,14,13,17,14,11,12,12, + 14,14,12,12,13,15,15,12,13,13,15,14,14,14,15,16, + 16,14,15,15,17,16,11,12,11,14,13,12,13,13,15,14, + 12,13,12,15,13,14,15,15,16,16,14,15,14,17,15,13, + 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, + 16,17,17,16,17,17,18,18,13,15,14,16,15,15,15,15, + 17,16,14,15,14,17,15,16,17,17,18,18,16,17,16,18, + 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, + 10,11,11,13,14,10,12,11,14,13, 7, 9, 9,11,12, 9, + 10,10,12,13, 9,10,10,13,12,11,11,12,13,15,11,12, + 12,15,14, 8, 9, 9,12,11, 9,10,10,13,13, 9,11,10, + 13,12,12,12,12,14,15,11,13,12,15,13,10,11,11,13, + 14,11,12,12,13,15,11,12,12,14,14,13,13,14,14,16, + 14,15,14,16,16,11,12,11,14,13,12,13,13,15,14,11, + 13,12,15,13,14,15,15,16,16,13,14,14,16,14, 8, 9, + 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12,13, + 14,15,11,12,12,15,14, 9, 9,11,11,13,10,10,12,12, + 14,10,10,11,13,14,12,12,13,14,16,12,13,13,15,15, + 9,11,10,13,12,10,11,11,13,14,10,12,11,14,13,12, + 13,13,15,16,12,13,13,15,15,11,11,13,13,15,12,12, + 14,13,15,13,13,14,14,15,14,14,15,14,17,15,15,15, + 16,16,12,13,12,15,14,13,14,14,15,15,12,14,13,15, + 14,15,15,15,17,17,14,15,14,17,15, 7, 9, 9,12,11, + 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, + 13,12,15,14, 9,10,10,12,12,10,10,11,12,13,10,11, + 11,14,13,12,12,13,14,15,12,13,13,16,15, 9,10,10, + 13,12,10,11,11,13,13,10,11,10,14,12,13,13,13,15, + 15,12,13,12,15,14,11,12,12,14,14,12,12,13,14,15, + 13,14,13,15,15,14,13,15,14,16,15,16,15,17,16,12, + 12,12,14,14,13,13,14,15,15,12,13,12,15,14,15,15, + 16,16,17,14,15,14,17,14,10,11,12,13,14,11,12,13, + 14,15,11,12,13,14,15,13,14,15,15,17,14,15,15,16, + 16,11,12,13,12,15,12,12,14,13,16,13,13,14,13,16, + 14,14,16,14,18,15,15,16,16,17,12,13,12,15,15,13, + 14,14,15,16,13,14,13,16,15,15,15,16,17,18,15,15, + 15,17,16,14,14,15,14,17,15,14,16,14,17,15,15,16, + 15,18,16,16,17,16,19,17,17,17,17,18,14,15,15,17, + 16,15,16,16,17,17,15,16,15,18,16,17,17,18,18,18, + 16,17,16,18,17,10,11,11,14,13,11,12,12,15,14,11, + 13,12,15,14,14,15,15,16,16,14,15,15,17,16,11,12, + 12,15,14,12,13,13,15,14,13,14,13,16,14,14,15,15, + 16,16,15,16,15,18,16,11,13,12,15,15,13,14,14,15, + 15,12,14,13,16,15,15,16,16,17,17,15,16,15,17,16, + 14,15,14,16,16,14,15,15,16,16,15,16,15,17,16,16, + 16,17,16,17,17,18,17,19,18,14,15,15,17,16,15,16, + 16,17,17,15,15,15,18,16,17,18,18,18,18,16,17,16, + 19,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, + 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, + 9,10,11,12,13, 9,10,10,13,13,11,12,13,13,15,11, + 12,12,15,14, 7, 9, 9,12,11, 9,10,10,12,13, 9,10, + 10,13,12,11,12,12,14,15,11,12,11,14,13,11,11,12, + 13,14,11,12,13,13,15,12,13,13,14,15,13,14,14,14, + 16,14,15,15,16,16,10,11,11,14,13,11,12,12,14,14, + 11,12,12,15,13,14,14,14,16,16,13,14,13,16,14, 7, + 9, 9,11,12, 9,10,10,12,13, 9,10,10,12,12,11,12, + 13,14,15,11,12,12,14,14, 9,10,10,12,13,10,10,11, + 12,14,10,11,11,13,13,12,12,13,14,15,13,13,13,15, + 15, 9,10,10,12,12,10,11,11,13,14,10,11,10,13,12, + 12,13,13,15,16,12,13,12,15,14,11,12,13,14,14,12, + 12,13,14,15,13,14,13,15,15,14,14,15,14,17,15,16, + 15,17,16,11,12,12,14,14,13,13,13,15,15,12,13,12, + 15,14,15,15,15,16,17,14,15,14,16,14, 8, 9, 9,12, + 11, 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,15, + 11,12,12,15,14, 9,10,11,13,13,10,11,12,13,14,10, + 11,11,14,13,12,13,13,15,15,12,13,13,16,15, 9,11, + 9,13,11,10,11,10,14,13,10,12,10,14,12,12,13,13, + 15,15,12,13,12,16,14,12,12,13,14,15,12,13,14,14, + 16,13,14,14,15,15,14,14,15,15,17,15,16,15,17,16, + 11,13,11,15,13,13,14,13,15,14,12,14,12,16,13,15, + 15,15,16,16,14,15,14,17,14,10,11,11,13,14,11,12, + 13,14,15,11,12,12,14,15,14,14,15,16,17,14,15,15, + 16,16,11,12,13,14,15,12,13,14,15,16,13,14,14,15, + 16,15,15,16,16,18,15,16,16,17,17,11,12,12,14,15, + 13,13,14,14,16,12,13,13,15,15,15,15,16,16,18,14, + 15,15,16,16,14,15,15,16,17,15,15,16,16,17,15,16, + 16,17,17,16,16,17,16,19,17,18,17,18,18,14,14,15, + 16,16,15,15,16,16,17,14,15,15,16,16,17,17,18,18, + 19,16,17,16,17,16,10,12,11,14,13,11,13,12,15,14, + 11,13,12,15,14,14,15,15,16,16,13,15,14,17,15,12, + 13,13,15,15,13,13,14,15,16,13,14,14,16,16,14,15, + 15,17,17,15,16,16,17,17,11,13,12,15,12,13,14,13, + 16,13,12,14,12,16,13,15,16,15,17,16,14,16,14,18, + 14,14,15,15,16,17,15,15,16,16,17,15,16,16,17,17, + 16,16,17,17,18,17,18,17,18,18,14,15,14,17,14,15, + 16,15,18,15,15,16,15,18,14,17,17,17,18,17,16,17, + 16,19,16, 9,11,11,13,13,10,12,12,14,14,11,12,12, + 15,14,13,14,14,16,16,13,14,14,16,16,10,11,12,14, + 14,11,12,13,14,15,12,13,13,15,15,13,14,15,16,16, + 14,15,15,17,16,11,12,12,15,14,12,13,13,15,15,12, + 13,12,15,15,14,15,15,16,17,14,15,14,17,16,12,13, + 14,15,16,13,13,14,15,16,13,14,15,16,16,14,15,16, + 16,18,15,16,16,18,18,13,14,14,16,15,14,15,15,17, + 16,14,15,15,17,16,16,17,17,18,18,16,17,16,18,17, + 10,12,12,14,14,11,12,13,15,15,12,13,13,15,15,13, + 14,15,16,17,14,15,15,17,16,11,11,13,14,15,12,12, + 14,15,16,13,13,14,15,16,14,14,15,16,17,15,15,16, + 17,17,12,13,12,15,15,13,14,14,16,16,13,14,13,16, + 15,15,16,15,17,17,15,16,15,18,16,13,12,15,14,17, + 14,13,16,14,17,14,14,16,15,18,15,14,17,16,18,16, + 16,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, + 15,18,16,17,17,17,18,18,16,17,16,19,17,10,11,11, + 14,14,11,12,12,15,15,11,13,12,15,15,14,15,14,16, + 16,14,15,15,17,16,11,12,12,15,14,12,12,13,15,15, + 13,14,13,16,15,14,15,15,16,16,15,16,15,18,17,11, + 13,12,15,15,13,14,13,15,15,12,14,13,16,15,15,16, + 15,17,17,15,16,15,18,16,13,14,13,16,16,14,15,14, + 16,16,14,15,15,17,16,16,16,16,16,18,16,18,17,19, + 18,14,15,15,17,16,15,16,16,17,17,15,15,15,17,16, + 17,17,18,18,19,16,17,16,18,16,12,13,13,15,16,13, + 14,14,16,17,13,14,14,16,16,15,15,16,17,18,15,16, + 16,18,17,13,13,14,14,17,14,14,15,15,17,14,14,15, + 16,17,15,15,17,16,18,16,17,17,18,18,13,14,14,17, + 16,14,15,15,17,17,14,15,14,17,16,16,17,17,18,18, + 16,17,16,18,17,15,14,16,13,18,16,15,17,14,19,16, + 16,17,15,18,17,16,18,15,19,18,18,18,17,19,15,16, + 16,18,17,16,17,17,18,18,16,17,16,19,17,18,19,18, + 19,19,17,18,17,20,18,11,12,12,15,15,13,13,14,15, + 16,13,14,13,16,15,15,16,16,17,17,15,16,16,18,17, + 12,14,13,16,15,13,13,14,15,16,14,15,14,17,16,16, + 16,16,16,17,16,17,17,19,17,12,13,14,16,16,14,15, + 15,16,17,13,15,13,17,15,16,17,17,18,18,16,17,16, + 18,16,15,16,15,17,16,15,15,15,17,17,16,17,16,18, + 17,17,16,17,16,18,18,19,18,20,18,15,16,16,17,17, + 16,17,17,18,18,15,16,15,18,17,18,18,19,19,19,17, + 18,16,19,16, 9,11,11,13,13,11,12,12,14,15,10,12, + 12,14,14,13,14,14,16,16,13,14,14,16,16,11,12,12, + 14,14,12,12,13,15,15,12,13,13,15,15,14,15,15,16, + 17,14,15,15,16,16,10,12,11,14,14,12,13,13,15,15, + 11,13,12,15,14,14,15,15,16,17,13,15,14,17,16,13, + 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, + 17,17,18,16,17,17,18,18,12,14,13,16,15,13,15,14, + 17,16,13,14,13,17,15,15,16,16,18,18,15,16,15,18, + 16,10,11,11,14,14,11,12,13,14,15,11,12,12,15,15, + 14,15,15,16,17,14,15,15,16,16,11,12,13,15,15,12, + 13,14,15,16,13,14,14,15,16,15,15,16,16,18,15,15, + 16,17,17,11,12,12,14,15,13,13,14,15,16,12,13,13, + 15,15,15,15,16,17,18,14,15,15,17,16,14,15,15,16, + 17,15,15,16,16,17,15,16,16,17,17,16,16,17,16,19, + 17,17,18,19,18,13,13,14,16,16,14,15,16,17,17,14, + 14,15,16,16,16,16,17,18,18,16,16,16,18,16,10,12, + 12,14,14,12,13,13,15,15,11,13,12,15,15,14,15,15, + 16,17,13,15,14,17,16,12,13,13,15,15,13,13,14,15, + 16,13,14,14,16,16,15,15,16,17,18,15,15,16,17,17, + 11,13,12,15,14,13,14,13,16,15,12,14,12,16,14,15, + 16,15,17,17,14,16,14,17,16,14,15,15,16,17,15,15, + 16,16,18,15,16,16,17,17,16,17,17,17,19,17,17,17, + 18,18,13,15,12,17,14,14,16,14,17,15,14,15,13,17, + 14,16,17,16,18,17,15,17,14,19,15,11,12,12,15,15, + 13,13,14,15,16,13,14,13,16,15,15,16,16,17,18,15, + 16,16,17,17,12,14,13,16,16,13,13,15,15,17,14,15, + 15,17,16,16,16,17,16,19,16,17,17,18,18,12,13,14, + 15,16,14,14,15,16,17,13,14,13,16,15,16,17,17,18, + 19,15,16,16,17,16,15,16,16,18,17,15,15,16,17,18, + 16,17,17,18,18,16,16,18,16,19,18,19,19,20,19,15, + 15,16,16,17,16,16,17,17,18,15,15,15,17,16,18,18, + 19,18,20,17,17,16,18,16,12,13,13,16,15,13,14,14, + 16,16,13,14,14,16,16,15,16,16,17,18,15,16,15,18, + 17,13,14,14,16,16,14,15,15,16,17,14,15,15,17,17, + 16,17,17,18,18,16,17,17,18,18,13,14,13,17,14,14, + 15,14,17,16,14,15,14,17,15,16,17,17,18,18,15,17, + 15,19,15,16,16,16,17,18,16,16,17,17,19,16,17,17, + 18,19,17,17,18,18,20,18,18,18,19,19,15,16,14,18, + 13,16,17,16,19,15,16,17,15,19,14,18,18,18,19,17, + 17,18,16,20,15, +}; + +static const static_codebook _44p6_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p6_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p6_p2_0, + 0 +}; + +static const long _vq_quantlist__44p6_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p3_0[] = { + 1, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 8, 8, 8,10, 8, + 10,10, 5, 8, 7, 8,10,10, 8,10, 8, 6, 8, 9, 8,10, + 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, + 11,13,13,11,13,12, 6, 9, 8, 9,11,11, 8,12,10, 9, + 11,11,11,12,13,11,13,13, 9,11,10,11,13,13,11,13, + 11, 5, 9, 9, 8,11,11, 9,12,11, 8,10,11,10,11,13, + 11,13,13, 9,11,11,11,13,13,11,13,12, 8,10,11,10, + 12,13,10,13,12,10,10,13,11,11,14,12,13,14,11,13, + 12,13,14,14,12,14,12, 8,11,10,11,12,13,11,14,12, + 10,13,12,12,12,13,13,15,14,11,12,13,13,14,15,12, + 14,12, 5, 9, 9, 9,11,12, 8,11,11, 9,11,11,11,12, + 13,11,13,13, 8,11,10,11,13,13,10,13,11, 8,10,11, + 11,12,14,11,13,12,11,13,12,12,12,14,13,15,14,10, + 12,13,13,14,15,12,13,12, 8,11,10,10,12,13,10,13, + 12,11,12,13,12,12,14,13,14,14,10,13,10,12,14,13, + 11,14,11, +}; + +static const static_codebook _44p6_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p6_p3_0, + 0 +}; + +static const long _vq_quantlist__44p6_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p3_1[] = { + 5, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 8, 8, 7, + 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 8, 7, 7, 8, 7, 8, + 8, 7, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, + 8, 9, 9, 8, 9, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 8, + 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, + 8, 6, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 9, + 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, + 8, 9, 8, 9, 9, 8, 8, 9, 8, 9, 9, 9, 9, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, 9, + 9, 9, 6, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, + 8, 8, 9, 8, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, + 8, 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, + 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p6_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p6_p3_1, + 0 +}; + +static const long _vq_quantlist__44p6_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p4_0[] = { + 2, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 7, 7, 7, 9, 7, + 9, 9, 5, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, + 10, 8, 9, 9, 8, 9,10, 9, 9,11,10,11,11, 8, 9, 9, + 10,11,11, 9,11,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, + 9, 9, 9,10,11,10,11,10, 8,10, 9,10,11,11, 9,11, + 9, 6, 8, 8, 7, 9, 9, 8,10, 9, 7, 9, 9, 9, 9,10, + 9,10,10, 8, 9, 9, 9,10,10, 9,11,10, 7, 9, 9, 8, + 10,10, 9,10,10, 9, 9,10,10,10,11,10,11,11, 9,10, + 10,10,11,11,10,11,10, 7, 9, 9, 9, 9,10, 9,10, 9, + 8,10, 9, 9, 9,11,10,11,11, 9,10,10,10,11,11, 9, + 11, 9, 6, 8, 8, 8, 9,10, 7, 9, 9, 8, 9, 9, 9,10, + 10, 9,10,10, 7, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, + 9, 9,10, 9,10, 9, 9,10,10, 9, 9,11,10,11,11, 8, + 9,10,10,11,11, 9,11, 9, 7, 9, 9, 9,10,10, 8,10, + 10, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, + 10,11,10, +}; + +static const static_codebook _44p6_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p6_p4_0, + 0 +}; + +static const long _vq_quantlist__44p6_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p6_p4_1[] = { + 6, 8, 8,10,10, 8, 9, 9,10,11, 8,10, 9,11,10, 9, + 10,10,11,11, 9,10,10,11,11, 8, 9, 9,10,10, 9, 9, + 10,11,11,10,10,10,11,11,10,11,11,11,11,10,11,11, + 11,11, 8, 9, 9,11,10,10,10,10,11,11, 9,10, 9,11, + 11,10,11,11,11,11,10,11,10,11,11,10,10,11,11,11, + 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,10,11,10,11,11,11,11,11,11,11,10,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11, 8, 9,10, + 11,11,10,10,11,11,11,10,10,10,11,11,10,11,11,12, + 12,10,11,11,12,12,10,10,11,11,11,10,10,11,11,12, + 11,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, + 10,10,11,11,11,11,11,12,12,10,11,11,12,12,11,12, + 12,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,11,11,12,11,11,12,12,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12, 8,10, 9,11,11,10, + 10,10,11,11,10,11,10,11,11,10,11,11,12,12,10,11, + 11,12,12,10,10,10,11,11,10,11,11,12,12,11,11,11, + 12,12,11,11,12,12,12,11,12,12,12,12,10,11,10,11, + 11,11,11,11,12,12,10,11,10,12,11,11,12,11,12,12, + 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, + 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,10,11,11,11,12,11,11,12,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 11,11,12,12,12,11,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,13,11,12,11,12,12,12,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,13,12,13,12,12,12,12,13,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,12, + 12,12,13,12,10,11,11,12,11,11,11,12,12,12,11,12, + 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,12,11,12,12,12,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,12,12,12,12,13,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,13,12,13,12,13, + 12, 8,10,10,11,11,10,10,11,11,11,10,11,10,11,11, + 10,11,11,12,12,10,11,11,12,12, 9,10,11,11,11,10, + 10,11,12,12,10,11,11,12,12,11,11,12,12,12,11,12, + 12,12,12,10,11,10,11,11,11,11,11,12,12,10,11,11, + 12,12,11,12,12,12,12,11,12,11,12,12,11,11,11,12, + 12,11,11,12,12,12,11,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, + 10,11,11,10,11,11,12,12,10,11,11,12,12,11,11,12, + 12,12,11,12,12,12,12,10,11,11,12,12,11,11,12,12, + 12,11,11,12,12,12,11,11,12,12,12,12,12,12,12,12, + 10,11,11,12,12,11,12,12,12,12,11,12,11,12,12,12, + 12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11, + 10,11,11,12,12,10,11,11,12,11,11,12,12,12,12,11, + 12,12,12,12,10,11,11,12,12,11,11,11,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,10,11,11, + 12,12,11,12,12,12,12,11,12,11,12,12,12,12,12,12, + 12,12,12,12,12,12,11,12,12,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,11,11,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 13,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,12,13,12,12,13,13,13,11,12,12,12,12,12, + 12,12,13,13,12,12,12,13,12,12,12,12,13,13,12,13, + 12,13,13,12,12,12,12,12,12,12,12,12,13,12,13,13, + 13,13,12,13,13,13,13,13,13,13,13,13,12,12,12,12, + 12,12,12,13,13,13,12,13,12,13,13,12,13,13,13,13, + 12,13,13,13,13,11,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 12,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, + 13,12,12,12,13,12,12,13,12,13,13,12,13,12,13,13, + 12,12,12,12,12,12,12,13,13,13,12,12,13,13,13,12, + 13,13,12,13,13,13,13,13,13,12,12,12,12,12,12,13, + 12,13,13,12,13,12,13,12,12,13,13,13,13,12,13,13, + 13,13, 8,10,10,11,11,10,10,11,11,11, 9,11,10,11, + 11,10,11,11,12,12,10,11,11,12,12,10,10,11,11,11, + 10,11,11,12,12,11,11,11,12,12,11,11,12,12,12,11, + 12,12,12,12, 9,11,10,11,11,10,11,11,12,12,10,11, + 10,12,12,11,12,12,12,12,11,12,11,12,12,11,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 9, + 10,10,11,11,10,11,11,12,12,10,11,11,12,12,11,12, + 12,12,12,11,12,12,12,12,10,11,11,12,12,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,10,11,11,12,12,11,11,12,12,12,11,11,11,12,12, + 12,12,12,12,12,11,12,12,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11, + 11,10,11,11,12,12,10,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,10,11, + 11,12,12,11,12,11,12,12,11,12,11,12,12,12,12,12, + 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,12,12,12,13,13,12,12,13,13,13,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,12,13,13,12, + 12,12,13,12,12,12,12,12,12,12,12,13,13,13,12,12, + 13,13,13,12,13,13,12,13,12,13,13,13,13,12,12,12, + 12,12,12,12,13,13,13,12,12,12,13,12,12,13,13,13, + 13,12,13,13,13,13,11,11,11,12,12,11,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, + 13,13,13,12,12,12,13,13,11,12,12,12,12,12,12,12, + 13,12,12,12,12,13,12,12,13,12,13,13,12,13,12,13, + 12,12,12,12,12,12,12,12,13,13,13,12,13,13,13,13, + 12,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12, + 13,12,13,12,12,13,12,13,12,13,13,13,13,13,12,13, + 13,13,13,10,11,11,12,12,11,12,12,12,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,11,11,12,12, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13, + 12,12,12,13,13,11,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,12, + 12,12,12,12,12,12,12,13,12,12,12,12,13,12,12,13, + 12,13,12,13,13,13,13,12,12,12,12,12,12,12,12,13, + 12,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, + 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, + 12,12,12,13,12,12,12,13,12,11,12,12,12,12,12,12, + 12,12,13,12,12,12,12,13,12,12,13,13,13,12,12,13, + 13,13,11,12,12,12,12,12,12,12,12,13,12,12,12,13, + 12,12,13,12,13,13,12,13,12,13,13,12,12,12,12,12, + 12,12,13,12,13,12,12,13,13,13,12,12,13,13,13,13, + 13,13,13,13,12,12,12,12,12,12,13,13,13,13,12,13, + 12,13,12,12,13,13,13,13,12,13,13,13,13,11,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,13,11,12,12,12,12,12,12,12,12,13, + 12,12,12,13,13,12,12,13,13,13,12,12,13,13,13,11, + 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, + 12,13,13,12,13,12,13,13,12,12,12,12,12,12,12,12, + 12,13,12,13,12,13,13,12,13,13,13,13,12,13,13,13, + 13,12,12,12,12,12,12,13,12,13,13,12,12,12,13,13, + 12,13,13,13,13,12,13,12,13,13,11,12,12,12,12,11, + 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,13,12,13,12,12,12,13,13,11,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, + 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, + 12,13,12,13,12,12,13,12,13,12,13,13,13,13,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,12,12,13,13, + 13,13,12,13,12,13,12,11,11,11,12,12,11,12,12,12, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,13,13,11,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, + 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,13,12,12,12,13,12,12,12,12,12,12,12,12, + 12,12,12,13,12,12,12,12,13,12,12,13,12,13,12,12, + 13,12,13,12,10,11,11,12,12,11,12,12,12,12,11,12, + 11,12,12,11,12,12,12,12,11,12,12,12,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 13,12,12,12,13,13,11,12,11,12,12,12,12,12,12,12, + 11,12,12,12,12,12,12,12,13,13,12,12,12,13,12,12, + 12,12,12,12,12,12,12,12,13,12,12,12,12,13,12,13, + 13,12,13,12,13,13,13,13,12,12,12,12,12,12,12,12, + 13,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, + 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,12, + 12,12,12,13,12,12,12,13,13,12,12,13,13,13,12,12, + 13,13,13,11,12,12,12,12,12,12,12,13,13,12,12,12, + 13,12,12,13,12,13,13,12,12,12,13,13,12,12,12,12, + 12,12,12,13,13,13,12,12,13,13,13,12,12,13,13,13, + 12,13,13,13,13,12,12,12,12,12,12,12,13,13,13,12, + 12,12,13,12,12,13,13,13,13,12,13,13,13,13,11,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, + 12,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, + 13,12,12,12,13,13,12,12,13,13,13,12,12,13,13,13, + 11,12,12,12,12,12,12,12,13,12,12,12,12,13,12,12, + 13,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, + 12,13,13,12,13,12,13,13,12,13,13,13,13,13,13,13, + 13,13,12,12,12,12,12,12,13,12,13,13,12,13,12,13, + 12,12,13,13,13,13,12,13,12,13,13,11,11,11,12,12, + 11,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,13,12,12,12,13,13,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 13,12,12,12,13,12,12,12,11,12,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,12,12,12,12,12,12,12,12,13,12,12,12,12,12, + 12,12,12,13,13,12,12,12,13,13,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,12,13,13,12,12, + 12,13,12,12,12,12,12,12,12,12,12,12,13,12,12,12, + 13,13,12,12,13,12,13,12,13,13,13,13,12,12,12,12, + 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,13, + 12,13,12,13,12, +}; + +static const static_codebook _44p6_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p6_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p6_p4_1, + 0 +}; + +static const long _vq_quantlist__44p6_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p6_p5_0[] = { + 2, 6, 6,10,10, 5, 7, 8,11,12, 5, 8, 7,12,11, 9, + 11,11,13,15, 9,11,11,15,13, 6, 7, 8,11,11, 7, 7, + 9,11,13, 8, 9, 9,13,12,11,11,12,12,15,11,12,12, + 15,14, 6, 8, 7,11,11, 8, 9, 9,12,13, 7, 9, 7,13, + 11,11,12,12,14,15,11,12,11,15,12,10,11,11,12,14, + 10,11,12,12,15,12,13,13,14,15,13,12,14,12,16,15, + 15,15,16,16,10,11,11,14,12,12,13,13,15,14,10,12, + 11,15,12,15,15,15,16,17,13,14,12,17,12, 6, 8, 8, + 12,12, 8, 9,10,13,13, 8, 9, 9,13,13,12,12,13,15, + 16,12,13,13,16,15, 8, 9,10,12,13, 9, 9,11,13,14, + 10,11,11,14,14,13,13,14,15,16,13,14,14,16,16, 8, + 10, 9,13,13,10,11,11,14,14, 9,10,10,14,13,13,14, + 14,16,17,13,13,13,16,15,12,13,13,14,16,13,13,14, + 14,16,14,14,14,16,16,15,15,16,15,18,16,17,17,18, + 18,12,13,13,15,15,14,14,14,16,16,13,14,13,16,15, + 16,16,17,18,18,15,16,15,18,15, 6, 8, 8,12,12, 8, + 9, 9,13,13, 8,10, 9,13,13,12,13,13,15,16,12,13, + 12,16,15, 8, 9,10,13,13, 9,10,10,13,14,10,11,11, + 14,14,13,13,13,15,16,13,14,14,17,16, 8,10, 9,13, + 13,10,11,11,14,14, 9,11, 9,14,13,13,14,14,16,16, + 13,14,13,16,14,12,13,13,15,16,13,13,14,15,16,14, + 14,14,16,16,15,15,16,15,18,17,17,17,18,18,12,13, + 13,16,14,14,14,14,16,16,13,14,13,16,14,16,17,17, + 18,18,15,16,15,18,15,11,12,13,14,16,13,13,14,15, + 17,13,14,14,16,17,16,16,17,17,19,16,17,17,18,19, + 13,13,14,16,16,14,14,15,16,17,14,15,15,17,17,17, + 16,17,17,19,17,17,18,19,19,13,14,14,16,16,14,14, + 15,17,18,14,15,14,17,17,17,17,18,18,19,17,17,17, + 18,19,16,16,16,17,18,17,17,17,18,19,17,17,17,18, + 19,18,18,19,18,20,19,20,19,21,20,16,17,17,18,18, + 17,17,18,19,19,17,17,17,19,18,19,19,19,19,20,19, + 19,19,20,19,11,13,12,16,14,13,14,14,17,16,13,14, + 13,17,15,16,17,17,18,18,16,17,16,19,17,13,14,14, + 16,16,14,14,14,17,17,14,15,15,17,16,17,17,17,19, + 19,17,18,17,19,18,13,14,13,17,16,14,15,15,17,17, + 14,15,14,18,16,17,17,17,19,19,17,17,16,19,17,16, + 17,17,18,19,17,17,17,18,18,17,18,17,19,18,18,19, + 18,19,19,19,20,19,20,20,16,17,16,18,17,17,17,17, + 18,18,17,18,17,19,17,19,19,19,19,20,18,19,19,20, + 18, 6, 8, 8,12,12, 8, 9, 9,13,13, 8,10, 9,13,13, + 11,13,13,15,16,12,13,13,16,15, 8, 9, 9,13,13, 9, + 9,10,13,14,10,11,11,14,14,12,12,13,14,16,13,14, + 14,17,16, 8,10, 9,13,13,10,11,11,14,14, 9,11,10, + 14,13,13,14,14,16,16,13,14,13,16,15,12,13,13,14, + 16,12,13,14,14,16,13,14,14,16,16,15,14,16,15,18, + 16,17,17,18,17,12,13,13,16,15,14,14,14,16,16,13, + 14,13,16,15,16,16,17,17,17,15,16,15,18,15, 7, 9, + 9,13,13, 9, 9,11,13,14, 9,10,10,14,13,12,13,14, + 15,16,12,14,13,17,15, 9, 9,10,13,14,10, 9,11,13, + 15,11,11,11,14,14,13,12,14,14,17,14,14,14,17,16, + 9,10,10,14,13,11,11,11,14,14,10,11,10,15,13,14, + 14,14,16,17,13,14,13,17,14,13,13,14,14,16,13,13, + 14,14,17,14,14,14,16,16,15,14,16,15,18,17,17,17, + 18,18,13,14,13,16,15,14,14,15,17,16,13,14,13,17, + 15,17,16,17,17,17,15,16,14,18,14, 7, 9, 9,13,13, + 9,10,10,13,14, 9,11,10,14,13,13,14,14,16,16,13, + 14,14,17,15, 9,10,10,14,13, 9,10,11,13,14,11,12, + 11,15,14,13,13,14,14,16,14,15,15,17,17, 9,10,10, + 14,14,11,12,12,14,15,10,11,10,15,13,14,15,15,17, + 17,14,15,13,17,14,13,14,13,16,16,13,13,14,15,16, + 14,15,15,17,17,15,14,16,15,18,17,18,17,20,18,13, + 14,14,16,16,15,15,15,17,17,13,14,13,17,15,17,17, + 18,18,18,15,16,14,19,14,12,13,13,15,16,13,13,15, + 16,17,13,14,14,16,16,15,15,17,17,19,16,17,17,19, + 18,13,13,14,15,17,14,13,15,15,17,14,15,15,16,17, + 16,15,18,16,19,17,17,17,18,19,13,14,14,17,16,14, + 15,15,17,17,14,15,14,17,16,17,17,17,18,19,16,17, + 16,19,17,16,16,17,16,18,16,16,17,16,19,17,17,18, + 18,19,18,17,18,17,21,19,19,19,20,19,16,17,17,18, + 18,17,17,18,18,19,16,17,16,18,18,19,19,19,19,20, + 18,18,17,20,18,11,13,13,16,15,13,14,14,16,17,13, + 15,14,17,16,16,17,17,18,18,17,17,17,19,18,13,14, + 13,17,16,14,13,14,16,17,15,16,15,18,16,17,16,17, + 17,19,18,18,18,20,18,13,14,14,16,17,15,15,15,17, + 18,14,15,14,18,16,18,18,18,19,20,17,18,16,20,17, + 16,17,16,18,18,16,16,17,18,18,17,18,18,19,18,18, + 17,19,17,20,19,20,19,22,20,16,16,17,18,18,18,17, + 17,19,19,16,17,16,18,17,19,20,19,22,21,18,19,18, + 21,17, 6, 8, 8,12,12, 8, 9,10,13,13, 8, 9, 9,13, + 13,12,13,13,15,16,11,13,13,16,15, 8, 9,10,13,13, + 9,10,11,13,14,10,11,11,14,14,13,13,14,15,16,13, + 14,14,16,16, 8, 9, 9,13,13,10,11,11,14,14, 9,10, + 9,14,13,13,14,14,16,17,12,14,12,16,14,12,13,13, + 15,16,13,13,14,15,16,13,14,14,15,17,15,15,16,15, + 18,16,16,17,17,17,12,13,13,16,14,13,14,14,16,16, + 12,14,13,16,14,16,17,17,18,18,15,15,14,18,14, 7, + 9, 9,13,13, 9,10,11,13,14, 9,10,10,14,13,13,14, + 14,15,17,13,14,14,16,15, 9,10,10,14,14,10,10,11, + 13,15,11,12,12,15,14,14,13,15,14,17,14,15,15,17, + 17, 9,10,10,13,14,11,11,12,14,15, 9,11,10,14,13, + 14,15,15,16,18,13,14,13,16,14,13,14,14,16,16,13, + 13,14,15,17,15,15,15,16,17,15,14,16,15,18,17,17, + 18,19,18,13,14,14,16,16,14,15,15,17,17,13,14,13, + 16,15,17,17,18,18,18,15,16,14,18,15, 7, 9, 9,13, + 13, 9,10,10,13,14, 9,11,10,14,13,12,13,14,15,16, + 12,14,13,16,15, 9,10,10,13,14,10,10,11,13,14,11, + 11,11,15,14,13,13,14,14,16,14,14,14,17,16, 9,10, + 9,14,13,11,11,11,14,14,10,11, 9,15,13,14,14,14, + 16,16,13,14,12,17,14,13,13,14,15,16,13,13,14,15, + 16,14,15,14,16,17,15,14,16,14,18,16,17,17,18,18, + 13,14,13,16,14,14,14,14,16,16,13,14,13,17,14,17, + 17,17,18,18,15,16,14,18,15,11,13,13,16,16,13,14, + 15,16,17,13,14,14,17,16,16,17,17,18,19,17,17,17, + 19,18,13,14,14,17,17,13,13,15,16,18,15,15,15,17, + 17,17,16,18,17,20,18,17,18,19,19,13,14,14,16,17, + 15,15,16,16,18,14,15,14,16,16,17,17,18,18,20,17, + 18,16,18,17,16,17,16,19,18,16,16,17,18,19,18,18, + 18,19,19,18,17,18,17,21,20,19,19,21,21,16,16,17, + 18,18,17,17,18,19,19,16,17,16,19,18,20,20,20,19, + 21,18,18,17,20,18,12,13,13,16,15,13,14,14,16,16, + 13,14,13,17,16,16,17,17,18,18,15,17,15,19,17,13, + 14,14,16,17,14,14,15,16,17,14,15,15,17,17,16,16, + 17,17,18,17,17,17,19,19,13,14,13,17,15,14,15,15, + 17,16,14,15,13,17,15,17,18,17,19,18,16,17,15,20, + 16,16,17,17,18,18,16,16,17,18,18,17,18,17,19,18, + 17,17,18,18,20,19,20,19,20,19,16,16,16,19,16,17, + 17,17,19,18,16,17,16,19,16,19,19,19,19,19,18,19, + 17,19,17,11,13,13,16,16,13,14,14,17,17,13,14,14, + 17,17,15,17,17,19,19,16,18,17,20,19,12,14,14,17, + 17,13,14,15,17,18,14,15,15,17,18,16,16,17,18,20, + 17,18,18,20,18,13,14,14,17,17,14,15,15,17,18,14, + 15,15,17,17,17,18,17,19,19,17,18,17,19,19,15,16, + 16,18,18,15,16,17,18,19,16,17,17,19,19,17,17,18, + 18,21,18,19,19,21,19,16,17,17,18,18,17,17,18,19, + 19,17,18,17,19,19,19,19,19,20,20,18,19,18,21,19, + 12,13,13,16,16,13,14,14,16,17,13,15,14,17,16,15, + 16,17,17,19,16,17,17,19,18,13,13,14,16,17,14,13, + 15,16,17,14,15,15,17,17,15,15,17,17,20,17,17,18, + 19,18,13,14,14,17,16,15,15,15,17,18,14,15,14,17, + 16,17,17,17,18,18,16,17,16,19,17,16,15,17,17,19, + 16,15,17,16,19,17,16,17,18,19,17,16,19,16,20,19, + 18,19,19,19,16,17,17,18,18,17,17,17,18,19,16,17, + 16,19,18,20,19,19,20,19,18,18,17,20,17,11,13,13, + 16,16,13,14,15,16,17,14,15,14,18,16,17,17,17,18, + 21,17,18,17,20,19,13,14,14,17,16,13,14,15,16,18, + 15,16,15,18,17,17,16,17,17,19,17,18,18,20,19,13, + 14,14,16,17,15,15,16,17,18,14,15,14,18,17,17,18, + 18,19,20,17,18,16,19,17,16,17,15,19,18,16,16,16, + 18,18,17,18,17,20,19,18,17,18,17,20,20,20,19,22, + 20,16,17,17,18,19,18,18,18,19,20,16,17,16,19,18, + 20,19,19,20,20,18,19,17,20,17,13,14,14,16,17,14, + 14,16,16,18,14,16,15,17,16,16,16,17,17,18,17,17, + 16,19,18,14,14,15,16,17,14,14,16,16,18,16,16,16, + 17,17,16,15,17,16,19,18,18,18,19,19,14,15,15,17, + 17,15,16,16,17,18,14,16,14,18,16,17,17,18,18,19, + 16,17,16,19,17,16,16,17,16,18,16,16,17,16,19,18, + 18,18,17,18,17,16,18,16,20,19,19,19,19,19,16,17, + 17,18,18,17,17,18,19,19,16,17,16,19,17,18,19,19, + 19,20,17,18,16,20,16,11,14,13,17,17,14,14,16,16, + 18,14,16,14,19,16,18,18,19,18,19,18,19,18,21,18, + 13,15,14,18,16,14,14,16,16,18,16,17,16,19,17,18, + 16,19,17,20,19,19,19,21,19,13,14,15,17,18,17,16, + 17,17,19,14,16,14,18,16,20,19,19,20,21,18,19,16, + 21,17,17,18,16,19,17,16,16,17,18,18,19,19,18,21, + 18,17,17,18,17,20,20,20,20,22,20,17,17,18,18,20, + 19,19,19,18,20,16,17,17,19,19,21,21,21,20,21,17, + 19,17,23,17,11,13,13,16,16,13,14,14,17,17,13,14, + 14,17,17,16,17,17,19,20,15,16,16,19,19,13,14,14, + 16,17,14,15,15,17,18,14,15,15,17,17,17,17,18,19, + 19,17,17,18,19,19,13,14,14,17,16,14,15,15,17,17, + 13,15,14,18,17,17,18,18,19,20,16,17,16,19,18,16, + 16,17,18,18,17,17,17,18,19,17,18,17,19,19,19,19, + 19,19,20,19,20,19,20,20,15,16,16,18,17,16,17,17, + 20,18,15,16,16,19,17,19,19,19,20,20,17,18,17,21, + 17,11,13,13,16,16,13,14,15,16,17,13,15,14,17,16, + 17,17,18,18,20,17,17,17,19,19,13,14,14,17,17,14, + 14,15,17,18,15,15,15,18,17,17,17,18,17,20,18,18, + 17,20,18,13,14,14,16,17,15,15,16,17,18,14,15,13, + 17,17,17,18,18,19,20,17,17,16,19,17,16,17,17,18, + 18,16,16,17,18,18,18,18,18,19,19,18,17,19,18,21, + 19,20,20,20,20,16,15,17,18,18,17,17,18,18,20,16, + 16,16,18,17,20,19,20,21,22,17,18,17,20,17,12,13, + 13,16,16,13,14,15,16,17,13,14,14,17,16,16,17,18, + 18,19,15,16,16,19,18,13,14,14,16,17,14,14,15,16, + 17,14,15,15,17,17,16,16,17,17,19,17,17,17,19,18, + 13,14,13,17,16,14,15,15,17,17,13,15,13,17,16,17, + 17,17,19,19,15,17,15,19,17,16,17,17,18,18,16,16, + 17,17,19,17,18,17,19,19,18,17,19,17,19,19,19,19, + 20,19,15,17,15,19,16,17,17,16,19,18,16,17,15,18, + 16,19,19,19,20,19,17,19,16,19,16,11,14,14,17,17, + 15,14,16,16,18,15,16,14,18,16,18,18,19,18,21,18, + 19,18,20,18,13,15,14,18,17,14,14,16,16,18,16,17, + 16,19,17,17,17,19,17,22,19,19,19,21,19,13,14,15, + 17,18,17,16,17,17,19,14,16,14,18,16,19,19,19,20, + 21,18,18,16,20,17,17,18,16,19,18,15,17,17,19,19, + 19,19,18,21,19,18,17,20,17,21,22,21,20,21,21,17, + 16,19,18,20,19,18,19,18,20,16,17,16,19,18,21,20, + 21,19,23,18,19,16,20,17,13,14,14,17,16,14,14,15, + 16,18,14,16,14,17,16,16,16,17,17,19,16,17,16,19, + 17,14,15,15,17,17,14,14,16,16,17,15,16,16,18,17, + 16,16,17,17,19,17,18,17,19,18,14,15,14,17,16,16, + 16,16,17,17,14,16,14,17,16,18,18,18,18,19,16,17, + 15,19,16,17,17,17,18,18,16,15,17,17,18,18,18,18, + 19,19,17,16,18,16,19,19,19,19,19,19,16,17,16,19, + 16,18,18,17,19,18,16,17,16,19,16,19,19,20,19,19, + 17,18,16,20,16, +}; + +static const static_codebook _44p6_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p6_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p6_p5_0, + 0 +}; + +static const long _vq_quantlist__44p6_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p6_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p6_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p6_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p6_p5_1, + 0 +}; + +static const long _vq_quantlist__44p6_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p6_0[] = { + 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, + 10,10, 5, 8, 7, 9,10,10, 7,10, 7, 6, 9, 9, 9,10, + 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, + 12,13,13,11,13,11, 6, 9, 9, 9,11,11, 9,12,10, 9, + 11,11,11,11,13,12,13,13, 9,11,10,12,13,13,11,13, + 11, 6, 9, 9, 9,11,12, 9,12,11, 9,10,11,10,10,13, + 12,13,13, 9,11,11,12,13,12,11,13,11, 7, 9,10, 9, + 10,12,10,12,11,10,10,12,10,10,12,12,12,13,10,11, + 11,12,12,13,10,12,10, 7,10,10,11,11,14,11,14,11, + 10,12,11,11,11,14,14,14,14,10,11,12,14,14,14,11, + 14,11, 6, 9, 9, 9,11,12, 9,12,11, 9,11,11,11,11, + 13,12,12,13, 9,11,10,12,13,13,10,13,10, 7,10,10, + 11,11,14,11,14,11,10,12,11,11,11,14,14,15,14,10, + 11,12,13,14,15,11,14,11, 7,10, 9,10,11,12, 9,12, + 10,10,11,11,10,10,12,12,13,12, 9,12,10,12,13,12, + 10,12,10, +}; + +static const static_codebook _44p6_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p6_p6_0, + 0 +}; + +static const long _vq_quantlist__44p6_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p6_1[] = { + 2, 6, 6, 6, 7, 8, 6, 8, 7, 6, 7, 7, 7, 7, 8, 7, + 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 6, 8, 8, 8, 9, + 9, 8, 9, 9, 8, 9, 9, 9, 9,10, 9,10,10, 8, 9, 9, + 9,10,10, 9,10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, + 9, 9, 9, 9,10, 9,10,10, 8, 9, 9, 9,10, 9, 9,10, + 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9,10, + 9, 9,10, 8, 9, 9, 9,10, 9, 9,10, 9, 7, 8, 8, 8, + 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, + 9, 9,10, 9, 9, 9, 9, 7, 9, 9, 9, 9,10, 9,10, 9, + 9, 9, 9, 9, 9,10,10,10,10, 9, 9, 9,10,10,10, 9, + 10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, + 10, 9,10,10, 8, 9, 9, 9,10, 9, 9,10, 9, 7, 9, 9, + 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9,10,10,10,10, 9, + 9, 9,10,10,10, 9,10, 9, 7, 8, 8, 8, 9, 9, 8, 9, + 9, 8, 9, 9, 9, 9,10, 9, 9,10, 8, 9, 8, 9, 9, 9, + 9,10, 9, +}; + +static const static_codebook _44p6_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p6_p6_1, + 0 +}; + +static const long _vq_quantlist__44p6_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p6_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p7_0, + 1, -513979392, 1633504256, 2, 0, + (long *)_vq_quantlist__44p6_p7_0, + 0 +}; + +static const long _vq_quantlist__44p6_p7_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p6_p7_1[] = { + 1, 4, 5, 5,10,10, 5,10,10, 5,10,10,10,10,10,10, + 10,10, 5,10,10,10,10,10,10,10,10, 7,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10, 6,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10, 9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11,11, +}; + +static const static_codebook _44p6_p7_1 = { + 5, 243, + (long *)_vq_lengthlist__44p6_p7_1, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p6_p7_1, + 0 +}; + +static const long _vq_quantlist__44p6_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p6_p7_2[] = { + 1, 2, 3, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44p6_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p6_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p6_p7_2, + 0 +}; + +static const long _vq_quantlist__44p6_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p6_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p6_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p6_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p6_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p6_short[] = { + 2, 8,13,15,16,18,21,22, 5, 4, 6, 8,10,12,17,21, + 9, 5, 5, 6, 8,11,15,19,11, 6, 5, 5, 6, 7,12,14, + 14, 8, 7, 5, 4, 4, 9,11,16,11, 9, 7, 4, 3, 7,10, + 22,15,14,12, 8, 7, 9,11,21,16,15,12, 9, 5, 6, 8, +}; + +static const static_codebook _huff_book__44p6_short = { + 2, 64, + (long *)_huff_lengthlist__44p6_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p7_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p7_l0_0[] = { + 2, 4, 4, 7, 7, 8, 8,10,10,11,11,12,12, 4, 5, 5, + 7, 7, 9, 9,11, 9,12,11,12,12, 4, 5, 5, 7, 7, 9, + 9, 9,10,10,11,12,12, 7, 7, 7, 7, 8, 9, 8,11, 5, + 12, 6,12,10, 7, 7, 7, 8, 7, 8, 9, 5,11, 6,12,10, + 12, 8, 9, 9, 9, 9,10,10,11, 7,11, 7,12, 9, 8, 9, + 8, 9, 9,10,10, 7,11, 7,11, 9,11,10,10,10,10,10, + 10,10,11,10,11, 8,11, 9,10,10,10,10,10,10,10,10, + 11, 8,10, 9,11,10,11,11,11,11,11,10,11,10,12,10, + 12,11,10,11,11,11,11,10,11,10,11,10,12,11,12,11, + 12,12,12,12,12,12,12,12,12,12,13,12,11,12,11,12, + 12,12,12,12,11,12,11,12,13, +}; + +static const static_codebook _44p7_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p7_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p7_l0_0, + 0 +}; + +static const long _vq_quantlist__44p7_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p7_l0_1[] = { + 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p7_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p7_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p7_l0_1, + 0 +}; + +static const long _vq_quantlist__44p7_l1_0[] = { + 54, + 29, + 79, + 0, + 108, +}; + +static const long _vq_lengthlist__44p7_l1_0[] = { + 1, 2, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44p7_l1_0 = { + 2, 25, + (long *)_vq_lengthlist__44p7_l1_0, + 1, -514516992, 1620639744, 7, 0, + (long *)_vq_quantlist__44p7_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p7_lfe[] = { + 2, 3, 1, 3, +}; + +static const static_codebook _huff_book__44p7_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p7_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p7_long[] = { + 2, 7,14,16,17,17,18,20, 6, 3, 5, 8,10,11,13,15, + 13, 5, 3, 5, 8, 9,11,12,15, 7, 4, 3, 5, 7, 9,11, + 16,10, 7, 5, 6, 7, 9,10,17,11, 8, 7, 7, 6, 8, 8, + 19,13,11, 9, 9, 8, 8, 9,20,14,13,11,10, 8, 9, 9, +}; + +static const static_codebook _huff_book__44p7_long = { + 2, 64, + (long *)_huff_lengthlist__44p7_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p7_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p1_0[] = { + 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, + 10, 8, 9,10, 8, 9,10,10,10,12,10,11,11, 8,10,10, + 10,11,12,10,11,11, 6, 8, 7, 8,10, 9, 8,10, 9, 8, + 10,10,10,11,11,10,12,11, 8,10, 9,10,11,11,10,12, + 10, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, + 9,11,11, 8,10,10,10,11,12,10,12,11, 7, 9, 9, 9, + 10,11, 9,11,11, 9, 9,11,10,11,12,11,11,12, 9,11, + 11,11,12,12,11,12,12, 7, 9, 9,10,11,11,10,12,11, + 9,11,10,11,11,12,11,13,12,10,11,11,12,13,13,11, + 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, + 12,10,12,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, + 10,11,12,10,11,11,10,11,11,11,11,13,12,13,13, 9, + 10,11,11,12,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, + 10, 9,11,11,11,12,12,11,12,12, 9,11, 9,11,12,11, + 10,12,11, +}; + +static const static_codebook _44p7_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p7_p1_0, + 0 +}; + +static const long _vq_quantlist__44p7_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p7_p2_0[] = { + 4, 6, 6, 9, 9, 6, 8, 8,10,10, 6, 8, 8,10,10, 8, + 10,10,12,13, 8,10,10,13,12, 6, 8, 8,10,10, 8, 8, + 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, + 13,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 8, 9, 8,11, + 10,10,11,11,13,13,10,11,10,13,12, 9,10,10,12,12, + 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, + 13,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, + 10,13,12,12,13,13,14,15,12,13,12,15,12, 6, 8, 8, + 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,12,13, + 14,10,11,11,13,13, 8, 9, 9,11,12, 9,10,11,12,13, + 9,10,10,12,13,11,12,13,13,15,11,12,12,14,14, 8, + 9, 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12, + 13,14,15,11,12,12,14,13,10,11,12,13,14,11,12,13, + 13,15,12,13,13,14,14,13,13,14,14,16,14,15,14,16, + 15,10,12,11,14,13,12,12,13,14,14,11,12,12,14,14, + 14,14,15,15,16,13,14,14,16,14, 6, 8, 8,11,10, 8, + 9, 9,11,11, 8,10, 9,12,11,10,11,11,13,13,10,12, + 11,14,13, 8, 9, 9,12,11, 9,10,10,12,13, 9,11,10, + 13,12,11,12,12,14,14,11,13,12,15,14, 8, 9, 9,12, + 11, 9,10,10,13,12, 9,11,10,13,12,11,12,12,14,14, + 11,13,12,15,13,10,11,12,13,14,11,12,13,13,14,12, + 13,12,14,14,13,13,14,14,16,14,15,14,16,16,10,12, + 11,14,13,12,13,13,14,14,11,13,12,15,13,14,14,15, + 16,16,13,14,13,16,14, 9,10,11,12,13,11,11,12,13, + 14,11,11,12,13,14,13,13,14,14,16,13,14,14,15,15, + 11,11,12,13,14,12,12,13,13,15,12,13,13,14,15,14, + 14,15,15,17,14,14,15,16,16,11,12,12,13,14,12,12, + 13,14,15,12,13,12,14,15,14,14,15,15,17,14,15,14, + 16,16,13,14,14,15,16,14,14,15,15,17,14,15,15,16, + 16,15,16,17,16,18,16,17,16,17,17,13,14,14,16,15, + 14,15,15,16,16,14,15,14,16,15,16,16,17,17,18,16, + 16,16,17,16, 9,11,10,13,12,11,12,11,14,13,11,12, + 11,14,13,13,14,14,16,15,13,14,13,16,14,11,12,12, + 14,13,12,12,13,14,14,12,13,13,15,14,14,14,15,16, + 16,14,15,14,17,15,11,12,11,14,13,12,13,13,15,14, + 12,13,12,15,13,14,15,14,16,16,14,15,14,17,15,13, + 14,14,15,16,14,14,15,16,16,14,15,15,16,16,15,16, + 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, + 17,16,14,15,14,17,15,16,17,17,17,17,16,16,16,18, + 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, + 10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,12, 9, + 10,10,12,13, 9,10,10,13,12,11,11,12,13,15,11,12, + 12,15,14, 8, 9, 9,12,11, 9,10,11,12,13, 9,11,10, + 13,12,11,12,12,14,15,11,13,12,15,14,10,11,11,13, + 14,11,12,12,13,14,11,12,12,14,14,13,13,14,14,16, + 13,14,14,16,15,11,12,11,14,13,12,13,13,14,14,11, + 13,12,14,13,14,14,15,16,16,13,14,14,16,14, 8, 9, + 9,11,12, 9,10,10,12,13, 9,10,10,13,12,11,12,12, + 14,15,11,12,12,14,14, 9, 9,10,11,13,10,10,12,12, + 14,10,10,11,13,13,12,12,13,14,16,12,12,13,15,15, + 9,10,10,13,12,10,11,11,13,14,10,12,11,14,13,12, + 13,13,15,15,12,13,13,15,15,11,11,12,13,15,12,12, + 13,13,15,12,13,13,14,15,14,14,15,15,17,14,15,15, + 16,16,11,13,12,15,14,13,13,13,15,15,12,14,13,15, + 14,15,15,15,16,16,14,15,15,17,15, 7, 9, 9,12,11, + 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, + 13,12,15,14, 9,10,10,12,12,10,10,11,12,13,10,11, + 11,14,13,12,12,13,14,15,12,13,13,15,14, 9,10,10, + 12,12,10,11,11,13,13,10,11,10,14,12,12,13,13,15, + 15,12,13,12,15,13,11,12,12,14,14,12,12,13,14,15, + 12,13,13,15,15,14,13,14,13,16,14,15,15,16,16,11, + 12,12,14,14,13,13,14,15,15,12,13,12,15,14,15,15, + 15,16,16,14,15,14,17,14,10,11,12,13,14,11,12,13, + 14,15,11,12,12,14,15,13,14,15,15,17,14,14,14,16, + 16,11,12,13,12,15,12,12,14,13,16,13,13,14,13,16, + 14,14,15,14,17,15,15,15,15,17,11,13,12,15,15,13, + 13,14,15,16,12,14,13,16,15,15,15,15,17,17,15,15, + 15,17,16,14,14,15,14,16,14,14,16,14,17,15,15,15, + 14,17,16,16,17,15,18,17,17,17,16,18,14,15,15,17, + 16,15,16,16,17,17,15,16,15,17,16,17,17,17,18,18, + 16,17,16,18,17,10,11,11,14,13,11,12,12,14,14,11, + 13,12,15,14,14,14,14,16,16,14,15,14,16,15,11,12, + 12,15,13,12,13,13,15,14,13,14,13,16,14,14,15,15, + 16,16,15,16,15,17,16,11,13,12,15,14,13,13,14,15, + 15,12,14,13,16,14,15,15,15,17,17,14,16,15,17,16, + 14,14,14,16,15,14,15,15,16,16,15,16,15,17,16,16, + 16,16,16,17,16,17,17,18,17,14,15,15,16,16,15,15, + 16,17,16,14,15,15,17,16,17,17,17,18,18,16,17,16, + 18,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, + 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, + 9,10,11,12,13, 9,11,10,13,12,11,12,13,14,15,11, + 12,12,15,14, 8, 9, 9,12,11, 9,10,10,12,13, 9,10, + 10,13,12,11,12,12,14,15,11,12,12,14,13,11,11,12, + 13,14,11,12,13,13,15,12,13,13,14,14,13,14,14,14, + 16,14,15,14,16,16,10,11,11,14,13,11,12,12,14,14, + 11,12,12,14,13,13,14,14,15,16,13,14,13,16,14, 7, + 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, + 13,14,15,11,12,12,14,14, 9,10,10,12,12,10,10,11, + 12,13,10,11,11,13,13,12,12,13,13,15,12,13,13,15, + 15, 9,10,10,12,12,10,11,11,13,13,10,11,10,13,12, + 12,13,13,14,15,12,13,12,15,13,11,12,12,14,14,12, + 12,13,14,15,13,14,13,15,15,14,13,15,13,16,15,15, + 15,16,16,11,12,12,14,14,12,13,13,14,15,12,13,12, + 15,14,14,15,15,16,17,13,14,13,16,13, 8, 9, 9,12, + 11, 9,10,10,12,13, 9,10,10,13,12,11,12,12,14,15, + 11,12,12,15,14, 9,10,10,12,13,10,11,12,13,14,10, + 11,11,14,13,12,13,13,15,15,12,13,13,15,15, 9,10, + 9,13,11,10,11,10,13,13,10,12,10,14,12,12,13,12, + 15,15,12,13,12,15,14,11,12,13,14,15,12,13,14,14, + 15,13,13,13,15,15,14,15,15,15,17,15,15,15,16,16, + 11,12,11,15,13,12,13,13,15,14,12,13,12,16,13,14, + 15,15,16,16,14,15,14,17,14,10,11,11,13,14,11,12, + 13,14,15,11,12,12,14,14,14,14,15,15,17,14,14,14, + 15,16,11,12,13,14,15,12,13,14,14,16,13,14,13,15, + 15,14,15,16,15,17,15,15,15,17,17,11,12,12,13,15, + 13,13,14,14,16,12,13,13,14,15,15,15,15,16,17,14, + 15,15,16,16,14,15,15,16,16,14,15,15,16,17,15,15, + 16,16,17,16,16,17,16,18,17,17,17,18,18,14,14,15, + 15,16,15,15,15,16,17,14,15,15,16,16,16,17,17,17, + 18,16,16,16,17,16,10,11,11,14,13,11,13,12,15,14, + 11,13,12,15,14,14,15,14,16,16,13,15,14,17,15,11, + 12,13,15,15,12,13,14,15,16,13,14,13,16,15,15,15, + 15,16,17,15,15,15,17,16,11,13,11,15,12,13,14,13, + 16,13,12,14,12,16,13,15,15,15,17,15,14,16,14,17, + 14,14,15,15,16,17,15,15,16,16,17,15,16,15,17,17, + 16,16,17,17,18,16,17,17,18,18,14,15,14,17,13,15, + 16,15,17,15,15,16,15,17,14,16,17,16,18,16,16,17, + 16,18,15, 9,11,11,13,13,10,12,12,14,14,11,12,12, + 14,14,13,14,14,15,16,13,14,14,16,16,10,11,12,14, + 14,11,12,13,14,15,11,13,13,15,15,13,14,14,15,16, + 14,15,15,16,16,11,12,12,14,14,12,13,13,15,15,12, + 13,12,15,14,14,15,15,16,16,14,15,14,17,16,12,13, + 13,15,16,13,13,14,15,16,13,14,14,16,16,14,15,16, + 16,17,15,16,16,17,17,13,14,14,16,15,14,15,15,17, + 16,14,15,14,17,15,16,16,17,17,17,16,16,16,18,16, + 10,11,12,14,14,11,12,13,14,15,11,13,12,15,15,13, + 14,15,16,16,14,15,15,17,16,11,11,13,14,15,12,12, + 14,14,16,12,13,14,15,15,14,14,15,16,17,15,15,15, + 17,17,12,13,12,15,15,13,14,14,16,15,13,14,13,16, + 15,15,16,15,17,17,15,16,15,17,16,13,12,15,14,16, + 14,13,15,14,17,14,13,15,15,17,15,14,17,15,18,16, + 15,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, + 15,17,16,16,17,17,18,18,16,17,16,18,17,10,11,11, + 14,14,11,12,12,14,15,11,13,12,15,14,13,14,14,16, + 16,14,15,14,16,16,11,12,12,14,14,12,12,13,15,15, + 12,13,13,15,15,14,14,15,16,16,14,15,15,17,16,11, + 12,12,15,15,13,13,13,15,15,12,13,13,15,15,15,15, + 15,17,17,14,15,15,17,16,13,14,13,16,15,14,14,14, + 16,16,14,15,14,17,16,15,15,16,16,17,16,17,16,18, + 17,14,15,15,16,16,15,15,15,17,17,14,15,15,17,16, + 16,17,17,18,18,16,17,16,18,16,12,13,13,15,15,13, + 14,14,16,16,13,14,14,16,16,14,15,16,16,18,15,16, + 16,17,17,13,13,14,14,16,14,14,15,15,17,14,14,15, + 15,17,15,15,17,15,18,16,16,17,17,18,13,14,14,16, + 16,14,15,15,16,17,14,15,15,17,16,16,17,16,17,18, + 16,17,16,18,17,15,14,16,13,18,16,15,17,14,18,16, + 15,17,14,18,17,16,18,15,19,17,17,18,16,19,15,16, + 16,17,17,16,17,17,18,18,16,17,16,18,17,18,18,18, + 19,18,17,18,17,19,17,11,12,12,15,15,13,13,14,15, + 16,13,14,13,16,15,15,15,15,16,17,15,16,15,17,16, + 12,13,13,15,15,13,13,14,15,16,14,15,14,16,15,15, + 15,16,16,17,16,16,16,18,17,12,13,13,15,15,14,14, + 15,16,16,13,14,13,16,15,16,16,16,17,17,15,16,15, + 18,16,15,15,15,17,15,14,15,15,16,16,16,17,16,17, + 16,16,16,17,16,17,17,18,17,19,18,15,15,16,17,17, + 16,16,16,17,17,15,16,15,17,16,17,18,18,18,18,16, + 17,16,18,16, 9,11,11,13,13,11,12,12,14,14,10,12, + 12,14,14,13,14,14,15,16,13,14,14,16,15,11,12,12, + 14,14,12,12,13,14,15,12,13,13,15,15,14,14,15,16, + 17,14,15,15,16,16,10,12,11,14,14,11,13,13,15,15, + 11,13,12,15,14,14,14,15,16,16,13,14,14,16,15,13, + 14,14,15,16,14,14,15,15,17,14,15,15,16,17,16,16, + 16,16,18,16,16,17,17,17,12,13,13,16,15,13,14,14, + 16,16,12,14,13,16,15,15,16,16,17,17,14,16,15,17, + 16,10,11,11,14,14,11,12,13,14,15,11,12,12,15,14, + 14,14,15,16,16,13,14,14,16,16,11,12,12,14,15,12, + 13,14,15,15,13,13,13,15,15,14,15,15,16,17,15,15, + 15,16,17,11,12,12,14,14,12,13,13,15,15,12,13,12, + 15,15,14,15,15,16,17,14,15,14,16,16,14,14,15,16, + 16,14,15,15,16,17,15,16,15,17,17,16,16,17,16,18, + 16,17,17,18,18,13,13,14,15,16,14,14,15,16,17,14, + 14,14,16,15,16,16,17,17,18,15,16,15,17,16,10,12, + 11,14,14,11,13,13,15,15,11,13,12,15,15,14,15,15, + 16,16,13,15,14,16,16,12,12,13,15,15,13,13,14,15, + 16,13,14,14,16,15,15,15,16,16,17,15,15,15,17,17, + 11,13,11,15,14,12,14,13,16,15,12,14,12,16,14,15, + 15,15,17,17,14,15,14,17,15,14,15,15,16,17,15,15, + 16,16,17,15,16,16,17,17,16,16,17,17,18,16,17,17, + 18,18,13,14,12,16,14,14,15,13,17,15,14,15,13,17, + 14,16,17,15,18,17,15,17,14,18,15,11,12,12,14,15, + 13,13,14,15,16,13,14,13,16,15,15,15,16,16,17,15, + 15,15,16,16,12,13,13,15,15,13,13,14,15,16,14,15, + 14,16,16,15,15,16,16,18,16,16,16,18,17,12,13,13, + 15,15,14,14,15,15,16,13,14,13,15,15,16,16,16,17, + 18,15,16,15,17,16,15,16,15,17,16,15,15,16,16,17, + 16,17,16,17,17,16,16,17,16,18,17,18,18,18,18,14, + 15,15,15,17,16,15,17,16,17,14,15,15,16,16,17,17, + 18,18,19,16,16,16,17,16,12,13,13,15,15,13,14,14, + 16,16,13,14,14,16,16,15,16,16,17,17,15,16,15,18, + 16,13,14,14,16,16,14,15,15,16,17,14,15,15,17,16, + 16,16,17,17,18,16,17,16,18,18,13,14,13,16,14,14, + 15,14,17,15,14,15,14,17,14,16,17,16,18,17,15,17, + 15,18,15,15,16,16,17,18,16,16,17,17,18,16,17,17, + 17,18,17,17,18,18,19,17,18,18,19,18,15,16,14,17, + 13,16,17,15,18,14,16,17,15,18,14,18,18,17,19,16, + 17,18,16,19,15, +}; + +static const static_codebook _44p7_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p7_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p7_p2_0, + 0 +}; + +static const long _vq_quantlist__44p7_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p3_0[] = { + 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 8, 7, 8,10, 8, + 9, 9, 5, 7, 7, 8, 9, 9, 7,10, 8, 5, 7, 8, 8, 9, + 10, 8,10,10, 8, 9,10,10,10,12,10,12,12, 8,10,10, + 10,12,12,10,12,11, 5, 8, 7, 8,10,10, 8,10, 9, 8, + 10,10,10,11,12,10,12,12, 8,10, 9,10,12,12,10,12, + 10, 5, 8, 8, 7,10,10, 8,10,10, 7, 9,10, 9,10,12, + 10,12,12, 8,10,10,10,12,12,10,12,11, 7, 9,10, 9, + 11,12,10,12,11, 9, 9,12,11,10,14,12,12,13,10,12, + 11,12,13,13,11,14,12, 7,10, 9,10,11,11,10,12,11, + 9,11,11,11,11,13,12,14,13,10,12,12,12,14,14,11, + 14,12, 5, 8, 8, 8,10,10, 7,10,10, 8,10,10,10,11, + 12,10,12,12, 7,10, 9,10,12,12, 9,12,10, 7, 9,10, + 10,11,12,10,11,11,10,12,12,11,12,14,12,14,14, 9, + 11,11,12,13,14,11,13,11, 7,10, 9,10,11,12, 9,12, + 11,10,11,12,11,12,14,12,13,13, 9,12, 9,12,13,12, + 11,14,10, +}; + +static const static_codebook _44p7_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p7_p3_0, + 0 +}; + +static const long _vq_quantlist__44p7_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p3_1[] = { + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, + 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, + 8, 8, 8, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, + 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 7, 8, 8, 8, + 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, + 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, + 9, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 9, 8, 8, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, + 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 9, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, + 8, 9, 8, +}; + +static const static_codebook _44p7_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p7_p3_1, + 0 +}; + +static const long _vq_quantlist__44p7_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p4_0[] = { + 1, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 8, 7, 8,10, 8, + 10,10, 5, 8, 7, 8,10,10, 7,10, 8, 6, 8, 9, 9,10, + 12, 9,11,11, 9,10,11,11,11,13,11,13,13, 9,11,11, + 11,12,13,11,13,11, 6, 9, 8, 9,11,11, 9,12,10, 9, + 11,11,11,11,13,11,13,13, 9,11,10,11,13,13,11,13, + 11, 6, 9, 9, 8,10,11, 9,12,11, 8,10,11,10,11,13, + 11,13,13, 9,11,11,11,13,12,11,13,11, 8,10,10, 9, + 11,12,10,12,12,10,10,12,11,11,14,12,13,14,10,12, + 12,12,13,13,11,14,11, 8,11,10,11,12,13,11,14,12, + 10,12,11,11,12,14,13,15,14,10,12,12,13,14,15,12, + 14,12, 5, 9, 9, 9,11,12, 8,11,10, 9,11,11,11,11, + 13,11,12,13, 8,11,10,11,13,13,10,13,11, 8,10,11, + 11,12,14,11,13,12,10,12,12,12,12,14,14,15,14,10, + 11,12,13,14,15,11,14,12, 8,10,10,10,12,12, 9,12, + 11,10,12,12,11,11,14,12,13,13,10,12,10,12,14,13, + 11,13,11, +}; + +static const static_codebook _44p7_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p7_p4_0, + 0 +}; + +static const long _vq_quantlist__44p7_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p7_p4_1[] = { + 7, 8, 8,10,10, 8, 9, 9,10,11, 8, 9, 9,10,10, 9, + 10,10,11,11, 9,10,10,11,11, 8, 9, 9,10,10, 9, 9, + 10,11,11, 9,10,10,11,11,10,10,11,11,11,10,11,11, + 11,11, 8, 9, 9,10,10, 9,10,10,11,11, 9,10, 9,11, + 11,10,11,11,11,11,10,11,10,11,11,10,10,10,11,11, + 10,11,11,11,11,10,11,11,11,11,11,11,11,11,12,11, + 11,11,11,12,10,10,10,11,11,10,11,11,11,11,10,11, + 11,11,11,11,11,11,12,11,11,11,11,12,11, 8, 9,10, + 11,11, 9,10,11,11,11, 9,10,10,11,11,10,11,11,12, + 12,10,11,11,12,12,10,10,10,11,11,10,10,11,11,12, + 10,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, + 10,10,11,11,10,11,11,12,12,10,11,11,12,11,11,12, + 12,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12, 8,10, 9,11,11, 9, + 10,10,11,11, 9,10,10,11,11,10,11,11,12,12,10,11, + 11,12,12,10,10,10,11,11,10,11,11,12,12,10,11,11, + 12,12,11,11,12,12,12,11,12,12,12,12,10,10,10,11, + 11,10,11,11,12,12,10,11,10,12,11,11,12,11,12,12, + 11,12,11,12,12,11,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, + 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,10,11,11,11,12,11,11,12,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 11,11,12,12,12,11,12,12,12,12,12,12,12,12,12,12, + 12,13,12,13,12,12,12,13,13,11,12,11,12,12,11,12, + 12,12,12,11,12,12,12,12,12,12,12,13,13,12,12,12, + 13,13,12,12,12,12,12,12,12,12,12,13,12,12,13,13, + 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,12, + 12,12,13,13,13,12,12,12,13,12,12,13,13,13,13,12, + 13,13,13,13,10,11,11,12,11,11,11,11,12,12,11,12, + 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,12,12,12,13,13,11,12,11,12,12,12,12,12,12,12, + 11,12,11,12,12,12,12,12,13,13,12,12,12,13,12,12, + 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,13, + 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, + 13,13,12,13,12,13,12,12,13,13,13,13,13,13,13,13, + 13, 8,10,10,11,11, 9,10,10,11,11, 9,10,10,11,11, + 10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11,10, + 10,11,11,12,10,11,11,12,12,11,11,12,12,12,11,11, + 12,12,12,10,10,10,11,11,10,11,11,12,12,10,11,10, + 12,11,11,12,11,12,12,11,12,11,12,12,11,11,11,12, + 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, + 12,12,12,12,12,11,11,11,12,11,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, + 10,11,11,10,11,11,11,12,10,11,11,12,12,11,11,11, + 12,12,11,11,11,12,12,10,10,11,11,12,11,11,12,12, + 12,11,11,11,12,12,11,11,12,12,12,11,12,12,12,12, + 10,11,11,12,12,11,11,11,12,12,11,12,11,12,12,11, + 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, + 12,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,13,12, 9,10,10,11,11, + 10,11,11,12,12,10,11,11,12,11,11,12,11,12,12,11, + 12,11,12,12,10,11,11,12,12,11,11,11,12,12,11,12, + 11,12,12,11,12,12,12,12,12,12,12,12,12,10,11,11, + 12,12,11,12,11,12,12,11,12,11,12,12,12,12,12,13, + 12,12,12,12,12,12,11,12,11,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,13,12,12,12,12,13,11, + 12,12,12,12,12,12,12,13,12,11,12,12,12,12,12,12, + 12,13,12,12,12,12,13,12,10,11,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, + 13,11,11,12,12,12,12,12,12,12,13,12,12,12,12,12, + 12,12,13,12,13,12,12,13,13,13,11,12,12,12,12,12, + 12,12,13,13,12,12,12,13,12,12,13,12,13,13,12,13, + 12,13,13,12,12,12,12,12,12,12,13,12,13,12,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,13, + 13,12,13,13,13,13,12,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,10,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, + 12,12,12,12,12,12,12,13,12,12,12,13,12,12,12,13, + 13,13,12,13,13,13,13,11,12,12,12,12,12,12,12,13, + 13,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, + 12,12,12,12,12,12,13,13,13,13,12,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,12,12,12,13,12,12,13, + 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13, 8,10,10,11,11, 9,10,10,11,11, 9,10,10,11, + 11,10,11,11,12,12,10,11,11,12,12,10,10,10,11,11, + 10,11,11,11,12,10,11,11,12,12,11,11,12,12,12,11, + 11,12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11, + 10,12,11,11,12,11,12,12,11,12,11,12,12,11,11,11, + 12,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,11,11,12,11,11,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 9, + 10,10,11,11,10,11,11,12,12,10,11,11,12,12,11,11, + 12,12,12,11,12,12,12,12,10,11,11,12,12,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,10,11,11,12,12,11,11,12,12,12,11,11,11,12,12, + 12,12,12,12,12,11,12,12,12,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,12,13,12,12, + 12,13,12,11,12,12,12,12,12,12,12,12,12,11,12,12, + 12,12,12,12,12,13,12,12,12,12,13,12, 9,10,10,11, + 11,10,11,11,12,12,10,11,11,12,12,11,11,11,12,12, + 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, + 11,11,12,12,11,12,12,12,12,11,12,12,12,12,10,11, + 10,12,11,11,11,11,12,12,11,12,11,12,12,11,12,12, + 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,12,12,12,12,13, + 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12, + 12,12,13,12,12,12,12,13,12,10,11,11,12,12,11,12, + 12,12,12,11,12,12,12,12,12,12,12,13,13,12,12,12, + 13,13,11,12,12,12,12,12,12,12,12,13,12,12,12,13, + 13,12,12,13,13,13,12,13,13,13,13,11,12,12,12,12, + 12,12,12,12,13,12,12,12,12,12,12,13,13,13,13,12, + 13,12,13,13,12,12,12,12,13,12,13,13,13,13,12,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, + 12,12,12,13,13,13,13,12,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, + 11,12,12,12,12,12,12,12,13,13,12,12,12,13,12,11, + 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,12, + 13,13,13,12,13,13,13,13,11,12,11,12,12,12,12,12, + 13,12,12,12,12,13,12,12,13,12,13,13,12,13,12,13, + 12,12,12,12,12,13,12,12,13,13,13,12,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12, + 13,13,13,13,12,13,12,13,12,13,13,13,13,13,13,13, + 13,13,13,10,11,11,12,12,10,11,11,12,12,10,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, + 12,11,11,12,12,12,11,12,12,12,12,12,12,12,13,13, + 12,12,12,13,13,11,11,11,12,12,11,12,12,12,12,11, + 12,11,13,12,12,12,12,13,13,12,12,12,13,13,11,12, + 12,12,12,12,12,12,12,13,12,12,12,13,13,12,12,13, + 13,13,12,13,12,13,13,11,12,12,12,12,12,12,12,13, + 12,12,12,12,13,12,12,13,13,13,13,12,13,13,13,13, + 10,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, + 12,12,13,13,12,12,12,13,13,11,11,12,12,12,11,12, + 12,12,13,12,12,12,13,13,12,12,13,13,13,12,12,13, + 13,13,11,12,12,12,12,12,12,12,13,13,12,12,12,13, + 13,12,13,13,13,13,12,13,12,13,13,12,12,12,12,13, + 12,12,13,12,13,12,12,13,13,13,12,12,13,13,13,12, + 13,13,13,13,12,12,12,12,13,12,12,13,13,13,12,12, + 12,13,13,13,13,13,13,13,12,13,13,13,13,10,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,13, + 13,12,12,12,13,13,11,12,12,12,12,11,12,12,12,13, + 12,12,12,13,13,12,12,13,13,13,12,13,13,13,13,11, + 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, + 12,13,13,12,13,12,13,13,12,12,12,12,12,12,12,12, + 13,13,12,13,12,13,13,12,13,13,13,13,13,13,13,13, + 13,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, + 13,13,13,13,13,13,13,13,13,13,11,11,11,12,12,11, + 12,12,12,12,11,12,12,12,12,12,12,12,13,13,12,12, + 12,13,13,11,12,12,12,12,12,12,12,12,13,12,12,12, + 13,13,12,12,13,13,13,12,12,13,13,13,11,12,12,12, + 12,12,12,12,13,13,12,12,12,13,13,12,13,13,13,13, + 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, + 13,13,13,13,12,13,13,12,13,13,13,13,13,13,12,12, + 12,12,12,12,13,13,13,13,12,13,12,13,13,13,13,13, + 13,13,13,13,13,13,13,10,11,11,12,12,11,12,12,12, + 13,11,12,12,13,12,12,12,12,13,13,12,12,12,13,13, + 11,12,12,12,12,12,12,12,13,13,12,13,12,13,13,12, + 12,13,13,13,12,13,13,13,13,11,12,12,12,13,12,12, + 12,13,13,12,12,12,13,12,12,13,13,13,13,12,13,12, + 13,13,12,12,12,12,12,12,12,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, + 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13,10,11,11,12,12,10,11,11,12,12,10,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, + 12,12,11,11,12,12,13,11,12,12,12,12,12,12,12,13, + 13,12,12,12,13,13,10,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,12,12,12,13,13,12,12,12,13,12,11, + 12,12,12,12,12,12,12,12,13,12,12,12,13,13,12,12, + 13,13,13,12,13,13,13,13,11,12,12,12,12,12,12,12, + 13,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, + 13,10,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 12,12,12,13,13,12,12,12,13,13,11,12,12,12,12,12, + 12,12,12,13,12,12,12,13,13,12,12,13,13,13,12,12, + 13,13,13,11,12,12,12,12,12,12,12,13,13,11,12,12, + 13,12,12,13,13,13,13,12,13,12,13,13,12,12,12,12, + 13,12,12,13,13,13,12,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,12,12,12,13,12,12,12,13,13,13,12, + 12,12,13,13,13,13,13,13,13,12,13,13,13,13,10,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, + 13,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, + 13,12,12,12,13,13,12,12,13,13,13,12,12,13,13,13, + 11,12,11,12,12,12,12,12,13,13,11,12,12,13,12,12, + 13,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, + 13,13,13,12,13,12,13,13,12,13,13,13,13,13,13,13, + 13,13,12,12,12,13,12,12,13,12,13,13,12,13,12,13, + 13,13,13,13,13,13,12,13,12,13,13,10,11,11,12,12, + 11,12,12,12,12,11,12,12,13,12,12,12,12,13,13,12, + 12,12,13,13,11,12,12,12,12,12,12,12,12,13,12,12, + 12,13,13,12,12,13,13,13,12,13,13,13,13,11,12,12, + 12,12,12,12,12,13,13,12,12,12,13,12,12,13,13,13, + 13,12,13,12,13,13,12,12,12,12,13,12,12,13,13,13, + 12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12, + 12,12,12,12,12,13,13,13,13,12,13,12,13,13,13,13, + 13,13,13,13,13,13,13,13,11,11,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,13,13,12,12,12,13, + 13,11,12,12,12,12,12,12,12,13,13,12,12,12,13,13, + 12,12,13,13,13,12,13,13,13,13,11,12,12,12,12,12, + 12,12,13,13,12,12,12,13,12,12,13,12,13,13,12,13, + 12,13,13,12,12,12,12,12,12,13,13,13,13,12,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,12, + 12,12,13,13,13,13,12,13,12,13,12,13,13,13,13,13, + 13,13,13,13,12, +}; + +static const static_codebook _44p7_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p7_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p7_p4_1, + 0 +}; + +static const long _vq_quantlist__44p7_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p7_p5_0[] = { + 2, 6, 6, 9, 9, 5, 7, 8,10,11, 5, 8, 7,11,10, 8, + 10,11,12,13, 8,11,10,13,12, 6, 7, 8,10,11, 7, 8, + 10,10,12, 8, 9, 9,12,11,10,10,12,11,14,10,11,12, + 14,13, 6, 8, 7,11,10, 8, 9, 9,11,12, 7,10, 8,12, + 10,10,12,12,13,14,10,12,10,14,11, 9,10,11,11,12, + 10,10,11,11,13,11,12,12,13,13,12,11,13,11,15,13, + 14,13,14,14, 9,11,10,12,11,11,12,12,13,13,10,11, + 10,13,11,13,13,14,14,14,12,13,11,14,11, 7, 8, 9, + 11,12, 9, 9,11,12,13, 9,10,10,13,12,11,12,13,13, + 15,11,12,12,14,14, 9,10,10,12,13,10,10,12,12,14, + 11,11,11,13,13,12,12,13,13,15,12,13,13,15,14, 9, + 10,10,12,13,10,11,11,13,14,10,12,11,14,13,12,13, + 13,14,15,12,13,13,15,14,12,12,13,13,14,12,13,13, + 13,15,13,14,14,14,15,14,14,15,14,16,14,15,15,16, + 16,12,13,13,14,14,13,13,14,15,14,12,13,13,15,14, + 14,15,15,15,16,14,15,14,16,14, 7, 9, 8,12,11, 9, + 10,10,12,13, 9,11, 9,13,12,11,12,12,14,14,11,13, + 12,15,13, 9,10,10,13,12,10,11,12,13,14,10,12,11, + 14,13,12,13,13,14,15,13,13,13,15,14, 9,10,10,13, + 12,11,11,11,13,13,10,12,10,14,12,13,13,13,14,15, + 12,13,12,15,13,12,13,13,14,14,12,13,13,14,15,13, + 14,13,15,15,14,14,15,14,16,14,15,15,16,15,12,13, + 12,14,13,13,13,13,15,14,12,13,13,15,13,14,15,15, + 16,15,14,15,14,16,14,11,12,12,13,14,12,13,14,14, + 15,12,13,13,14,15,14,14,15,15,16,14,15,15,16,16, + 12,13,13,14,15,13,13,14,14,16,13,14,14,15,15,15, + 15,16,15,17,15,15,15,16,16,12,13,13,14,15,13,14, + 14,15,16,13,14,14,15,15,15,15,16,16,17,15,15,15, + 17,16,14,15,15,16,16,15,15,16,15,16,15,16,16,16, + 17,16,16,17,16,18,16,16,17,18,17,14,15,15,16,16, + 15,16,16,16,17,15,16,15,17,16,16,17,17,17,18,16, + 16,16,17,16,11,12,12,14,13,12,13,13,15,14,12,14, + 13,15,14,14,15,15,16,16,14,15,14,16,15,12,13,13, + 15,14,13,14,14,15,15,13,14,14,16,15,15,15,15,16, + 16,15,16,15,17,16,12,13,13,15,14,13,14,14,15,15, + 13,14,13,16,14,15,15,15,16,16,15,15,15,17,15,14, + 15,15,16,16,15,15,15,16,16,15,16,16,17,17,16,16, + 17,17,17,16,17,17,18,17,14,15,15,16,15,15,15,16, + 16,16,15,15,15,17,15,17,17,17,18,17,16,17,16,18, + 16, 6, 9, 9,12,12, 8,10,10,12,13, 9,11,10,13,12, + 10,12,12,14,14,11,13,12,14,14, 8,10,10,12,12, 9, + 10,11,12,14,10,11,11,13,13,12,12,13,13,15,12,13, + 13,15,14, 9,10,10,13,13,10,11,11,13,13,10,12,10, + 14,13,12,13,13,14,15,12,13,13,15,14,11,12,12,13, + 14,12,12,13,13,15,12,13,13,14,14,13,13,14,13,16, + 14,15,15,16,15,11,12,12,14,14,13,13,13,15,14,12, + 13,13,15,14,14,15,15,16,15,14,14,14,16,14, 7, 9, + 10,12,12, 9,10,11,13,13, 9,11,10,13,13,11,12,13, + 14,15,12,13,13,15,14, 9,10,11,12,13,10,10,12,13, + 14,11,11,12,14,14,12,12,14,14,15,13,13,13,15,15, + 9,11,11,13,13,11,12,12,14,14,10,12,10,14,13,13, + 14,13,15,15,12,14,13,15,14,12,12,13,13,15,12,12, + 14,13,15,13,14,14,15,15,14,14,15,14,17,14,15,15, + 16,16,12,13,13,15,14,13,14,14,15,15,12,14,13,15, + 14,14,15,15,16,16,14,15,14,16,14, 7,10,10,12,12, + 10,11,11,12,13,10,12,10,14,12,12,13,13,14,15,12, + 13,13,15,14, 9,11,10,13,12,10,10,12,12,14,11,13, + 12,14,13,13,13,14,13,15,13,14,14,15,14,10,11,11, + 13,13,12,12,12,13,14,10,12,10,14,12,13,14,14,15, + 15,13,14,13,15,13,12,13,13,14,14,12,12,13,14,15, + 13,14,14,15,15,13,13,14,13,15,14,15,15,16,16,12, + 13,13,14,14,13,14,14,15,15,12,13,13,15,13,15,15, + 15,16,16,13,14,13,16,13,11,12,13,14,14,12,13,14, + 14,15,12,13,13,15,15,14,14,15,15,17,14,15,15,16, + 16,12,13,14,14,15,13,13,14,14,16,13,14,14,15,16, + 14,14,16,15,17,15,15,16,16,16,12,13,13,15,15,13, + 14,14,15,16,13,14,14,15,16,15,15,16,17,17,15,16, + 15,17,16,14,15,15,15,16,15,15,16,15,17,15,15,16, + 16,17,16,16,16,16,18,16,16,17,17,17,14,15,15,16, + 16,15,16,16,16,17,15,16,15,17,16,16,17,17,17,17, + 16,17,16,18,17,11,12,12,14,14,13,13,14,14,15,13, + 14,13,15,14,14,15,15,15,16,14,15,15,17,15,12,13, + 13,15,14,13,13,14,15,15,14,15,14,16,15,15,15,15, + 15,16,15,16,15,17,16,12,13,13,15,15,14,14,14,15, + 16,13,14,13,16,15,15,15,16,16,17,15,16,15,17,15, + 14,15,15,16,16,14,15,15,16,16,15,16,16,17,16,15, + 15,16,15,17,16,17,17,18,17,14,15,15,16,16,15,16, + 16,16,17,14,15,15,17,16,17,17,17,17,18,15,16,16, + 18,15, 6, 9, 9,12,12, 9,10,11,12,13, 8,10,10,13, + 12,11,12,13,14,14,10,12,12,14,13, 9,10,10,12,13, + 10,10,12,13,14,10,11,11,13,13,12,13,13,14,15,12, + 13,13,15,14, 8,10,10,12,12,10,11,11,13,13, 9,11, + 10,13,13,12,13,13,14,15,12,13,12,15,13,11,12,12, + 14,14,12,13,13,13,15,13,13,13,14,15,14,14,15,14, + 16,14,15,15,15,15,11,12,12,14,13,12,13,13,15,14, + 12,13,12,15,13,14,14,15,16,16,13,14,13,16,13, 7, + 10,10,12,12,10,10,12,12,14,10,11,11,13,12,12,13, + 13,13,15,12,13,13,15,14,10,11,11,13,13,10,10,12, + 12,14,12,12,12,14,13,13,13,14,13,15,13,14,14,15, + 14, 9,10,11,13,13,11,12,12,13,14,10,12,10,14,12, + 13,13,14,14,15,13,13,12,15,13,12,13,13,14,14,12, + 13,13,14,15,13,14,14,15,15,13,13,15,13,16,15,15, + 15,16,16,12,13,13,14,14,13,14,14,15,15,12,13,12, + 15,14,15,15,15,16,16,13,14,13,15,13, 7,10, 9,12, + 12, 9,10,11,13,13, 9,11,10,13,13,11,13,13,14,15, + 11,13,12,15,14, 9,11,11,13,13,10,10,12,13,14,11, + 12,12,14,14,12,13,14,14,15,13,13,13,15,15, 9,11, + 10,13,12,11,12,11,14,14,10,12,10,14,13,13,14,13, + 15,15,12,14,12,15,14,12,13,13,14,15,13,13,14,14, + 15,13,14,14,15,15,14,14,15,14,17,14,15,15,16,16, + 12,13,12,15,13,13,14,14,15,15,12,14,13,15,13,14, + 15,15,16,16,14,15,14,16,14,11,12,12,14,14,13,13, + 14,14,15,13,14,13,15,15,14,15,15,16,17,14,15,15, + 16,15,12,13,13,15,15,13,13,14,15,16,14,14,14,16, + 15,15,15,16,15,17,15,16,15,17,16,12,13,13,14,15, + 14,14,15,15,16,13,14,13,15,15,15,15,16,16,17,15, + 15,15,16,15,14,15,15,16,16,14,15,15,16,17,15,16, + 16,17,17,16,15,16,15,17,16,17,17,17,17,14,15,15, + 15,16,15,15,16,16,17,14,15,15,16,16,16,16,17,17, + 18,15,16,15,17,15,11,13,12,14,14,12,13,13,15,15, + 12,14,13,15,14,14,15,15,16,16,14,15,14,16,15,12, + 13,13,15,15,13,14,14,15,16,13,14,14,16,16,15,15, + 16,16,17,15,16,15,17,16,12,13,13,15,14,13,14,14, + 16,15,13,14,13,16,14,15,16,15,17,16,15,15,14,18, + 15,14,15,15,16,16,15,15,16,16,17,15,16,15,17,16, + 16,16,17,17,18,16,17,17,18,17,14,15,15,16,15,15, + 16,15,17,16,15,15,15,17,15,16,17,17,18,17,16,17, + 16,18,15,10,12,12,14,14,12,13,13,14,14,12,13,13, + 14,14,13,14,14,15,15,13,14,14,16,15,11,12,13,14, + 14,12,13,13,15,15,12,13,13,15,15,13,14,15,15,16, + 14,15,15,16,16,12,13,13,14,14,13,13,14,15,15,13, + 14,13,15,15,14,15,15,16,16,14,15,14,16,15,13,14, + 14,15,15,13,14,14,15,16,14,14,15,16,16,14,15,15, + 15,17,15,16,16,17,17,13,14,14,15,15,14,15,15,16, + 16,14,15,15,16,16,15,16,16,16,17,15,16,15,17,16, + 11,12,12,14,14,12,13,13,14,15,12,13,13,15,14,13, + 14,14,15,16,13,14,14,16,15,12,13,13,14,15,13,13, + 14,15,15,13,14,14,15,15,14,14,15,15,17,14,15,15, + 16,16,12,13,13,15,15,13,14,14,15,15,13,14,13,15, + 15,14,15,15,16,17,14,15,15,16,16,13,13,14,15,16, + 14,14,15,15,16,14,15,15,16,16,15,15,16,15,18,15, + 16,16,17,17,14,15,15,16,16,15,15,15,16,16,14,15, + 15,17,16,16,16,16,17,17,15,16,16,17,16,10,12,12, + 14,14,12,13,13,14,15,12,13,13,15,14,14,14,15,15, + 16,14,15,14,16,15,12,13,13,15,14,13,13,14,15,15, + 13,14,14,15,15,14,14,15,15,16,14,15,15,16,16,12, + 13,13,15,15,13,14,14,15,16,13,14,13,15,14,15,15, + 15,16,16,14,15,15,16,15,13,14,14,16,15,14,14,14, + 15,16,14,15,15,16,16,15,15,16,15,17,16,17,16,17, + 17,14,14,15,15,16,15,15,16,16,16,14,15,14,16,15, + 16,16,16,17,17,15,16,15,17,15,11,13,13,14,15,13, + 13,14,15,15,13,14,13,15,15,14,15,15,15,16,14,15, + 15,17,15,13,13,14,15,15,13,14,15,15,16,14,14,14, + 16,16,15,14,16,15,17,15,16,16,17,16,13,14,14,15, + 15,14,14,14,16,16,13,15,14,16,15,15,15,16,17,17, + 15,16,15,17,16,14,15,15,15,16,15,15,16,15,17,15, + 16,16,16,17,16,16,17,15,18,16,17,17,17,17,14,15, + 15,16,16,15,16,16,17,17,15,16,15,17,16,16,17,17, + 18,18,16,17,15,18,16,10,12,12,14,14,13,13,14,14, + 15,13,14,13,15,14,14,15,15,15,16,15,15,15,16,15, + 12,13,13,15,14,12,12,14,14,15,14,15,14,16,15,15, + 14,15,14,17,15,16,16,17,16,12,13,13,14,15,14,14, + 15,15,16,13,14,12,16,14,15,16,16,16,17,15,16,14, + 17,15,14,15,14,16,15,14,14,15,15,15,15,16,15,17, + 16,15,14,16,14,16,16,17,17,18,17,14,14,15,15,16, + 15,16,16,16,17,14,15,14,16,15,16,16,17,17,17,15, + 16,14,17,14,10,12,12,14,13,12,13,13,14,14,11,13, + 12,14,14,13,14,14,15,16,13,14,14,16,15,12,13,13, + 14,14,13,13,14,15,15,13,14,13,15,15,14,14,15,15, + 16,14,15,15,16,16,11,13,12,14,14,12,13,13,15,15, + 12,13,13,15,15,14,15,15,16,16,13,14,14,16,15,13, + 14,14,15,15,14,15,15,15,16,14,15,15,16,16,15,16, + 16,16,17,16,16,16,17,17,13,14,14,15,15,14,15,15, + 16,16,13,14,14,16,15,15,16,16,17,17,15,15,15,17, + 15,11,12,12,14,14,12,13,13,14,15,12,13,13,15,14, + 14,14,15,15,16,14,14,14,16,15,12,13,13,15,14,13, + 13,14,15,15,13,14,14,16,15,14,15,15,15,16,15,15, + 15,16,16,12,13,13,14,15,13,13,14,15,15,13,14,13, + 15,15,15,15,15,16,16,14,15,14,16,15,14,14,15,16, + 16,14,15,15,15,16,15,16,15,16,16,15,15,16,15,17, + 16,16,16,17,17,13,14,14,15,16,14,15,15,16,16,14, + 14,14,16,16,16,16,16,17,17,15,15,15,17,15,11,12, + 12,14,14,12,13,13,14,15,12,13,13,15,14,14,14,14, + 15,16,13,14,14,16,15,12,13,13,15,15,13,13,14,15, + 16,13,14,14,15,15,14,15,15,16,17,14,15,15,17,16, + 12,13,13,15,14,13,14,14,15,15,13,14,13,15,15,14, + 15,15,16,16,14,15,14,17,15,14,15,15,16,16,14,15, + 15,16,17,15,15,15,17,17,15,16,16,16,17,16,17,16, + 17,17,13,15,14,16,15,14,15,15,16,16,14,15,14,16, + 15,16,16,16,17,17,15,16,15,17,15,10,12,12,14,14, + 13,13,14,14,15,13,14,13,15,14,14,15,15,15,17,14, + 15,15,16,15,12,13,13,15,14,12,12,14,14,15,14,15, + 14,16,15,15,14,16,15,17,15,16,16,17,16,12,13,13, + 14,15,14,14,15,15,16,12,14,12,15,14,15,16,16,16, + 17,15,16,14,17,14,14,15,14,16,16,14,14,15,15,16, + 15,16,16,17,16,15,14,16,14,17,16,17,17,18,17,14, + 14,15,15,16,15,15,16,16,17,14,15,14,16,15,16,17, + 17,17,18,15,16,14,17,14,11,13,13,15,14,13,13,14, + 15,15,12,14,13,15,15,14,15,15,15,17,14,15,14,16, + 15,13,14,14,15,15,13,14,15,15,16,14,15,14,16,16, + 15,15,16,16,17,15,16,16,17,17,13,14,13,15,15,14, + 14,14,16,16,13,15,14,16,15,15,16,16,17,17,15,16, + 14,17,15,15,15,15,16,17,15,15,16,16,17,15,16,16, + 17,17,16,15,17,16,17,17,17,17,18,18,14,15,15,17, + 15,15,16,16,17,16,15,16,15,17,15,16,17,17,17,17, + 16,17,15,18,15, +}; + +static const static_codebook _44p7_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p7_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p7_p5_0, + 0 +}; + +static const long _vq_quantlist__44p7_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p7_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p7_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p7_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p7_p5_1, + 0 +}; + +static const long _vq_quantlist__44p7_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p6_0[] = { + 2, 5, 6, 5, 7, 8, 5, 8, 7, 5, 7, 7, 7, 7, 9, 8, + 9, 9, 5, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, + 10, 8, 9, 9, 8, 9,10, 9, 9,11,10,10,11, 8,10, 9, + 10,10,11, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, + 9,10, 9,10,10,10,11,10, 8,10, 9,10,11,10, 9,11, + 9, 6, 8, 8, 7, 9, 9, 8, 9, 9, 7, 9, 9, 9, 9,10, + 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, 9, + 10,10, 9,10,10, 9, 9,10,10, 9,11,10,11,11, 9,10, + 10,10,11,11,10,11,10, 6, 9, 8, 9,10,10, 9,10, 9, + 8,10,10, 9, 9,10,10,11,11, 9,10,10,10,11,11, 9, + 11, 9, 6, 8, 8, 8, 9, 9, 7, 9, 9, 8, 9, 9, 9, 9, + 10, 9,10,10, 7, 9, 9, 9,10,10, 9,10, 9, 6, 8, 9, + 9, 9,10, 9,10,10, 9,10,10, 9, 9,11,10,11,11, 8, + 10,10,10,11,11, 9,10, 9, 7, 9, 9, 9,10,10, 9,10, + 10, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, + 10,11, 9, +}; + +static const static_codebook _44p7_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p7_p6_0, + 0 +}; + +static const long _vq_quantlist__44p7_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p6_1[] = { + 4, 7, 7, 6, 7, 8, 6, 8, 7, 7, 7, 8, 7, 7, 8, 8, + 8, 8, 7, 7, 7, 8, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, + 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, + 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, + 8, 9, 8, 9, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, + 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, + 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, + 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 9, 9, 9, + 8, 9, 8, +}; + +static const static_codebook _44p7_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p7_p6_1, + 0 +}; + +static const long _vq_quantlist__44p7_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p7_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p7_0, + 1, -513979392, 1633504256, 2, 0, + (long *)_vq_quantlist__44p7_p7_0, + 0 +}; + +static const long _vq_quantlist__44p7_p7_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p7_p7_1[] = { + 1, 5, 5, 4,10,10, 5,10,10, 5,10,10,10,10,10,10, + 10,10, 5,10,10,10,10,10, 9,10,10, 6,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10, 7,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,11,11, +}; + +static const static_codebook _44p7_p7_1 = { + 5, 243, + (long *)_vq_lengthlist__44p7_p7_1, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44p7_p7_1, + 0 +}; + +static const long _vq_quantlist__44p7_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p7_p7_2[] = { + 1, 3, 2, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44p7_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p7_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p7_p7_2, + 0 +}; + +static const long _vq_quantlist__44p7_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p7_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p7_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p7_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p7_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p7_short[] = { + 3, 9,14,16,17,19,22,22, 5, 4, 6, 9,11,13,17,20, + 9, 5, 5, 6, 9,11,15,19,11, 7, 5, 5, 7, 9,13,17, + 14, 9, 7, 6, 6, 7,11,14,16,11, 9, 7, 6, 4, 4, 8, + 19,15,13,11, 9, 4, 3, 4,21,16,16,15,12, 6, 4, 4, +}; + +static const static_codebook _huff_book__44p7_short = { + 2, 64, + (long *)_huff_lengthlist__44p7_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p8_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p8_l0_0[] = { + 2, 4, 4, 7, 7, 8, 8,10,10,11,11,12,12, 4, 5, 5, + 7, 7, 9, 9,10, 9,12,10,12,12, 4, 5, 5, 7, 7, 9, + 9, 9,10,10,12,12,12, 7, 7, 7, 7, 8, 9, 8,11, 5, + 12, 6,12,10, 7, 7, 7, 8, 7, 8, 9, 5,11, 6,12,10, + 12, 8, 9, 9, 9, 9, 9, 9,11, 7,11, 7,11, 9, 8, 9, + 9, 9, 9, 9, 9, 7,10, 7,11, 9,11,10,10,10,10,10, + 10,10,11,10,11, 8,12, 9,10,10,10,10,10,10,10,10, + 11, 8,11, 9,12,10,11,11,11,11,11,11,11,11,12,10, + 12,11,10,11,11,11,11,11,11,11,11,10,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,11,12,12,12, + 12,12,12,12,12,12,11,12,12, +}; + +static const static_codebook _44p8_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p8_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p8_l0_0, + 0 +}; + +static const long _vq_quantlist__44p8_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p8_l0_1[] = { + 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p8_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p8_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p8_l0_1, + 0 +}; + +static const long _vq_quantlist__44p8_l1_0[] = { + 54, + 29, + 79, + 0, + 108, +}; + +static const long _vq_lengthlist__44p8_l1_0[] = { + 1, 2, 3, 6, 7, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44p8_l1_0 = { + 2, 25, + (long *)_vq_lengthlist__44p8_l1_0, + 1, -514516992, 1620639744, 7, 0, + (long *)_vq_quantlist__44p8_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p8_lfe[] = { + 2, 3, 1, 3, +}; + +static const static_codebook _huff_book__44p8_lfe = { + 2, 4, + (long *)_huff_lengthlist__44p8_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p8_long[] = { + 2, 7,14,16,17,18,20,21, 7, 4, 6, 8,11,12,14,16, + 13, 5, 4, 4, 8, 9,11,13,15, 8, 4, 3, 5, 7, 9,10, + 17,11, 8, 4, 4, 6, 9, 9,17,11, 9, 7, 6, 5, 7, 8, + 19,13,11, 9, 9, 7, 8, 8,21,15,13,11,10, 8, 8, 7, +}; + +static const static_codebook _huff_book__44p8_long = { + 2, 64, + (long *)_huff_lengthlist__44p8_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p8_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p1_0[] = { + 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, + 10, 8, 9,10, 8, 9,10,10,10,12,10,11,12, 8,10,10, + 10,11,12,10,11,11, 6, 8, 7, 8,10, 9, 8,10, 9, 8, + 10,10,10,11,11,10,12,11, 8,10, 9,10,12,11,10,12, + 10, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, + 9,11,11, 8,10,10,10,12,12,10,12,11, 7, 9, 9, 9, + 10,11, 9,11,11, 9, 9,11,10,11,12,10,11,12, 9,11, + 11,11,12,12,11,12,12, 7, 9, 9,10,11,11,10,12,11, + 9,11,10,11,11,12,11,13,12,10,11,11,12,13,13,11, + 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, + 12,10,12,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, + 10,11,12,10,11,11,10,11,11,11,11,13,12,13,13, 9, + 10,11,12,12,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, + 10, 9,11,11,11,12,12,11,12,12, 9,11, 9,10,12,11, + 10,12,11, +}; + +static const static_codebook _44p8_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p8_p1_0, + 0 +}; + +static const long _vq_quantlist__44p8_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p8_p2_0[] = { + 4, 6, 6, 9, 9, 6, 8, 8,10,10, 6, 8, 8,10,10, 8, + 9,10,12,12, 8,10, 9,12,12, 6, 8, 8,10,10, 8, 8, + 9,10,11, 8, 9, 9,11,11, 9,10,11,12,13,10,11,11, + 13,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 8, 9, 8,11, + 10,10,11,11,13,13, 9,11,10,13,12, 9,10,10,12,12, + 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,12, + 13,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, + 10,13,12,12,13,13,14,15,12,13,12,15,12, 7, 8, 8, + 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,11,13, + 14,10,11,11,13,13, 8, 9, 9,11,12, 9,10,11,11,13, + 9,10,10,12,12,11,11,12,13,15,11,12,12,14,14, 8, + 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, + 12,14,15,11,12,12,14,14,10,11,12,13,13,11,12,12, + 13,14,12,12,12,14,14,13,13,14,14,16,14,14,14,16, + 15,10,11,11,13,13,12,12,12,14,14,11,12,12,14,13, + 14,14,14,15,16,13,14,13,16,14, 7, 8, 8,11,10, 8, + 9, 9,11,11, 8,10, 9,12,11,10,11,11,13,13,10,11, + 11,14,13, 8, 9, 9,12,11, 9,10,10,12,12, 9,11,10, + 13,12,11,12,12,13,14,11,12,12,15,14, 8, 9, 9,12, + 11, 9,10,10,12,12, 9,11,10,13,11,11,12,12,14,14, + 11,12,12,14,13,10,11,11,13,13,11,12,12,13,14,12, + 13,12,14,14,13,13,14,14,16,13,14,14,16,15,10,11, + 11,13,13,12,12,12,14,14,11,12,12,14,13,13,14,14, + 15,15,13,14,13,16,14, 9,10,11,12,13,11,11,12,12, + 14,11,11,12,13,14,13,13,14,14,16,13,13,14,15,15, + 11,11,12,12,14,12,12,13,13,15,12,12,13,13,15,14, + 14,15,15,16,14,14,14,15,16,11,12,12,13,14,12,12, + 13,14,15,12,13,12,14,14,14,14,15,15,16,14,14,14, + 16,16,13,13,14,15,16,14,14,15,15,16,14,15,15,16, + 16,15,15,16,16,18,16,16,16,17,17,13,14,14,15,15, + 14,14,15,16,16,14,15,14,16,16,16,16,16,17,18,15, + 16,16,17,16, 9,11,10,13,12,11,12,11,14,13,11,12, + 11,14,12,13,14,13,15,14,13,14,13,16,14,11,12,12, + 14,13,12,12,13,14,14,12,13,12,15,14,14,14,14,16, + 16,14,15,14,17,15,11,12,11,14,12,12,13,12,15,13, + 12,13,12,15,13,14,14,14,16,15,14,15,14,16,15,13, + 14,14,15,15,14,14,15,16,16,14,15,14,16,16,15,15, + 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, + 16,16,14,15,14,17,15,16,16,16,17,17,15,16,15,18, + 16, 7, 8, 8,10,11, 8, 9, 9,11,12, 8, 9, 9,12,11, + 10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,11, 9, + 10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11,12, + 12,14,14, 8, 9, 9,12,11, 9,10,11,12,13, 9,11,10, + 13,12,11,12,12,14,14,11,12,12,14,13,10,11,11,13, + 13,11,12,12,13,14,11,12,12,14,14,13,13,14,14,16, + 13,14,14,16,15,10,12,11,13,13,12,12,12,14,14,11, + 12,12,14,13,14,14,14,15,16,13,14,14,16,14, 8, 9, + 9,11,11, 9,10,10,12,12, 9,10,10,12,12,11,11,12, + 13,14,11,12,12,14,14, 9, 9,10,11,12,10,10,11,12, + 13,10,10,11,12,13,12,12,13,14,15,12,12,13,14,15, + 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, + 13,13,15,15,12,13,13,15,14,11,11,12,13,14,12,12, + 13,13,15,12,12,13,14,15,14,14,15,14,16,14,14,15, + 15,16,11,12,12,14,14,12,13,13,15,15,12,13,13,15, + 14,14,15,15,16,16,14,15,14,17,15, 8, 9, 9,11,11, + 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, + 13,12,15,13, 9,10,10,12,12,10,10,11,12,13,10,12, + 11,13,13,12,12,13,13,15,12,13,13,15,14, 9,10,10, + 12,12,11,11,12,13,13,10,12,10,13,12,12,13,13,15, + 15,12,13,13,15,13,11,12,12,14,14,12,12,13,14,14, + 12,13,13,15,14,13,13,14,13,16,14,15,14,16,16,11, + 12,12,14,14,13,13,13,15,15,12,13,12,15,14,14,15, + 15,16,17,14,15,13,16,13,10,11,11,13,14,11,12,12, + 13,15,11,12,12,14,14,13,14,14,15,16,13,14,14,16, + 16,11,11,12,12,14,12,12,13,13,15,12,13,13,13,15, + 14,14,15,14,17,14,14,15,15,16,11,12,12,14,14,12, + 13,13,15,15,12,13,13,15,15,14,15,15,16,17,14,15, + 15,16,16,13,14,14,14,16,14,14,15,14,17,14,15,15, + 14,17,16,16,17,15,18,16,16,17,16,18,13,14,14,16, + 16,14,15,15,17,16,14,15,15,17,16,16,17,17,18,18, + 16,17,16,18,17,10,11,11,14,13,11,12,12,14,14,11, + 13,12,15,14,14,14,14,16,15,14,15,14,16,15,11,12, + 12,14,13,12,13,13,15,14,13,14,13,15,14,14,15,15, + 16,16,14,15,15,17,15,11,12,12,14,14,13,13,13,15, + 15,12,13,13,15,14,15,15,15,17,17,14,15,15,17,15, + 13,14,14,16,15,14,15,15,16,16,15,15,15,17,16,16, + 16,16,16,17,16,17,16,18,17,14,14,14,16,16,15,15, + 15,16,16,14,15,14,17,16,16,17,17,17,18,16,17,16, + 18,16, 7, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, + 11,10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,12, + 9,10,11,12,13, 9,11,10,13,12,11,12,12,13,14,11, + 12,12,14,14, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, + 10,13,12,11,12,12,14,14,11,12,11,14,13,10,11,12, + 13,13,11,12,12,13,14,12,13,12,14,14,13,13,14,14, + 16,13,14,14,16,15,10,11,11,13,13,11,12,12,14,14, + 11,12,12,14,13,13,14,14,15,16,13,14,13,16,14, 8, + 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, + 13,13,14,11,12,12,14,14, 9,10,10,12,12,10,10,11, + 12,13,11,12,11,13,13,12,12,13,13,15,12,13,13,15, + 15, 9,10,10,12,12,10,11,12,13,14,10,11,10,13,12, + 12,13,13,14,15,12,13,12,15,13,12,12,12,14,14,12, + 12,13,14,15,13,13,13,15,15,14,14,15,13,16,14,15, + 15,16,16,11,12,12,14,14,12,13,13,14,15,12,13,12, + 14,14,14,14,15,16,16,13,14,13,16,14, 8, 9, 9,11, + 11, 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14, + 11,12,11,14,14, 9,10,10,12,12,10,11,11,13,13,10, + 11,11,13,13,12,13,13,14,15,12,13,13,15,14, 9,10, + 9,12,11,10,11,10,13,12,10,11,10,13,12,12,13,12, + 15,14,12,13,12,15,14,11,12,12,14,14,12,13,13,14, + 15,12,13,13,15,15,14,14,15,15,17,14,15,15,16,16, + 11,12,11,14,13,12,13,12,15,14,12,13,12,15,13,14, + 15,14,16,15,13,15,14,17,14,10,11,11,13,14,11,12, + 13,13,15,11,12,12,14,14,14,14,15,15,17,13,14,14, + 15,16,11,12,12,14,14,12,12,13,14,15,13,13,13,15, + 15,14,15,15,15,17,15,15,15,16,16,11,12,12,13,14, + 13,13,14,14,15,12,13,13,14,15,14,15,15,16,17,14, + 15,15,16,16,14,14,14,16,16,14,14,15,15,17,15,15, + 15,17,16,16,16,17,16,18,16,17,17,18,17,13,14,14, + 15,16,14,15,15,16,17,14,15,15,16,16,16,17,17,17, + 18,16,16,16,17,16,10,11,11,14,13,11,12,12,14,14, + 11,12,12,15,13,13,14,14,16,15,13,14,14,16,15,11, + 12,12,14,14,12,13,13,15,15,12,13,13,15,15,14,15, + 15,16,17,14,15,15,17,16,11,12,11,14,12,12,13,13, + 15,13,12,13,12,15,13,14,15,15,16,15,14,15,14,17, + 14,13,14,14,16,16,14,15,15,16,17,14,15,15,16,17, + 16,16,17,17,18,16,17,17,18,18,13,14,14,16,13,14, + 15,15,17,14,14,15,14,17,14,16,17,16,17,16,16,17, + 16,18,15, 8,11,11,13,13,10,12,12,14,14,11,12,12, + 14,14,13,13,14,15,16,13,14,14,16,15,10,11,11,14, + 14,11,12,12,14,15,11,12,12,15,14,13,14,14,15,16, + 13,14,14,16,16,11,12,12,14,14,12,13,13,15,15,12, + 13,12,15,14,14,14,15,16,16,14,15,14,16,16,12,13, + 13,15,15,12,13,14,15,16,13,14,14,16,16,14,15,15, + 16,17,15,15,16,17,17,13,14,14,16,15,14,15,15,16, + 16,14,15,14,16,16,16,16,16,17,17,15,16,16,18,16, + 10,11,11,13,14,11,12,12,14,15,11,12,12,15,14,13, + 14,14,16,16,13,14,14,16,16,11,11,12,14,14,12,12, + 13,14,15,12,13,13,15,15,14,14,15,15,17,14,14,15, + 16,16,11,12,12,15,14,12,13,13,15,15,12,13,13,15, + 15,14,15,15,17,17,14,15,15,17,16,13,12,14,14,16, + 13,13,15,14,17,14,13,15,15,17,15,14,16,15,18,16, + 15,16,16,18,13,14,14,16,16,14,15,15,17,17,14,15, + 15,17,16,16,17,17,18,18,16,17,16,18,17,10,11,11, + 14,13,11,12,12,14,14,11,13,12,15,14,13,14,14,15, + 16,13,14,14,16,16,11,12,12,14,14,12,13,13,14,15, + 12,13,13,15,15,14,14,15,15,16,14,15,15,17,16,11, + 12,12,14,14,13,13,13,15,15,12,13,13,15,14,14,15, + 15,16,17,14,15,14,17,15,13,14,13,16,15,14,14,14, + 15,16,14,15,14,16,16,15,15,16,16,17,16,16,16,18, + 17,14,14,14,16,16,15,15,15,17,16,14,15,14,17,16, + 16,16,17,17,18,16,17,16,18,16,11,13,13,15,15,12, + 13,14,15,16,12,14,14,15,15,14,15,15,16,17,14,15, + 15,17,17,12,13,14,14,16,13,14,14,14,16,14,14,14, + 15,16,15,15,16,15,18,15,16,16,17,17,13,14,14,16, + 16,14,14,15,16,16,14,15,14,16,16,15,16,16,17,18, + 15,16,16,18,17,14,14,16,13,17,15,15,16,14,18,15, + 15,16,14,18,16,16,18,15,19,17,17,18,16,18,15,16, + 15,17,17,15,16,17,18,18,16,16,16,18,17,17,18,18, + 19,19,17,18,17,19,18,11,12,12,15,14,13,13,14,15, + 16,13,14,13,16,14,15,15,15,16,17,15,16,15,17,16, + 12,13,13,15,14,13,13,14,15,15,14,15,14,16,15,15, + 15,16,16,17,16,16,16,18,17,12,13,13,15,15,14,14, + 15,16,16,13,14,13,16,15,16,16,16,17,18,15,16,15, + 17,16,14,15,14,17,15,14,15,15,16,16,15,16,15,17, + 16,16,15,16,15,17,17,18,17,18,17,15,15,15,16,17, + 16,16,16,17,17,15,16,15,17,16,17,18,18,18,18,16, + 17,16,18,15, 8,11,11,13,13,11,12,12,14,14,10,12, + 12,14,14,13,14,14,15,16,13,14,13,16,15,11,12,12, + 14,14,12,12,13,14,15,12,13,13,15,15,14,14,15,15, + 16,14,14,14,16,16,10,11,11,14,14,11,12,12,14,15, + 11,12,12,15,14,13,14,14,16,16,13,14,14,16,15,13, + 14,14,15,16,14,14,15,16,16,14,15,15,16,16,15,16, + 16,16,18,16,16,16,17,17,12,13,13,15,15,13,14,14, + 16,16,12,14,13,16,15,15,16,15,17,17,14,16,15,17, + 16,10,11,11,13,14,11,12,13,14,15,11,13,12,14,14, + 14,14,15,16,16,13,14,14,16,16,11,12,12,14,14,12, + 13,13,14,15,13,14,13,15,15,14,15,15,16,17,14,15, + 15,17,16,11,12,12,14,14,12,13,13,15,15,12,13,12, + 15,14,14,15,15,16,17,14,15,15,16,16,14,14,14,16, + 16,14,14,15,16,16,15,15,15,16,16,16,16,17,16,18, + 16,17,17,18,18,13,13,14,15,16,14,14,15,16,17,13, + 14,14,16,16,16,16,17,17,18,15,16,15,17,16,10,11, + 11,14,13,11,12,12,14,14,11,12,12,15,14,13,14,14, + 16,16,13,14,14,16,16,11,12,12,14,14,12,13,13,15, + 15,12,13,13,15,15,14,15,15,16,17,14,15,15,17,16, + 11,12,11,14,14,12,13,13,15,15,12,13,12,15,14,14, + 15,14,16,16,14,15,14,17,16,14,14,14,16,16,14,15, + 15,16,17,14,15,15,17,17,16,16,17,17,18,16,17,17, + 18,18,13,14,12,16,14,14,15,13,17,15,13,15,13,17, + 14,16,16,15,18,16,15,17,14,18,15,11,12,12,14,15, + 13,13,14,14,16,13,14,13,15,14,15,15,16,16,17,15, + 16,15,17,16,12,13,13,15,15,13,13,14,15,16,14,15, + 14,16,16,15,15,16,15,18,16,16,16,18,17,12,13,13, + 15,15,14,14,15,15,16,13,14,13,15,15,16,16,16,16, + 18,15,16,15,17,16,15,15,15,17,16,15,15,16,16,17, + 16,16,16,18,17,16,16,17,15,18,17,18,17,19,18,14, + 14,15,15,17,15,15,16,16,17,14,15,15,16,16,17,17, + 18,17,19,16,17,15,17,15,11,13,12,15,15,12,14,14, + 15,15,12,14,13,16,15,15,15,15,17,17,14,15,15,17, + 16,12,14,14,16,16,14,14,15,16,16,14,14,14,16,16, + 15,16,17,17,18,15,16,16,18,17,12,14,13,16,14,13, + 14,14,16,15,13,15,14,16,14,15,16,16,17,17,15,16, + 15,18,15,15,15,16,17,17,15,16,16,17,18,16,16,16, + 18,18,17,17,18,18,19,17,17,18,19,19,14,15,14,17, + 13,15,16,15,18,14,15,16,15,18,14,17,18,17,18,16, + 16,18,16,19,15, +}; + +static const static_codebook _44p8_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p8_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p8_p2_0, + 0 +}; + +static const long _vq_quantlist__44p8_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p3_0[] = { + 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 7, 9, + 10, 8, 9, 9, 8, 9,10, 9,10,12,10,11,11, 8,10, 9, + 10,11,12, 9,11,10, 5, 8, 7, 8,10, 9, 7,10, 9, 8, + 9,10, 9,10,11,10,12,11, 8,10, 9,10,11,11, 9,12, + 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9,10, 9,10,11, + 9,11,11, 8,10, 9,10,11,11,10,12,10, 7, 9,10, 9, + 10,12, 9,11,11, 9, 9,12,11,10,13,11,11,13,10,12, + 11,11,13,13,11,13,12, 7, 9, 9, 9,11,11, 9,12,11, + 9,11,10,10,11,12,11,13,12, 9,11,11,12,13,13,11, + 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10,10,10, + 12,10,11,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, + 9,11,12, 9,11,11, 9,11,11,11,11,13,12,13,13, 9, + 10,11,11,12,13,10,12,11, 7,10, 9, 9,11,11, 9,12, + 10,10,11,12,11,12,13,12,13,13, 9,12, 9,11,13,11, + 10,13,10, +}; + +static const static_codebook _44p8_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p8_p3_0, + 0 +}; + +static const long _vq_quantlist__44p8_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p3_1[] = { + 6, 7, 7, 7, 7, 8, 7, 8, 7, 7, 7, 8, 7, 8, 8, 8, + 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, + 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, + 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, + 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, + 8, 9, 8, +}; + +static const static_codebook _44p8_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p8_p3_1, + 0 +}; + +static const long _vq_quantlist__44p8_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p4_0[] = { + 2, 5, 5, 4, 7, 8, 4, 8, 7, 5, 7, 8, 7, 7,10, 8, + 9, 9, 5, 7, 7, 8, 9, 9, 7,10, 7, 5, 7, 8, 8, 9, + 11, 8,10,10, 8, 9,10,10,10,12,11,12,12, 8,10,10, + 10,12,12,10,12,11, 5, 8, 7, 8,10,10, 8,11, 9, 8, + 10,10,10,11,12,10,12,12, 8,10, 9,11,12,12,10,12, + 10, 5, 8, 8, 7,10,10, 8,11,10, 7, 9,10, 9,10,12, + 10,12,12, 8,10,10,10,12,12,10,12,11, 7, 9,10, 9, + 11,12,10,12,11, 9, 9,12,10,10,13,12,12,13,10,12, + 11,12,13,13,11,13,11, 7,10, 9,10,11,12,10,13,11, + 9,11,11,11,11,13,12,14,13,10,11,11,12,14,14,11, + 14,11, 5, 8, 8, 8,10,11, 7,10,10, 8,10,10,10,11, + 12,10,12,12, 7,10, 9,10,12,12, 9,12,10, 7, 9,10, + 10,11,13,10,12,11,10,11,11,11,11,14,12,14,14, 9, + 11,11,12,13,14,11,13,11, 7,10, 9,10,11,12, 9,12, + 10,10,11,12,11,11,13,12,13,13, 9,12, 9,12,13,12, + 10,13,10, +}; + +static const static_codebook _44p8_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p8_p4_0, + 0 +}; + +static const long _vq_quantlist__44p8_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p8_p4_1[] = { + 7, 9, 9,10,10, 9,10,10,10,11, 9,10,10,11,10, 9, + 10,10,11,11, 9,10,10,11,11, 9,10,10,11,11,10,10, + 10,11,11,10,10,10,11,11,10,11,11,11,11,10,11,11, + 11,11, 9,10,10,11,11,10,10,10,11,11, 9,10,10,11, + 11,10,11,11,11,11,10,11,11,11,11,10,11,11,11,11, + 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,12,10,11,11,11,11,11,11,11,11,11,10,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11, 9,10,10, + 11,11,10,10,11,11,11,10,10,11,11,11,10,11,11,11, + 12,10,11,11,12,12,10,10,11,11,11,10,11,11,11,12, + 11,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, + 11,11,11,11,11,11,11,12,12,10,11,11,12,12,11,12, + 11,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11,10, + 11,10,11,11,10,11,10,11,11,10,11,11,12,12,10,11, + 11,12,11,10,11,11,11,11,10,11,11,11,12,11,11,11, + 12,12,11,11,12,12,12,11,11,11,12,12,10,11,10,11, + 11,11,11,11,12,12,10,11,11,12,11,11,12,11,12,12, + 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, + 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,10,11,11,11,11,11,11,11,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 11,11,11,12,12,11,11,12,12,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,13,12,13,12,12,12,12,13,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,12,10,11,11,11,11,11,11,11,12,12,11,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,12,12,13,12,13, + 12, 9,10,10,11,11,10,10,11,11,11,10,11,10,11,11, + 10,11,11,12,12,10,11,11,12,12,10,10,11,11,11,10, + 11,11,11,12,10,11,11,12,12,11,11,12,12,12,11,11, + 11,12,12,10,11,10,11,11,11,11,11,12,12,10,11,11, + 12,11,11,12,11,12,12,11,12,11,12,12,11,11,11,11, + 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, + 11,12,12,12,12,11,11,11,12,11,11,12,12,12,12,11, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,10,10, + 11,11,11,10,11,11,12,12,10,11,11,12,12,11,11,11, + 12,12,11,11,12,12,12,10,11,11,11,12,11,11,12,12, + 12,11,11,12,12,12,11,11,12,12,12,11,12,12,12,12, + 11,11,11,12,12,11,12,12,12,12,11,12,11,12,12,11, + 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11, + 10,11,11,11,12,10,11,11,12,11,11,12,11,12,12,11, + 12,11,12,12,10,11,11,12,11,11,11,11,12,12,11,12, + 11,12,12,11,12,12,12,12,11,12,12,12,12,10,11,11, + 12,12,11,12,11,12,12,11,12,11,12,12,12,12,12,12, + 12,11,12,12,12,12,11,12,11,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,11,11,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,13,12,12,12,12,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,13,13,12,12, + 12,13,13,12,12,12,12,12,12,12,12,12,13,12,12,12, + 12,13,12,12,13,12,13,12,13,13,13,13,12,12,12,12, + 12,12,12,12,13,12,12,12,12,13,12,12,13,13,13,13, + 12,13,13,13,13,10,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,13,12,12,12,12,13,13,12,12,12,13,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,12, + 13,13,12,13,12,13,13,13,13,12,12,12,12,12,12,12, + 12,13,12,12,12,12,13,12,12,13,13,13,13,12,13,13, + 13,13, 9,10,10,11,11,10,10,11,11,11,10,11,10,11, + 11,10,11,11,12,12,10,11,11,12,12,10,11,11,11,11, + 10,11,11,12,12,11,11,11,12,12,11,11,12,12,12,11, + 11,12,12,12,10,11,10,11,11,10,11,11,12,12,10,11, + 11,12,11,11,12,11,12,12,11,11,11,12,12,11,11,11, + 11,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,11,11,12,11,11,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12, 9, + 10,10,11,11,10,11,11,11,12,10,11,11,12,11,11,11, + 12,12,12,11,11,12,12,12,10,11,11,12,12,11,11,12, + 12,12,11,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,10,11,11,12,12,11,11,11,12,12,11,11,11,12,12, + 11,12,12,12,12,11,12,12,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,11,11,12,12,12,12,12,12,12,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,10,11,10,11, + 11,10,11,11,12,12,10,11,11,12,12,11,11,11,12,12, + 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, + 11,12,12,12,11,12,12,12,12,11,12,12,12,12,10,11, + 11,12,11,11,12,11,12,12,11,12,11,12,12,11,12,12, + 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,11, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,12, + 12,12,12,12,13,13,12,12,12,13,13,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,12, + 12,12,12,12,12,12,12,12,12,12,12,13,12,13,12,12, + 12,13,13,12,13,13,12,13,12,13,13,13,13,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13, + 13,12,13,12,13,12,11,11,11,12,12,11,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,13,13,12,12,12,13,13,11,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,12,12,12,12,13, + 12,12,12,12,12,12,12,12,12,13,13,12,12,12,12,13, + 12,13,13,13,13,12,13,13,13,13,12,12,12,12,12,12, + 12,12,13,12,12,12,12,13,12,12,13,13,13,13,12,13, + 13,13,12,10,11,11,12,12,11,11,11,12,12,11,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, + 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, + 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,11,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,13,12,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,13,12,12,12,12,12,12, + 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, + 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, + 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,13,13,12,12,12,13,13,12,12,12,12,12, + 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,12, + 12,13,13,13,12,12,12,12,12,12,12,12,12,13,12,12, + 12,13,12,12,13,13,13,13,12,13,13,13,13,10,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,11,12,12,12, + 12,12,12,12,12,12,11,11,12,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,13,12,12,12,13,13,11, + 12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12, + 12,13,13,12,12,12,13,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,13,12,12,12,12,12,13,12,13,12,13, + 13,12,12,12,12,12,12,12,12,13,12,12,12,12,13,12, + 12,13,12,13,13,12,13,12,13,12,11,11,11,12,12,11, + 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,13,12,13,12,12,13,13,13,11,12,12,12, + 12,12,12,12,12,12,12,12,12,13,12,12,12,12,13,13, + 12,12,12,13,12,12,12,12,12,12,12,12,13,12,13,12, + 12,12,12,13,12,12,13,12,13,12,13,13,12,13,12,12, + 12,12,12,12,13,13,13,12,12,12,12,13,12,12,13,13, + 13,13,12,13,13,13,12,11,11,11,12,12,11,12,12,12, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,13,12,12,13,13,13,11,12,12,12,12,12,12, + 12,12,13,12,12,12,13,12,12,13,12,13,13,12,13,12, + 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,13,12,13,12,13,13,13,12,12,12,12,12,12, + 12,13,12,13,12,12,12,12,13,12,12,13,13,13,12,12, + 13,12,13,12,10,11,11,12,12,11,11,11,12,12,11,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, + 12,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, + 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,12,12,12,12,12,11,12,12,12,12,12,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,10,11,11,12,12,11,11,12,12,12,11,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,11,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, + 12,13,13,11,11,11,12,12,12,12,12,12,12,11,12,12, + 12,12,12,12,12,13,13,12,12,12,13,13,12,12,12,12, + 12,12,12,12,12,13,12,12,12,12,13,12,12,13,12,13, + 12,12,13,13,13,12,12,12,12,12,12,12,12,12,13,12, + 12,12,12,12,12,12,13,13,13,12,12,12,13,12,11,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,13,13,12,12,12,13,13, + 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12, + 12,12,13,13,12,12,12,13,12,12,12,12,12,12,12,12, + 12,12,13,12,12,12,13,13,12,13,13,13,13,12,13,13, + 13,13,12,12,12,12,12,12,12,12,13,12,12,12,12,13, + 12,12,13,12,13,13,12,13,12,13,12,11,11,11,12,12, + 11,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,11,12,12,12,12,12,12,12,12,13,12,12, + 12,13,13,12,12,13,12,13,12,12,13,13,13,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,12,12,12,13,12,12,12,12,12,12,12,12,12,12,13, + 12,12,12,13,13,12,12,13,12,13,12,13,13,13,13,12, + 12,12,12,12,12,12,13,12,13,12,12,12,12,12,12,13, + 13,12,12,12,13,12,12,12,11,11,11,12,12,11,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,12,12,12,12,12,12,12,12,13,12,12,12,12,13, + 12,12,13,13,13,12,12,12,13,13,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,12,13,13,12,13, + 12,13,12,12,12,12,12,12,12,12,12,12,13,12,13,12, + 13,13,12,13,13,12,13,12,13,13,13,13,12,12,12,12, + 12,12,12,12,13,12,12,13,12,13,12,12,13,12,13,12, + 12,13,12,13,12, +}; + +static const static_codebook _44p8_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p8_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p8_p4_1, + 0 +}; + +static const long _vq_quantlist__44p8_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p8_p5_0[] = { + 2, 6, 6, 9, 9, 5, 7, 8,10,11, 5, 8, 7,11,10, 8, + 10,11,12,13, 8,11,10,13,12, 6, 7, 8,10,11, 7, 8, + 10,10,12, 8, 9, 9,12,12,10,10,12,12,14,10,12,12, + 14,13, 6, 8, 7,11,10, 8, 9, 9,12,12, 7,10, 8,12, + 11,10,12,12,13,14,10,12,10,14,12, 9,10,11,11,13, + 10,10,11,11,13,11,12,12,13,14,12,12,13,11,15,13, + 14,14,15,14, 9,11,10,13,11,11,12,12,13,13,10,11, + 10,13,11,13,14,14,15,15,12,13,12,15,11, 6, 8, 9, + 11,12, 8, 9,11,12,13, 8,10,10,13,13,11,12,13,14, + 15,11,12,13,14,14, 9, 9,10,12,13,10,10,12,12,14, + 10,11,11,13,14,12,12,14,14,15,13,13,14,15,15, 9, + 10,10,13,13,10,11,11,13,14,10,11,10,14,13,13,13, + 14,15,15,12,14,13,15,14,12,12,13,13,14,12,13,14, + 13,15,13,14,14,15,15,14,14,15,14,16,15,15,15,16, + 16,12,13,13,14,14,13,14,14,15,15,12,14,13,15,14, + 14,15,15,16,16,14,15,14,16,14, 6, 9, 8,12,11, 8, + 10,10,13,13, 8,11, 9,13,12,11,12,12,14,14,11,13, + 12,15,14, 9,10,10,13,13,10,10,11,13,14,10,12,11, + 14,13,12,13,14,14,15,13,13,13,15,14, 9,10, 9,13, + 12,10,11,11,14,13,10,12,10,14,12,13,14,13,15,15, + 12,14,12,15,14,12,13,13,14,14,13,13,13,14,15,13, + 14,14,15,15,14,14,15,14,16,14,15,15,16,16,12,13, + 12,14,13,13,14,14,15,15,12,14,13,15,13,15,15,15, + 16,16,14,15,14,16,14,11,12,12,13,14,12,13,14,14, + 16,12,13,13,15,15,14,14,16,15,17,14,15,15,16,16, + 12,13,14,14,15,13,13,15,15,16,14,14,14,15,16,15, + 15,16,16,17,15,15,16,16,17,13,13,13,15,15,14,14, + 15,15,16,13,14,14,15,16,15,15,16,16,17,15,16,15, + 17,16,14,15,15,16,16,15,15,16,16,17,15,16,16,17, + 17,16,16,17,16,18,16,17,17,17,17,15,15,15,16,16, + 15,16,16,17,17,15,16,16,17,16,16,17,17,18,18,16, + 17,16,17,16,11,12,12,15,13,13,13,13,15,15,12,14, + 13,16,14,14,15,15,16,16,14,15,14,17,15,13,13,13, + 15,14,13,14,14,16,15,14,14,14,16,15,15,15,16,16, + 17,15,16,15,17,16,12,14,13,15,14,14,14,14,16,15, + 13,14,13,16,15,15,16,16,17,16,15,16,15,17,16,15, + 15,15,16,16,15,15,16,16,17,15,16,16,17,17,16,16, + 17,17,17,17,17,17,18,17,14,15,15,16,16,15,16,16, + 17,16,15,16,15,17,16,17,17,17,18,17,16,17,16,18, + 16, 6, 9, 9,12,12, 8,10,10,12,13, 8,10,10,13,12, + 10,12,12,14,15,11,13,12,15,14, 8, 9,10,12,13, 9, + 10,11,13,14,10,11,11,14,13,12,12,13,14,15,12,13, + 13,15,15, 8,10,10,13,13,10,11,11,13,14,10,12,10, + 14,13,12,13,13,15,15,12,14,13,15,14,11,12,12,13, + 14,12,12,13,13,15,12,13,13,15,15,14,13,15,14,16, + 14,15,15,16,16,12,13,13,14,14,13,13,14,15,14,12, + 14,13,15,14,14,15,15,16,15,14,15,14,16,14, 7, 9, + 10,12,12, 9,10,11,13,14, 9,11,10,13,13,11,12,13, + 14,15,12,13,13,15,14, 9,10,11,12,13,10,10,12,13, + 14,11,11,12,14,14,12,12,14,14,15,13,13,14,15,15, + 9,11,11,13,13,11,12,12,14,14,10,12,10,14,13,13, + 14,14,15,15,13,14,13,16,14,12,12,13,14,15,13,13, + 14,14,16,13,14,14,15,15,14,14,15,14,17,14,15,15, + 16,16,12,13,13,15,14,13,14,14,15,15,13,14,13,16, + 14,15,15,15,16,16,14,15,14,16,14, 7,10, 9,13,12, + 10,11,12,12,14,10,12,11,14,12,12,13,13,14,15,12, + 14,13,15,14, 9,11,10,13,13,10,11,12,13,14,12,13, + 12,15,13,13,13,14,13,15,13,14,14,16,15,10,11,11, + 13,13,12,12,13,14,14,11,12,11,14,13,14,14,14,15, + 16,13,14,13,16,13,12,13,13,14,14,12,13,13,14,15, + 14,14,14,15,15,14,13,15,13,16,15,15,15,17,16,13, + 13,13,14,14,14,14,14,15,15,12,13,13,15,14,15,16, + 16,16,16,14,15,14,16,13,11,12,13,14,15,12,13,14, + 15,16,13,14,14,15,15,14,14,15,15,17,14,15,15,16, + 16,13,13,14,14,15,13,13,15,14,16,14,14,15,15,16, + 15,14,16,15,17,15,16,16,16,17,13,14,14,15,15,14, + 14,15,16,16,13,15,14,16,16,15,16,16,17,17,15,16, + 15,17,16,14,15,15,15,17,15,15,16,15,17,15,16,16, + 16,17,16,16,17,16,18,17,17,17,17,18,15,15,15,17, + 16,15,16,16,17,17,15,16,16,17,16,16,17,17,18,18, + 16,17,16,18,17,11,13,12,15,14,13,13,14,15,15,13, + 14,13,16,14,15,15,15,16,16,15,16,15,17,16,13,14, + 13,15,14,13,13,14,15,15,14,15,14,16,15,15,15,16, + 16,16,15,16,15,18,16,13,14,14,15,15,14,15,15,15, + 16,13,15,13,16,15,15,16,16,17,17,15,16,15,17,16, + 15,15,15,16,16,15,15,15,16,17,16,16,16,17,16,16, + 16,17,16,17,17,17,17,18,17,15,15,15,16,16,16,16, + 16,17,17,15,16,15,17,16,17,17,17,18,18,16,17,16, + 17,15, 6, 9, 9,12,12, 8,10,10,12,13, 8,10,10,13, + 12,11,12,13,14,15,10,12,12,14,14, 9,10,10,13,13, + 10,10,12,13,14,10,11,11,14,13,12,13,14,14,15,12, + 13,13,15,15, 8,10, 9,13,12,10,11,11,13,14, 9,11, + 10,14,13,12,13,13,15,15,12,13,12,15,14,12,13,13, + 14,14,12,13,13,14,15,13,14,14,14,15,14,14,15,14, + 16,14,15,15,16,16,11,12,12,14,13,13,13,13,15,15, + 12,13,12,15,13,14,15,15,16,16,14,15,14,16,14, 7, + 9,10,12,13,10,10,12,12,14,10,12,11,14,13,12,13, + 14,14,15,12,13,13,15,14,10,11,11,13,13,11,11,12, + 13,14,12,13,12,14,14,13,13,14,13,16,14,14,14,15, + 15, 9,10,11,13,14,12,12,13,13,15,10,12,10,14,13, + 13,14,14,15,16,13,14,13,15,13,13,14,13,14,15,12, + 13,13,14,15,14,14,14,15,15,14,13,15,13,16,15,16, + 16,16,16,12,13,13,14,14,14,14,14,15,15,12,13,13, + 15,14,15,15,16,16,16,14,15,13,16,13, 7,10, 9,12, + 12, 9,10,11,13,13, 9,11,10,14,13,12,13,13,14,15, + 11,13,12,15,14, 9,11,11,13,13,10,10,12,13,14,11, + 12,12,14,14,13,13,14,14,16,13,14,14,16,15, 9,11, + 10,13,12,11,12,11,14,14,10,12,10,14,13,13,14,13, + 15,15,12,14,12,16,14,12,13,13,14,15,13,13,14,14, + 16,13,14,14,15,15,14,14,15,14,16,15,15,15,16,16, + 12,13,12,15,14,13,14,14,15,15,12,14,13,16,14,14, + 15,15,16,16,14,15,14,17,14,11,12,13,14,15,13,13, + 14,14,16,13,14,13,15,15,15,15,16,16,17,15,15,15, + 16,16,13,14,13,15,15,13,13,15,15,16,14,15,15,16, + 16,15,15,16,15,17,16,16,16,17,17,13,13,14,14,15, + 14,14,15,15,16,13,14,13,15,15,15,16,16,16,17,15, + 16,15,16,16,15,15,15,16,16,15,15,16,16,17,16,16, + 16,17,17,16,16,17,16,18,17,17,17,18,18,15,15,15, + 16,16,16,16,16,17,17,15,15,15,16,16,17,17,17,17, + 18,16,16,16,17,15,11,13,12,15,14,13,13,14,15,15, + 12,14,13,16,14,14,15,15,16,16,14,15,14,16,15,13, + 14,14,15,15,13,14,14,16,16,14,15,14,16,16,15,15, + 16,17,17,15,16,16,17,17,13,14,13,15,14,14,14,14, + 16,15,13,15,13,16,14,15,16,15,17,16,15,16,14,17, + 15,14,16,15,16,17,15,16,16,16,17,15,16,16,17,17, + 16,16,17,17,18,16,17,17,18,17,14,15,15,17,15,15, + 16,16,17,16,15,16,15,17,15,16,17,17,18,17,16,17, + 16,18,15,10,12,12,14,14,12,13,13,15,15,12,13,13, + 15,15,13,14,14,15,16,14,15,14,16,16,12,13,13,15, + 15,12,13,14,15,15,13,14,14,15,15,14,14,15,16,17, + 14,15,15,17,16,12,13,13,15,15,13,14,14,15,16,13, + 14,14,16,15,14,15,15,16,17,14,15,15,17,16,13,14, + 14,15,16,14,14,15,15,16,14,15,15,16,16,15,15,16, + 16,17,15,16,16,17,17,14,15,15,16,16,15,15,15,16, + 16,15,15,15,16,16,16,17,16,17,17,16,16,16,18,16, + 11,12,12,14,14,12,13,14,15,15,12,13,13,15,15,13, + 14,15,16,16,14,15,15,16,16,12,13,13,15,15,13,13, + 14,15,16,13,14,14,15,16,14,14,15,16,17,15,15,15, + 16,17,12,13,13,15,15,13,14,14,15,16,13,14,14,16, + 15,15,15,15,16,17,15,16,15,17,16,14,14,15,15,16, + 14,14,15,15,17,15,15,16,16,17,15,15,16,15,18,16, + 16,16,17,17,14,15,15,16,16,15,16,16,17,17,15,15, + 15,17,16,16,17,16,17,17,16,16,16,18,16,11,12,12, + 14,14,13,13,14,15,15,13,14,13,15,15,14,15,15,16, + 16,14,15,15,16,16,12,13,13,15,15,13,13,14,15,15, + 14,14,14,16,15,15,15,15,15,16,15,16,15,17,16,12, + 13,13,15,15,14,14,15,15,16,13,14,13,16,15,15,15, + 16,16,17,15,16,15,17,15,14,15,14,16,16,14,15,15, + 16,16,15,16,15,17,16,15,15,16,15,17,16,17,16,17, + 17,14,15,15,16,16,15,16,16,16,17,14,15,15,16,16, + 16,17,17,17,18,16,16,16,17,16,12,13,13,15,15,13, + 13,14,15,16,13,14,14,16,15,14,15,15,16,17,14,15, + 15,17,16,13,14,14,15,16,14,14,15,15,17,14,15,15, + 16,16,15,14,16,15,17,15,16,16,17,17,13,14,14,16, + 16,14,15,15,16,16,14,15,14,16,16,15,16,16,17,17, + 15,16,15,17,16,15,15,16,15,17,15,15,16,15,17,15, + 16,16,16,17,16,15,17,15,18,17,17,17,17,17,15,15, + 15,17,17,16,16,16,17,17,15,16,15,17,17,16,17,17, + 18,18,16,17,15,18,15,11,12,12,15,15,13,13,15,14, + 16,13,14,13,16,14,15,15,16,16,17,15,16,15,17,15, + 12,14,13,16,14,13,13,14,14,16,14,15,14,16,15,15, + 15,16,15,17,16,16,16,17,16,12,13,14,15,16,15,15, + 15,15,16,13,15,13,16,14,16,16,16,17,17,15,16,15, + 17,15,15,16,15,16,15,14,14,15,16,16,16,16,16,17, + 16,15,15,16,15,17,17,17,17,18,17,15,15,15,16,16, + 16,16,16,16,17,14,15,15,17,16,17,17,17,17,18,15, + 16,15,18,14,10,12,12,14,14,12,13,13,15,15,12,13, + 13,15,15,14,14,15,15,16,13,15,14,16,16,12,13,13, + 15,15,13,14,14,15,16,13,14,14,15,15,14,15,15,16, + 17,14,15,15,17,16,12,13,13,15,15,13,14,14,15,15, + 12,14,13,15,15,14,15,15,16,17,14,15,14,17,15,14, + 15,15,16,16,14,15,15,16,17,15,15,15,17,16,16,16, + 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, + 16,16,14,15,14,16,16,15,16,16,17,17,15,16,15,17, + 16,11,12,12,14,15,13,13,14,14,15,13,14,13,15,15, + 14,15,15,16,16,14,15,15,16,16,12,14,13,15,15,13, + 13,14,15,16,14,15,14,16,15,15,15,16,15,17,15,16, + 16,17,16,12,13,13,15,15,14,14,15,15,16,13,14,13, + 16,15,15,15,16,16,17,15,15,15,16,16,14,15,15,16, + 16,14,15,15,16,16,15,16,16,17,17,16,16,16,16,17, + 16,17,17,18,17,14,14,15,15,16,15,15,16,16,17,14, + 15,15,16,16,16,16,16,17,17,15,16,15,17,15,11,12, + 12,14,14,12,13,14,15,15,12,13,13,15,15,14,15,15, + 16,16,13,15,14,16,16,12,13,13,15,15,13,14,14,15, + 16,13,14,14,16,16,15,15,15,16,17,15,15,15,17,16, + 12,13,13,15,15,13,14,14,16,15,13,14,13,16,15,15, + 16,15,17,17,14,15,14,17,16,14,15,15,16,16,15,15, + 16,16,17,15,16,16,17,17,16,16,16,16,18,16,17,16, + 18,17,14,15,14,16,15,15,15,15,17,16,14,15,14,17, + 15,16,17,16,17,17,15,16,15,17,15,11,12,12,15,15, + 13,13,15,14,16,13,15,13,16,14,15,15,16,15,17,15, + 16,15,17,16,12,14,13,15,15,13,13,15,15,16,15,15, + 15,16,15,15,15,16,15,17,16,16,16,17,16,12,13,14, + 15,16,14,14,15,15,16,13,14,13,16,14,16,16,16,16, + 17,15,16,15,17,15,15,16,15,16,16,14,15,15,16,16, + 16,16,16,17,16,15,15,16,15,17,17,17,17,18,17,15, + 15,15,15,16,16,16,16,16,17,14,15,14,16,15,17,17, + 17,17,18,15,16,15,17,15,12,13,13,15,15,13,14,14, + 15,16,13,14,14,16,15,14,15,15,16,17,14,15,15,17, + 16,13,14,14,16,15,13,14,15,16,16,14,15,15,16,16, + 15,15,16,16,17,15,16,16,17,17,13,14,13,16,15,14, + 15,15,16,16,13,15,14,16,15,15,16,16,17,17,15,16, + 14,17,15,15,15,16,17,17,15,15,16,16,17,16,16,16, + 17,17,16,15,17,16,18,17,17,17,18,18,15,15,15,17, + 14,16,16,16,17,16,15,16,15,17,15,16,17,17,18,17, + 16,17,15,18,15, +}; + +static const static_codebook _44p8_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p8_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p8_p5_0, + 0 +}; + +static const long _vq_quantlist__44p8_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p8_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p8_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p8_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p8_p5_1, + 0 +}; + +static const long _vq_quantlist__44p8_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p6_0[] = { + 2, 6, 6, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 7, 9, 7, + 9, 9, 6, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, + 10, 8, 9, 9, 8, 9,10, 9, 9,10,10,10,10, 8, 9, 9, + 10,10,11, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, + 9, 9, 9,10,10,10,11,10, 8,10, 9,10,11,10, 9,11, + 9, 6, 8, 8, 7, 9, 9, 7, 9, 9, 7, 9, 9, 8, 9,10, + 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, 9, + 9,10, 9,10,10, 9, 9,10,10, 9,11,10,11,11, 9,10, + 10,10,11,11,10,11,10, 6, 9, 8, 9, 9,10, 9,10, 9, + 8,10,10, 9, 9,10,10,11,11, 9,10,10,10,11,11, 9, + 11, 9, 6, 8, 8, 7, 9, 9, 7, 9, 9, 8, 9, 9, 9, 9, + 10, 9,10,10, 7, 9, 9, 9,10,10, 8,10, 9, 6, 8, 9, + 9, 9,10, 9,10, 9, 9,10,10, 9, 9,11,10,11,11, 8, + 9,10,10,11,11, 9,10, 9, 7, 9, 9, 9,10,10, 9,10, + 9, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, + 10,11, 9, +}; + +static const static_codebook _44p8_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p8_p6_0, + 0 +}; + +static const long _vq_quantlist__44p8_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p6_1[] = { + 4, 7, 7, 7, 7, 8, 7, 8, 7, 7, 7, 8, 7, 8, 8, 8, + 8, 8, 7, 8, 7, 8, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, + 8, 9, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, + 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 8, 8, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, + 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, + 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, 8, 9, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, + 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, + 8, 9, 8, +}; + +static const static_codebook _44p8_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p8_p6_1, + 0 +}; + +static const long _vq_quantlist__44p8_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p8_p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p8_p7_0 = { + 5, 243, + (long *)_vq_lengthlist__44p8_p7_0, + 1, -512202240, 1635281408, 2, 0, + (long *)_vq_quantlist__44p8_p7_0, + 0 +}; + +static const long _vq_quantlist__44p8_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p8_p7_1[] = { + 1, 7, 7,12,12, 5,11,12,12,12, 5,12,11,12,12,12, + 12,12,12,12,12,13,13,13,13, 7,11,11,13,13,13,12, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13, 7,13,10,13,13,13,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13, 7,13,12, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13, 8,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13, 8,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,10,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13, 8,13,12,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,11,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13, +}; + +static const static_codebook _44p8_p7_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p8_p7_1, + 1, -514619392, 1630767104, 3, 0, + (long *)_vq_quantlist__44p8_p7_1, + 0 +}; + +static const long _vq_quantlist__44p8_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p8_p7_2[] = { + 1, 3, 2, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44p8_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p8_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p8_p7_2, + 0 +}; + +static const long _vq_quantlist__44p8_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p8_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p8_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p8_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p8_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p8_short[] = { + 3, 9,15,17,20,21,22,23, 5, 5, 7, 9,11,13,17,20, + 9, 5, 5, 6, 8,10,15,18,11, 7, 5, 4, 6, 9,13,17, + 14, 9, 7, 5, 6, 7,10,14,17,10, 8, 6, 6, 4, 5, 8, + 20,14,13,10, 8, 4, 3, 4,23,17,16,14,12, 6, 4, 4, +}; + +static const static_codebook _huff_book__44p8_short = { + 2, 64, + (long *)_huff_lengthlist__44p8_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p9_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44p9_l0_0[] = { + 2, 5, 5, 7, 6, 8, 8, 9, 9,10,10,11,11, 4, 5, 5, + 6, 7, 8, 8, 9, 9,10,10,11,10, 4, 5, 5, 7, 6, 8, + 8, 9, 9,10,10,10,10, 6, 6, 7, 6, 7, 8, 8, 9, 9, + 10, 9,11, 9, 6, 6, 6, 7, 6, 8, 8, 9, 9, 9,10, 9, + 11, 7, 7, 8, 8, 8, 8, 9, 9, 9,10, 9,11, 9, 7, 8, + 8, 8, 8, 9, 8, 9, 9, 9,10, 9,11, 8, 9, 9, 9, 9, + 9, 9,10,10,11,10,12,10, 8, 9, 9, 9, 9, 9, 9,10, + 9,10,11,11,12, 9,10,10,10,10,10,10,10,11,11,11, + 11,12, 9,10,10,10,10,11,10,11,10,11,11,12,11,11, + 11,11,11,11,11,11,11,12,11,12,11,12,11,11,11,11, + 11,11,11,12,11,12,11,12,11, +}; + +static const static_codebook _44p9_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44p9_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44p9_l0_0, + 0 +}; + +static const long _vq_quantlist__44p9_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_l0_1[] = { + 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p9_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44p9_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p9_l0_1, + 0 +}; + +static const long _vq_quantlist__44p9_l1_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_l1_0[] = { + 1, 2, 3, 5, 9, 9, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44p9_l1_0 = { + 2, 25, + (long *)_vq_lengthlist__44p9_l1_0, + 1, -514619392, 1630767104, 3, 0, + (long *)_vq_quantlist__44p9_l1_0, + 0 +}; + +static const long _huff_lengthlist__44p9_lfe[] = { + 1, 1, +}; + +static const static_codebook _huff_book__44p9_lfe = { + 1, 2, + (long *)_huff_lengthlist__44p9_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44p9_long[] = { + 3, 3, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _huff_book__44p9_long = { + 1, 8, + (long *)_huff_lengthlist__44p9_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44p9_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p9_p1_0[] = { + 1, 5, 5, 4, 8, 8, 4, 8, 8, 5, 7, 8, 8, 9,10, 8, + 10,10, 5, 8, 7, 8,10,10, 8,10, 9, 7, 9, 9, 9,11, + 11, 9,11,11, 9,11,11,11,12,13,11,13,13, 9,11,11, + 11,13,13,11,13,13, 7, 9, 9, 9,11,11, 9,11,11, 9, + 11,11,11,13,13,11,13,13, 9,11,11,11,13,13,11,13, + 12, 5, 9, 9, 9,11,11, 9,11,11, 9,11,11,11,12,13, + 11,13,13, 9,11,11,11,13,13,11,13,13, 9,11,12,11, + 13,13,12,13,13,11,12,13,13,14,15,13,14,14,12,13, + 13,13,15,15,13,15,14, 8,10,10,11,13,13,12,14,13, + 11,12,12,13,14,15,13,15,15,11,12,12,13,15,15,13, + 15,14, 5, 9, 9, 9,11,11, 9,11,11, 9,11,11,11,13, + 13,11,13,13, 9,11,10,11,13,13,11,13,12, 8,10,10, + 11,13,13,12,13,13,11,12,12,13,14,15,14,15,15,10, + 12,12,13,14,15,13,15,14, 9,12,11,12,13,13,11,13, + 13,12,13,13,13,15,15,13,14,15,11,13,12,13,15,14, + 13,15,14, +}; + +static const static_codebook _44p9_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44p9_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p9_p1_0, + 0 +}; + +static const long _vq_quantlist__44p9_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_p2_0[] = { + 4, 6, 6, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 6, + 8, 8,11,11, 6, 8, 8,11,11, 6, 7, 7, 9, 9, 7, 8, + 9,10,11, 7, 9, 9,11,10, 8, 9,10,12,12, 8,10,10, + 12,12, 6, 7, 7, 9, 9, 7, 9, 9,10,10, 7, 9, 8,11, + 10, 8,10,10,12,12, 8,10, 9,12,12, 8, 9, 9,11,11, + 9,10,10,12,12, 9,11,11,12,13,11,12,12,13,14,11, + 12,12,14,14, 8, 9, 9,11,11, 9,11,10,13,12, 9,10, + 10,13,12,11,12,12,14,14,11,12,12,14,13, 7, 8, 9, + 10,10, 8,10,10,11,11, 8,10,10,11,11,10,11,11,13, + 13,10,11,11,13,13, 8, 9,10,10,11,10,11,11,12,13, + 10,11,11,12,12,11,11,12,13,14,11,12,12,14,14, 8, + 10,10,11,11,10,11,11,12,13,10,11,11,12,12,11,12, + 12,14,14,11,12,12,14,14,10,11,11,12,13,11,12,12, + 13,14,12,13,13,14,14,13,13,14,14,16,13,14,14,15, + 16,10,11,11,13,13,12,12,12,14,14,11,12,12,14,14, + 13,14,14,15,16,13,14,14,16,15, 7, 8, 8,10,10, 8, + 10,10,11,11, 8,10,10,12,11,10,11,11,13,13,10,11, + 11,13,13, 8,10,10,11,11,10,11,11,12,12,10,11,11, + 12,12,11,12,12,14,14,11,12,12,14,14, 8,10, 9,11, + 10,10,11,11,13,12,10,11,10,13,12,11,12,12,14,14, + 11,12,11,14,13,10,11,11,13,13,11,12,12,14,14,12, + 12,12,14,14,13,14,14,15,16,13,14,14,15,15,10,11, + 11,13,12,12,12,12,14,14,11,12,12,14,13,13,14,14, + 16,15,13,14,13,16,14,10,11,11,13,13,12,12,13,14, + 15,12,13,13,14,15,13,14,15,15,16,13,14,14,16,16, + 11,12,13,14,14,13,13,14,15,16,13,14,14,15,16,14, + 15,15,16,17,14,15,16,17,17,11,12,12,14,14,13,14, + 14,15,16,13,14,14,15,15,14,15,15,16,18,14,15,15, + 17,16,13,14,15,15,16,15,15,16,16,18,15,15,15,17, + 17,16,16,17,17,18,16,16,16,18,18,14,14,14,16,16, + 15,15,15,16,17,15,15,15,16,17,16,17,17,18,18,16, + 16,17,18,17,10,11,11,14,13,12,13,13,15,14,11,13, + 13,15,14,13,15,15,16,16,13,14,14,16,16,11,12,12, + 14,14,13,13,13,15,15,13,14,13,15,15,15,15,15,17, + 16,14,15,15,17,16,11,13,12,14,14,13,14,13,15,15, + 13,14,13,15,15,14,15,15,17,17,14,15,15,17,16,14, + 14,14,16,16,14,15,15,17,17,15,15,16,17,16,17,16, + 17,18,18,16,17,17,18,18,13,14,14,16,15,15,15,15, + 17,17,14,16,15,16,16,17,17,17,18,18,16,17,16,20, + 19, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,12,11, + 10,11,11,13,13,10,11,11,13,13, 8, 9,10,11,11,10, + 11,11,12,12,10,11,11,13,12,11,12,12,14,14,11,12, + 12,14,14, 9,10,10,11,11,10,11,11,12,12,10,11,11, + 13,12,11,12,12,14,14,11,12,12,14,14,10,10,11,12, + 13,11,12,12,14,14,11,12,12,14,14,13,14,14,15,16, + 13,14,14,15,16,10,11,11,13,13,12,12,12,14,14,12, + 13,12,14,14,13,14,14,16,16,13,14,14,15,15, 9,10, + 10,11,12,10,11,11,12,13,10,11,11,13,12,11,12,12, + 14,14,11,12,12,14,14,10,10,11,12,13,11,12,12,13, + 14,11,12,12,13,14,12,13,14,14,15,12,13,13,15,15, + 10,11,11,13,13,11,12,12,13,14,11,12,12,14,13,12, + 13,13,15,15,12,13,13,15,15,12,11,13,12,14,13,13, + 14,14,15,13,13,14,14,15,14,15,15,16,17,14,15,15, + 16,17,12,13,12,14,14,13,14,14,15,15,13,14,14,15, + 15,14,15,15,16,17,14,15,15,16,17, 8, 9, 9,11,11, + 10,11,11,12,13,10,11,11,13,12,12,13,13,14,15,11, + 13,12,15,14, 9,11,10,12,12,11,12,12,13,14,11,12, + 12,14,13,13,13,14,15,15,13,14,13,15,15, 9,11,11, + 12,12,11,12,12,14,14,11,12,12,14,13,13,14,14,15, + 16,13,14,13,15,14,11,12,12,14,13,12,13,13,14,15, + 13,14,14,16,15,15,15,15,15,16,15,16,15,17,17,11, + 12,12,14,14,13,14,14,15,15,12,13,13,15,14,15,15, + 15,17,17,14,15,15,17,15,11,12,12,14,14,12,13,13, + 15,15,12,13,13,15,15,14,15,15,17,17,14,15,15,16, + 16,12,13,13,14,15,13,14,14,16,16,14,14,14,15,16, + 15,16,16,17,17,15,16,16,17,17,12,13,13,15,15,14, + 14,14,16,16,14,14,15,16,16,15,16,16,17,17,15,16, + 16,17,17,14,15,15,15,16,15,15,16,16,18,15,16,16, + 17,17,17,17,17,18,18,16,17,17,19,18,14,15,15,16, + 17,15,16,16,17,17,15,16,16,18,17,16,17,17,19,18, + 17,17,17,19,18,10,12,12,14,14,13,13,14,15,15,12, + 14,13,16,15,15,15,15,17,17,14,15,15,17,16,12,13, + 13,15,14,13,14,14,16,16,14,14,15,17,16,15,16,16, + 17,17,15,16,16,18,17,12,13,13,15,14,14,15,15,16, + 16,13,15,14,16,15,16,17,16,19,17,15,16,16,17,17, + 14,15,15,17,15,15,16,15,17,17,16,17,16,18,17,17, + 17,18,18,18,17,17,18,19,18,14,15,15,16,16,15,16, + 16,17,18,15,16,16,18,16,17,18,18,19,19,17,18,17, + 18,19, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,12, + 11,10,11,11,13,13, 9,11,11,13,13, 9,10,10,11,11, + 10,11,11,12,12,10,11,11,12,12,11,12,12,14,14,11, + 12,12,14,14, 8,10, 9,11,11,10,11,11,12,12,10,11, + 11,12,12,11,12,12,14,14,11,12,12,14,14,10,11,11, + 13,13,11,12,13,14,14,12,12,12,14,14,13,14,14,15, + 16,13,14,14,16,16,10,11,10,13,12,11,12,12,14,14, + 11,12,12,14,14,13,14,14,15,16,13,14,14,16,15, 8, + 9, 9,11,11,10,11,11,12,13,10,11,11,13,12,12,13, + 13,14,15,12,13,13,15,14,10,11,11,12,12,11,11,12, + 13,14,11,12,12,14,14,13,13,14,15,16,13,14,14,15, + 15, 9,10,11,12,12,11,12,12,13,14,11,12,12,14,13, + 13,14,14,15,16,12,14,13,15,15,11,12,12,14,14,12, + 13,13,14,15,13,14,14,16,15,14,15,15,15,17,15,15, + 16,16,17,11,12,12,13,14,13,14,14,15,15,12,13,13, + 15,14,15,16,15,16,17,14,16,15,17,15, 9,10,10,12, + 11,10,11,11,13,13,10,11,11,13,12,11,12,12,14,14, + 11,12,12,14,14,10,11,11,12,13,11,12,12,13,14,11, + 12,12,14,14,12,13,13,15,15,12,13,13,15,15,10,11, + 10,13,12,11,12,12,13,13,11,12,12,14,13,12,13,13, + 15,15,12,13,13,15,14,12,13,12,14,14,13,14,14,15, + 15,13,14,14,15,15,14,15,15,16,16,14,15,15,16,16, + 11,13,11,14,12,13,13,13,15,14,12,14,13,15,14,15, + 15,15,17,16,14,15,14,17,15,10,12,12,14,14,13,13, + 14,15,16,12,14,13,15,15,14,15,16,17,17,14,15,16, + 17,17,12,13,13,14,15,13,14,14,16,16,14,14,15,16, + 16,16,16,16,17,17,16,16,16,18,18,12,13,13,14,15, + 14,14,15,16,16,13,14,14,16,15,16,16,16,17,18,15, + 16,16,17,17,14,15,15,16,16,15,15,16,17,17,15,16, + 16,17,18,17,18,18,18,19,17,18,18,19,19,14,15,15, + 16,16,15,16,16,17,17,15,16,16,17,17,17,17,18,20, + 18,17,18,17,18,18,11,12,12,14,14,12,13,14,15,15, + 12,13,13,15,15,14,15,15,16,17,14,15,15,16,17,12, + 13,13,15,15,14,14,14,16,16,14,14,14,16,16,15,16, + 16,17,17,15,16,16,17,17,12,13,13,15,14,13,14,14, + 16,15,14,15,14,16,15,15,16,16,17,17,15,16,16,17, + 16,14,15,15,16,16,15,16,16,17,17,16,16,16,17,17, + 17,17,17,19,18,17,17,17,18,19,14,15,14,17,15,15, + 16,16,17,17,15,16,15,17,17,16,17,17,18,18,16,17, + 17,18,17, 6,11,11,13,13,11,12,12,14,14,11,12,12, + 14,14,13,14,14,16,16,13,14,14,16,16,11,12,12,14, + 14,12,13,13,15,15,12,13,13,15,15,14,15,15,16,17, + 14,15,15,17,18,11,12,12,14,14,12,13,13,15,15,12, + 13,13,15,15,14,15,15,17,17,14,15,15,16,16,13,14, + 14,15,16,14,15,15,16,17,14,15,15,17,16,15,16,17, + 18,17,16,16,16,18,17,14,14,15,16,16,14,15,15,18, + 16,14,15,15,17,16,16,17,17,18,18,16,17,16,18,17, + 11,12,12,14,14,12,13,13,15,15,12,13,13,15,15,14, + 15,15,17,17,14,15,15,16,16,12,13,13,15,15,13,14, + 14,15,16,13,14,14,16,16,15,16,16,17,17,15,15,16, + 17,17,12,13,13,15,15,14,14,14,16,16,13,14,14,16, + 16,15,16,16,17,17,15,16,16,17,17,14,14,15,15,16, + 15,15,16,16,17,15,15,16,16,17,16,17,17,17,18,16, + 17,17,18,18,14,15,15,16,16,15,16,16,17,17,15,16, + 16,17,17,17,17,17,18,19,17,17,17,18,18,10,12,12, + 14,14,12,13,14,15,16,13,14,13,15,15,14,15,15,17, + 17,14,15,16,17,17,12,13,13,15,15,13,14,14,15,15, + 14,15,14,16,16,15,16,16,17,18,15,17,16,18,17,12, + 13,13,15,15,14,14,14,16,16,13,14,14,16,15,15,16, + 16,17,18,15,16,16,17,17,14,14,14,16,16,15,15,16, + 17,17,15,16,16,17,17,17,17,17,18,20,17,17,17,19, + 19,14,15,15,16,16,15,17,16,18,18,15,16,15,17,16, + 17,18,19,19,19,17,17,17,18,17,13,14,14,16,16,14, + 15,15,17,17,14,15,15,16,17,15,17,17,18,18,16,16, + 17,18,17,14,15,15,16,17,15,16,16,17,17,15,16,16, + 17,17,16,17,17,18,18,17,17,17,18,19,14,15,15,16, + 17,15,16,16,17,17,15,16,16,17,17,16,17,17,18,18, + 17,17,17,19,19,16,16,16,16,18,16,17,17,17,18,17, + 17,17,17,19,18,18,18,19,19,18,18,18,19,20,16,16, + 17,18,18,16,18,17,18,18,17,17,17,20,19,18,18,19, + 21,20,18,20,18,18,19,10,12,12,14,14,14,14,15,15, + 17,14,15,14,17,15,16,16,17,18,18,16,18,17,19,18, + 12,14,13,16,15,14,14,15,15,17,15,16,16,18,17,16, + 17,18,17,19,17,19,18,20,19,12,13,13,15,15,15,16, + 17,17,18,14,16,14,17,16,17,18,18,19,19,17,17,17, + 18,18,15,15,15,17,16,15,16,16,17,17,17,19,17,18, + 18,18,18,18,18,21,19,20,19,20,19,15,15,16,16,17, + 17,17,18,20,20,15,16,16,18,17,18,19,19,19,20,18, + 19,18,19,17, 6,11,11,13,13,11,12,12,14,14,11,12, + 12,14,14,13,14,14,16,16,13,14,14,16,16,11,12,12, + 14,14,12,13,13,15,15,12,13,13,15,15,14,15,15,17, + 17,14,15,15,17,16,11,12,12,14,14,12,13,13,15,15, + 12,13,13,15,15,14,15,15,16,16,14,15,15,16,16,13, + 14,14,16,16,15,15,15,16,16,14,15,15,17,16,16,17, + 17,19,18,16,17,17,18,18,13,14,14,15,15,14,15,15, + 17,16,14,15,15,17,16,16,17,16,17,18,15,16,16,18, + 18,10,12,12,14,14,12,13,14,15,15,12,13,13,15,15, + 14,15,15,17,17,14,15,15,17,16,12,13,13,15,15,14, + 14,14,15,16,14,15,15,16,16,15,16,16,17,18,16,16, + 16,18,18,12,13,13,14,14,14,14,15,16,16,13,14,14, + 16,16,15,16,16,18,18,15,16,16,19,17,14,15,15,16, + 17,15,15,16,17,17,16,17,16,17,18,17,17,18,17,19, + 17,17,18,18,19,14,14,14,16,16,15,16,16,17,17,15, + 16,15,17,17,17,17,17,19,20,16,17,17,18,18,11,12, + 12,14,14,12,13,13,15,15,12,13,13,15,15,14,15,15, + 16,16,14,15,14,16,16,12,13,13,15,15,14,14,14,16, + 16,13,14,14,16,16,15,16,16,18,17,15,16,16,17,17, + 12,13,13,15,15,13,14,14,16,16,13,14,14,16,16,15, + 16,15,18,18,15,16,15,17,16,14,15,15,16,16,15,16, + 16,17,17,15,16,16,18,17,16,17,17,18,18,16,17,17, + 18,18,14,15,14,16,15,15,16,15,17,17,15,16,15,17, + 16,16,17,17,18,18,17,17,16,19,17,10,12,12,14,15, + 14,14,15,15,17,14,15,14,17,15,16,17,17,17,18,16, + 17,17,18,18,12,14,13,16,15,14,14,16,15,17,15,17, + 16,18,17,17,17,18,17,19,18,18,18,19,18,12,13,14, + 15,15,15,16,16,16,17,14,15,14,18,16,18,17,18,19, + 19,17,18,17,20,18,15,15,15,17,17,15,16,16,17,18, + 18,18,18,19,18,18,18,19,18,20,18,19,19,21,21,15, + 15,16,16,17,17,18,18,18,18,15,16,16,17,17,17,19, + 20,19,20,17,18,18,19,17,13,14,14,16,16,14,15,15, + 16,17,14,15,15,17,17,16,16,17,17,18,15,17,16,17, + 17,14,15,15,16,16,15,16,16,17,17,16,16,16,17,17, + 17,17,18,17,18,17,17,17,18,20,14,15,15,17,16,15, + 16,16,17,17,15,16,16,17,17,17,17,17,18,18,16,17, + 17,19,18,16,16,17,17,17,17,18,17,19,18,17,17,17, + 18,19,17,20,18,19,21,17,19,18,19,20,15,17,15,17, + 16,16,17,17,18,18,17,17,17,18,17,18,19,18,19,21, + 18,18,17,19,19, +}; + +static const static_codebook _44p9_p2_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p9_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p9_p2_0, + 0 +}; + +static const long _vq_quantlist__44p9_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p9_p3_0[] = { + 2, 5, 4, 4, 7, 7, 4, 7, 6, 5, 6, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 6, 7, 9, 9, 7, 9, 8, 6, 8, 8, 8,10, + 10, 8,10,10, 8, 9,10,10,11,12,10,12,12, 8,10,10, + 10,12,12,10,12,11, 6, 8, 8, 8,10,10, 8,10,10, 8, + 10,10,10,11,12,10,12,12, 8,10, 9,10,12,11,10,12, + 11, 5, 8, 8, 8,10,10, 8,10,10, 8, 9,10,10,11,11, + 10,11,11, 8,10,10,10,11,12,10,12,11, 8,10,10,10, + 11,11,10,11,11,10,11,11,11,12,13,11,12,13,10,11, + 11,11,13,13,11,13,13, 7, 9, 9,10,11,12,10,12,11, + 9,11,11,11,12,13,12,14,13, 9,11,11,12,13,14,11, + 13,12, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, + 12,10,12,12, 8,10, 9,10,12,11, 9,11,11, 7, 9, 9, + 10,11,12,10,12,11, 9,11,11,11,12,13,12,14,13, 9, + 11,11,12,13,14,11,13,12, 8,10,10,10,11,11,10,11, + 11,10,11,11,11,13,13,11,13,13,10,11,10,11,13,12, + 11,13,12, +}; + +static const static_codebook _44p9_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44p9_p3_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44p9_p3_0, + 0 +}; + +static const long _vq_quantlist__44p9_p3_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p9_p3_1[] = { + 4, 6, 6, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 7, 8, 7, + 7, 8, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, + 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, + 9, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, + 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, + 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 9, + 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, + 8, 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, + 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, + 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44p9_p3_1 = { + 5, 243, + (long *)_vq_lengthlist__44p9_p3_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44p9_p3_1, + 0 +}; + +static const long _vq_quantlist__44p9_p4_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p9_p4_0[] = { + 2, 5, 5, 4, 7, 7, 4, 7, 6, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, + 10, 8,10,10, 8, 9,10,10,11,12,10,11,12, 8,10,10, + 10,11,12,10,12,11, 6, 8, 7, 8,10,10, 8,10, 9, 8, + 10,10,10,11,12,10,12,12, 8,10, 9,10,12,11,10,12, + 11, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, + 10,11,11, 8,10,10,10,12,12,10,12,11, 7, 9, 9, 9, + 11,11, 9,11,11, 9,10,11,11,11,12,11,12,12, 9,11, + 11,11,12,12,11,12,12, 7, 9, 9,10,11,12,10,12,11, + 9,11,10,11,11,12,12,13,13, 9,11,11,12,13,13,11, + 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, + 12,10,12,12, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, + 10,11,12,10,12,11, 9,11,11,11,11,13,12,13,13, 9, + 10,11,12,13,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, + 11, 9,11,11,11,12,12,11,12,12, 9,11,10,11,12,12, + 10,12,11, +}; + +static const static_codebook _44p9_p4_0 = { + 5, 243, + (long *)_vq_lengthlist__44p9_p4_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44p9_p4_0, + 0 +}; + +static const long _vq_quantlist__44p9_p4_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_p4_1[] = { + 6, 8, 8,10, 9, 8, 9, 9,10,10, 8, 9, 9,10,10, 8, + 10,10,10,10, 8,10,10,10,10, 9, 9, 9,10,10, 9,10, + 10,10,11, 9,10,10,11,11,10,10,10,11,11,10,10,10, + 11,11, 9, 9, 9,10,10, 9,10,10,11,11, 9,10,10,11, + 10,10,10,10,11,11,10,10,10,11,11,10,10,10,10,11, + 10,10,11,11,11,10,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,10,10,10,11,10,10,11,11,11,11,10,11, + 10,11,11,11,11,11,11,11,10,11,11,11,11, 9,10,10, + 10,11,10,10,11,11,11,10,11,11,11,11,10,11,11,11, + 11,10,11,11,11,11,10,10,11,11,11,11,11,11,11,11, + 11,11,11,11,12,11,11,12,12,12,11,11,11,12,12,10, + 11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11, + 11,12,12,11,11,11,12,12,11,11,11,11,11,11,12,12, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,11,11,11,11,11,11,12,12,12,12,11,12,11,12,12, + 11,12,12,12,12,12,12,12,12,12, 9,10,10,11,10,10, + 11,11,11,11,10,11,11,11,11,10,11,11,11,11,10,11, + 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, + 12,12,11,11,12,12,12,11,11,11,12,12,10,11,10,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, + 11,11,11,12,12,11,11,11,11,11,11,12,12,12,12,11, + 12,12,12,12,11,12,12,12,12,12,12,12,12,12,11,11, + 11,11,11,11,12,12,12,12,11,12,11,12,12,12,12,12, + 12,12,11,12,12,12,12,11,11,11,11,11,11,12,12,12, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,13,12,12,12,13,13,11,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, + 13,13,12,12,12,12,12,12,12,12,12,13,12,12,12,13, + 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,12, + 12,12,12,13,13,12,12,12,13,13,12,13,13,13,13,12, + 13,13,13,13,11,11,11,11,11,11,12,12,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,12,12,12,13,13,11,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,13,13,12,12,12,13,13,12, + 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,13, + 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, + 13,13,12,12,12,13,12,12,13,13,13,13,12,13,13,13, + 13, 7,10,10,11,11,10,10,11,11,11,10,11,11,11,11, + 10,11,11,11,11,10,11,11,11,11,10,10,10,11,11,10, + 11,11,11,11,11,11,11,11,12,11,11,11,12,12,11,11, + 11,12,12,10,11,11,11,11,11,11,11,12,11,11,11,11, + 12,11,11,11,11,12,12,11,11,11,12,12,11,11,11,11, + 11,11,11,11,12,12,11,11,12,12,12,11,12,12,12,12, + 11,12,12,12,12,11,11,11,11,11,11,12,12,12,12,11, + 11,12,12,12,11,12,12,12,12,11,12,12,12,12,10,11, + 11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11, + 12,12,11,11,11,12,12,11,11,11,11,11,11,11,12,12, + 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, + 11,11,11,11,11,11,12,11,12,12,11,11,11,12,12,11, + 12,12,12,12,11,12,12,12,12,11,11,11,11,12,11,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,11,11,11,12,12,11,12,12,12,12,11,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,10,11,10,11,11, + 11,11,11,12,12,11,11,11,12,12,11,12,12,12,12,11, + 12,12,12,12,10,11,11,12,11,11,11,12,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,11,11,11, + 12,11,11,12,12,12,12,11,12,11,12,12,12,12,12,12, + 12,12,12,12,12,12,11,12,11,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,13,12,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,12,12,12,13,12,11,11,11,12,12,12,12,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 13,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,13,13,12,12,12,13,13,11,12,12,12,12,12, + 12,12,12,13,12,12,12,12,12,12,12,13,13,13,12,13, + 12,13,13,12,12,12,12,12,12,12,12,13,13,12,12,12, + 13,13,12,13,13,13,13,12,13,13,13,13,12,12,12,12, + 12,12,12,12,13,13,12,13,12,13,13,12,13,13,13,13, + 12,13,13,13,13,11,11,11,12,12,12,12,12,12,12,11, + 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, + 12,12,12,12,12,12,12,12,12,12,12,13,13,12,13,12, + 13,13,12,13,13,13,13,11,12,12,12,12,12,12,12,13, + 13,12,12,12,13,12,12,13,13,13,13,12,13,13,13,13, + 12,12,12,12,12,12,12,13,13,13,12,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,13, + 13,13,13,12,12,12,13,13,13,13,13,13,13,13,13,13, + 13,13, 7,10,10,11,11,10,11,11,11,11,10,11,11,11, + 11,10,11,11,11,11,10,11,11,11,11,10,11,11,11,11, + 11,11,11,11,11,11,11,11,12,11,11,11,12,12,12,11, + 11,11,12,12,10,10,10,11,11,11,11,11,12,11,10,11, + 11,11,11,11,11,11,12,12,11,11,11,12,12,11,11,11, + 11,11,11,11,12,12,12,11,12,11,12,12,11,12,12,12, + 12,11,12,12,12,12,11,11,11,11,11,11,11,11,12,12, + 11,12,11,12,12,11,12,12,12,12,11,12,12,12,12,10, + 10,10,11,11,11,11,11,12,12,11,11,11,12,12,11,12, + 12,12,12,11,12,12,12,12,11,11,11,11,11,11,11,12, + 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,11,11,11,11,11,11,12,12,12,12,11,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, + 12,13,12,11,11,11,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,10,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, + 11,11,11,12,12,11,11,11,11,11,11,11,12,12,12,11, + 12,11,12,12,11,12,12,12,12,11,12,12,12,12,11,11, + 11,11,11,11,11,11,12,12,11,11,11,12,12,11,12,12, + 12,12,11,12,12,12,12,11,11,11,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 11,11,11,12,11,11,12,12,12,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, + 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, + 13,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, + 13,12,13,13,13,13,12,13,13,13,13,11,12,12,12,12, + 12,12,12,12,13,12,12,12,12,12,12,13,13,13,13,12, + 13,13,13,13,12,12,12,12,12,12,12,13,13,13,12,13, + 12,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, + 12,12,12,13,13,13,13,12,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 12,13,13,12,12,12,13,13,11,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,13,12,13,12,13, + 13,12,12,12,12,12,12,12,12,13,13,12,12,12,13,13, + 13,13,13,13,13,12,13,13,13,13,12,12,12,12,12,12, + 13,12,13,13,12,13,12,13,12,12,13,13,13,13,12,13, + 13,13,13, 8,11,11,12,12,11,12,12,12,12,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,12, + 12,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13, + 12,12,12,13,13,11,11,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, + 12,12,12,12,12,12,12,13,12,12,12,12,12,12,12,13, + 13,13,12,12,13,13,13,11,12,12,12,12,12,12,12,13, + 12,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, + 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, + 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,12,13,13,12,13,12,13,13,12,12,12,12,12, + 12,12,12,12,13,12,12,12,13,13,12,13,13,13,13,12, + 13,13,13,13,12,12,12,12,12,12,12,12,13,13,12,12, + 12,13,13,12,13,13,13,13,12,13,13,13,13,11,11,11, + 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,13, + 12,12,12,12,12,13,11,12,12,12,12,12,12,12,12,13, + 12,12,12,12,13,12,13,13,13,13,12,13,13,13,13,11, + 12,12,12,12,12,12,12,12,13,12,12,12,13,12,12,13, + 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, + 13,13,12,12,13,13,13,12,13,13,13,13,12,13,13,13, + 13,12,12,12,12,12,12,13,13,13,13,12,13,12,13,13, + 12,13,13,13,13,13,13,13,13,13,11,11,11,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,13,13,13,12,13,13,13,13,11,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13, + 12,13,12,13,13,12,12,12,12,12,12,12,12,13,13,12, + 12,12,13,13,12,13,13,13,13,12,13,13,13,13,12,12, + 12,12,12,12,13,12,13,13,12,12,12,13,13,13,13,13, + 13,13,12,13,13,13,13,11,11,11,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,12,12,12,13,12, + 11,12,12,12,12,12,12,12,12,12,12,12,12,13,13,12, + 12,13,13,13,12,13,13,13,13,11,12,12,12,12,12,12, + 12,12,13,12,12,12,13,12,12,13,13,13,13,12,13,13, + 13,13,12,12,12,12,12,12,12,12,13,13,12,12,12,13, + 13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12, + 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13, 8,11,11,11,11,11,12,12,12,12,11,12, + 12,12,12,12,12,12,12,12,11,12,12,12,12,11,11,11, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 13,12,12,12,13,13,11,11,11,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,13,13,12,12,12,13,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,13,13,12,13, + 13,13,13,12,13,13,13,13,11,12,12,12,12,12,12,12, + 12,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, + 13,11,11,11,12,12,12,12,12,12,12,11,12,12,12,12, + 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,12, + 12,12,12,12,12,12,12,13,13,12,12,13,13,13,12,13, + 13,13,13,11,12,12,12,12,12,12,12,13,13,12,12,12, + 12,12,12,13,13,13,13,12,13,13,13,13,12,12,12,12, + 12,12,12,13,13,13,12,12,13,13,13,13,13,13,13,13, + 12,13,13,13,13,12,12,12,12,12,12,13,12,13,13,12, + 12,12,13,13,13,13,13,13,13,12,13,13,13,13,11,11, + 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,13,12,13,13,12,12,12,13,13, + 11,12,12,12,12,12,12,12,12,13,12,12,12,12,12,12, + 12,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, + 12,13,12,12,12,12,13,13,12,13,13,13,13,12,13,13, + 13,13,12,12,12,12,12,12,12,12,13,13,12,12,12,13, + 12,12,13,13,13,13,12,13,13,13,13,11,11,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,13,13,11,12,12,12,12,12,12,12,12,13,12,12, + 12,12,12,12,13,13,13,13,12,13,13,13,13,11,12,12, + 12,12,12,12,12,12,13,12,12,12,12,12,12,13,13,13, + 13,12,13,13,13,13,12,12,12,12,12,12,12,12,13,13, + 12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,12, + 12,12,12,12,12,13,13,13,13,12,12,12,13,12,13,13, + 13,13,13,12,13,13,13,13,11,11,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 13,11,12,12,12,12,12,12,12,12,12,12,12,12,13,12, + 12,12,12,13,13,12,13,13,13,13,11,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,13,13,13,13,12,13, + 12,13,13,12,12,12,12,12,12,12,13,13,13,12,13,12, + 13,13,12,13,13,13,13,13,13,13,13,13,12,12,12,12, + 12,12,12,12,12,13,12,12,12,13,13,13,13,13,13,13, + 12,13,13,13,13, +}; + +static const static_codebook _44p9_p4_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p9_p4_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44p9_p4_1, + 0 +}; + +static const long _vq_quantlist__44p9_p5_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_p5_0[] = { + 4, 6, 6, 9, 9, 6, 7, 8,10,11, 6, 8, 7,10,10, 8, + 10,10,12,12, 8,10,10,12,12, 6, 7, 8,10,10, 7, 8, + 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, + 13,13, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 9, 8,11, + 10,10,11,11,13,13,10,11,10,13,12, 9,10,10,11,12, + 10,10,11,12,13,10,11,11,12,13,12,12,13,12,14,12, + 13,13,14,14, 9,10,10,12,11,10,11,11,13,12,10,11, + 10,13,12,12,13,13,14,14,12,13,12,14,12, 7, 8, 8, + 10,11, 8, 9,10,11,12, 8, 9, 9,11,12,10,11,12,13, + 14,10,11,11,13,13, 8, 9,10,11,12, 9,10,11,12,13, + 10,10,11,12,12,11,12,12,13,14,11,12,12,14,14, 8, + 9, 9,11,12,10,10,11,12,13, 9,10,10,12,12,11,12, + 12,14,14,11,12,12,14,13,11,11,12,12,13,11,12,12, + 13,14,12,12,13,14,14,13,13,14,14,16,13,14,14,15, + 15,11,12,11,13,13,12,12,12,14,14,11,12,12,14,13, + 13,14,14,15,15,13,14,13,15,14, 7, 8, 8,11,10, 8, + 10, 9,12,11, 8,10, 9,12,11,10,11,11,13,13,10,12, + 11,14,13, 8, 9, 9,12,11, 9,10,10,12,12,10,11,10, + 13,12,11,12,12,13,14,11,12,12,14,14, 8,10, 9,12, + 11,10,11,10,12,12, 9,11,10,13,11,11,12,12,14,14, + 11,12,12,14,13,11,11,12,13,13,11,12,12,13,14,12, + 12,12,14,14,13,13,14,14,15,13,14,14,15,15,11,12, + 11,13,12,12,12,12,14,14,11,12,12,14,13,13,14,14, + 15,15,13,14,13,15,14,10,11,11,12,13,11,12,12,13, + 14,11,12,12,13,14,13,13,14,14,16,13,14,14,15,15, + 11,12,12,12,14,12,12,13,13,15,12,13,13,13,15,14, + 14,15,15,16,14,14,15,15,16,11,12,12,13,14,12,13, + 13,14,15,12,13,13,14,14,14,14,15,15,16,14,14,14, + 15,15,13,14,14,14,15,14,14,15,15,16,14,15,15,15, + 16,15,15,16,16,18,16,16,16,17,17,13,14,14,15,15, + 14,14,15,16,16,14,14,14,16,15,16,16,16,17,17,15, + 16,16,17,16,10,11,11,13,12,11,12,12,14,13,11,12, + 12,14,13,13,14,14,15,15,13,14,13,16,14,11,12,12, + 14,13,12,13,13,14,14,12,13,13,15,14,14,14,14,15, + 15,14,15,14,16,15,11,12,12,14,12,12,13,13,15,14, + 12,13,12,15,13,14,15,14,16,15,14,15,14,16,15,13, + 14,14,15,15,14,14,14,15,16,14,15,14,16,16,15,16, + 16,16,17,16,16,16,17,17,13,14,14,15,14,14,15,15, + 16,15,14,15,14,16,15,16,16,16,17,17,15,16,15,18, + 16, 6, 8, 8,11,11, 8, 9,10,11,12, 8,10, 9,12,12, + 10,11,11,13,13,10,12,11,14,13, 8, 9, 9,11,12, 9, + 10,10,12,12, 9,10,10,12,12,11,11,12,13,14,11,12, + 12,14,14, 8,10, 9,12,11,10,11,11,12,12, 9,11,10, + 13,12,11,12,12,14,14,11,12,12,14,13,10,11,11,13, + 13,11,12,12,13,14,11,12,12,14,14,13,13,14,13,15, + 13,14,14,15,15,11,12,11,13,13,12,12,12,14,14,11, + 12,12,14,13,13,14,14,15,15,13,14,13,15,14, 8, 9, + 9,11,11, 9,10,10,12,12, 9,10,10,12,12,11,12,12, + 13,14,11,12,12,14,14, 9, 9,10,11,12,10,10,11,12, + 13,10,10,11,12,13,12,12,13,13,15,12,12,13,14,14, + 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, + 13,13,14,15,12,13,12,14,14,11,11,12,12,14,12,12, + 13,13,14,12,12,13,13,14,13,13,14,14,16,14,14,14, + 15,15,11,12,12,14,13,12,13,13,14,14,12,13,13,15, + 14,14,14,14,16,16,13,14,14,16,14, 7, 9, 9,12,11, + 9,10,10,12,12, 9,11,10,13,12,11,12,12,13,14,11, + 13,12,14,13, 9,10,10,12,12,10,10,11,12,13,10,12, + 11,13,13,12,12,13,13,14,12,13,13,15,14, 9,10,10, + 12,12,11,11,11,13,13,10,12,10,13,12,12,13,13,14, + 15,12,13,12,15,13,11,12,12,14,13,12,12,13,13,14, + 12,13,13,15,14,13,13,14,13,16,14,15,14,16,15,12, + 12,12,14,14,13,13,13,14,14,12,13,12,14,13,14,15, + 15,16,16,13,14,13,16,13,10,11,12,13,14,11,12,13, + 13,15,12,12,13,14,14,13,14,14,15,16,13,14,14,16, + 15,12,12,13,12,14,12,12,13,13,15,13,13,13,13,15, + 14,14,15,14,16,14,15,15,15,16,12,13,12,14,14,13, + 13,13,15,15,12,13,13,15,15,14,15,15,16,16,14,15, + 15,16,16,13,14,14,13,16,14,14,15,14,16,14,14,15, + 14,16,15,15,16,15,18,16,16,16,16,17,14,14,14,16, + 15,14,15,15,16,16,14,15,15,16,16,16,16,16,17,17, + 15,16,16,17,16,10,12,11,14,13,12,13,13,14,14,12, + 13,12,15,14,14,14,14,15,15,14,15,14,16,15,12,13, + 12,14,13,12,13,13,15,14,13,14,13,15,14,14,15,15, + 16,16,14,15,15,17,15,12,13,12,14,14,13,14,14,15, + 15,13,14,13,15,14,15,15,15,16,16,14,15,15,17,15, + 14,14,14,16,15,14,15,15,16,16,14,15,15,16,15,16, + 16,16,16,17,16,17,16,18,17,14,14,14,16,15,15,15, + 15,16,16,14,15,14,16,15,16,16,17,17,17,15,16,15, + 17,16, 6, 8, 8,11,11, 8, 9,10,12,12, 8,10, 9,12, + 11,10,11,12,13,13,10,11,11,13,13, 8, 9,10,11,12, + 9,10,11,12,13,10,11,11,12,12,11,12,12,13,14,11, + 12,12,14,14, 8, 9, 9,12,11, 9,10,10,12,12, 9,10, + 10,12,12,11,12,12,14,14,11,12,11,14,13,11,11,12, + 13,13,11,12,12,13,14,12,12,12,14,14,13,13,14,14, + 15,13,14,14,15,15,10,11,11,13,13,11,12,12,14,14, + 11,12,12,14,13,13,14,14,15,15,13,14,13,15,13, 7, + 9, 9,11,12, 9,10,11,12,13, 9,10,10,12,12,11,12, + 13,13,14,11,12,12,14,14, 9,10,10,12,12,10,10,11, + 12,13,11,12,11,13,13,12,12,13,13,15,12,13,13,15, + 14, 9,10,10,12,12,10,11,12,13,13,10,11,10,13,12, + 12,13,13,14,15,12,13,12,14,13,12,12,12,14,14,12, + 12,13,13,14,13,13,13,15,14,14,13,14,13,16,14,15, + 15,16,16,11,12,12,13,14,12,13,13,14,15,12,13,12, + 14,13,14,14,15,15,16,13,14,13,15,13, 8, 9, 9,11, + 11, 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14, + 11,12,11,14,13, 9,10,10,12,12,10,11,11,13,13,10, + 11,11,13,13,12,12,13,14,15,12,13,13,15,14, 9,10, + 9,12,11,10,11,10,13,12,10,11,10,13,12,12,13,12, + 14,14,12,13,12,15,13,11,12,12,13,14,12,13,13,14, + 14,12,13,13,14,14,14,14,14,14,16,14,14,14,16,15, + 11,12,11,14,12,12,13,12,15,13,12,13,12,15,13,14, + 14,14,16,15,13,14,13,16,14,10,11,12,13,14,12,12, + 13,13,15,12,13,13,14,14,14,14,15,15,16,14,14,14, + 15,16,12,12,13,14,14,12,13,14,14,15,13,14,14,15, + 15,14,15,15,15,17,15,15,15,16,16,12,12,13,13,14, + 13,13,14,14,15,12,13,13,14,15,15,15,15,15,17,14, + 15,15,15,15,14,14,14,16,16,14,15,15,15,16,15,15, + 15,16,16,16,15,16,16,18,16,16,17,17,17,14,14,14, + 15,16,15,15,15,16,17,14,15,14,16,16,16,16,17,17, + 18,16,16,15,17,16,10,12,11,14,13,12,12,12,14,14, + 11,13,12,14,13,13,14,14,15,15,13,14,13,16,15,12, + 12,13,14,14,12,13,13,15,15,13,13,13,15,15,14,15, + 15,16,16,14,15,15,17,16,12,13,12,14,12,13,13,13, + 15,13,12,13,12,15,13,14,15,15,16,15,14,15,14,16, + 14,14,14,14,16,16,14,15,15,16,16,14,15,15,16,16, + 15,16,16,16,17,16,17,16,18,17,13,14,14,16,13,14, + 15,15,16,14,14,15,14,16,14,16,16,16,17,16,15,16, + 15,18,15, 9,11,11,13,13,11,12,12,14,14,11,12,12, + 14,14,13,14,14,15,15,13,14,14,15,15,11,12,12,14, + 14,11,12,13,14,15,12,13,13,15,14,13,14,14,15,16, + 13,14,14,16,16,11,12,12,14,14,12,13,13,15,15,12, + 13,13,15,14,14,14,14,16,16,14,15,14,16,15,12,13, + 13,14,15,12,13,14,15,16,13,14,14,16,16,14,14,15, + 16,17,15,15,15,17,17,13,14,14,15,15,14,15,14,16, + 16,14,15,14,16,15,15,16,16,17,17,15,16,15,17,16, + 10,12,12,13,14,11,12,13,14,14,12,13,12,14,14,13, + 14,14,15,16,13,14,14,16,15,11,12,12,14,14,12,12, + 13,14,15,12,13,13,15,15,13,13,15,15,17,14,14,15, + 16,16,12,13,12,14,14,12,13,13,15,15,12,13,13,15, + 14,14,15,15,16,16,14,15,14,16,16,13,12,14,13,16, + 13,13,15,14,16,14,13,15,15,16,14,14,16,15,17,15, + 15,16,16,17,13,14,14,16,15,14,15,15,16,16,14,15, + 14,16,15,16,16,16,17,17,15,16,16,18,16,10,12,12, + 14,14,12,12,13,14,14,12,13,12,15,14,13,14,14,15, + 16,14,15,14,16,15,11,12,12,14,14,12,13,13,14,15, + 13,14,13,15,15,14,14,15,15,16,14,15,15,17,16,12, + 13,13,14,14,13,13,14,15,15,12,14,13,15,15,14,15, + 15,16,16,14,15,15,17,15,13,14,13,15,15,13,14,14, + 15,16,14,15,14,17,16,15,15,15,15,17,16,16,16,18, + 17,14,14,14,16,16,15,15,15,16,16,14,15,14,16,16, + 16,16,17,17,17,16,16,16,17,16,11,12,13,14,14,12, + 13,13,15,15,12,13,13,15,15,14,15,15,16,16,14,15, + 15,17,16,12,13,13,14,15,13,13,14,14,16,13,14,14, + 15,16,15,14,16,15,17,15,15,16,16,17,12,13,13,15, + 15,13,14,14,16,16,13,14,14,16,15,15,15,16,17,17, + 15,16,15,17,16,14,14,15,13,16,15,14,16,14,17,15, + 15,16,14,17,16,15,17,15,18,16,16,17,16,18,14,15, + 15,17,16,15,16,16,17,17,15,16,15,17,16,16,17,17, + 18,18,16,17,15,18,16,11,12,12,14,14,13,13,14,14, + 15,13,14,13,16,14,15,15,15,16,16,15,16,15,17,16, + 12,13,13,15,14,13,13,14,15,15,14,15,14,16,15,15, + 15,16,15,16,16,16,16,18,16,12,13,13,15,15,14,14, + 15,15,16,13,14,13,16,15,16,16,16,17,17,15,16,15, + 17,15,14,15,14,16,15,14,15,15,16,16,15,16,15,17, + 16,16,15,16,15,17,17,18,17,18,17,15,15,15,16,16, + 16,16,16,17,17,14,15,15,17,16,17,17,18,18,18,16, + 17,15,18,15, 9,11,11,13,13,11,12,12,14,14,11,12, + 12,14,14,13,14,14,15,16,13,14,14,15,15,11,12,12, + 14,14,12,13,13,14,15,12,13,13,14,14,14,14,15,15, + 16,14,14,14,16,16,11,12,12,14,14,12,13,13,14,15, + 11,13,12,14,14,13,14,14,16,16,13,14,14,16,15,13, + 14,14,15,15,14,14,15,15,16,14,15,14,16,16,15,15, + 16,16,17,15,16,16,17,17,12,13,13,15,15,13,14,14, + 16,15,12,14,13,16,15,15,16,15,17,17,14,15,15,17, + 15,10,12,12,14,14,12,12,13,14,15,12,13,12,14,14, + 14,14,15,15,16,13,14,14,16,16,12,13,13,14,14,13, + 13,14,14,15,13,14,13,15,15,14,15,15,15,17,14,15, + 15,16,16,11,12,12,14,14,13,13,14,15,15,12,13,13, + 15,14,14,15,15,16,17,14,15,14,16,15,14,14,14,16, + 16,14,15,15,16,16,15,15,15,16,16,15,16,16,16,18, + 16,17,16,18,17,13,13,14,15,15,14,14,15,16,16,13, + 14,14,16,15,16,16,17,17,17,15,15,15,17,15,10,12, + 12,14,13,12,12,13,14,14,11,13,12,14,14,13,14,14, + 16,16,13,14,14,16,15,12,12,13,14,14,12,13,13,14, + 15,13,13,13,15,15,14,14,15,16,16,14,15,15,16,16, + 11,12,12,14,14,12,13,13,15,15,12,13,12,15,14,14, + 15,14,16,16,13,15,13,16,15,13,14,14,15,16,14,15, + 15,15,17,14,15,15,16,16,16,15,16,16,17,16,16,16, + 17,17,13,14,12,16,13,14,15,13,16,15,13,15,13,16, + 14,15,16,15,17,16,15,16,14,17,15,11,12,12,14,15, + 13,13,14,14,16,13,14,13,15,14,15,15,16,16,17,15, + 15,15,16,16,12,13,13,15,15,13,13,14,15,16,14,15, + 14,16,15,15,15,16,15,17,16,16,16,17,17,12,13,13, + 14,15,14,14,15,15,16,13,14,13,15,15,16,16,16,17, + 17,15,16,15,16,15,15,15,15,16,16,14,15,15,16,17, + 16,16,16,17,17,16,15,17,15,18,17,18,17,18,18,14, + 14,15,15,17,15,15,16,16,17,14,15,15,16,16,17,17, + 17,17,18,16,16,15,17,15,11,12,12,14,14,12,13,13, + 15,15,12,13,13,15,15,14,15,15,16,16,14,15,14,17, + 16,13,13,13,15,15,13,14,14,15,16,13,14,14,16,16, + 15,15,16,16,17,15,16,16,17,17,12,13,13,15,14,13, + 14,14,16,15,13,14,13,16,14,15,16,16,17,16,15,16, + 14,17,15,14,15,15,16,17,15,15,16,16,17,15,16,16, + 17,17,16,15,17,16,18,16,17,17,18,18,14,15,14,16, + 13,15,16,15,17,14,15,16,14,17,14,16,17,16,18,16, + 16,17,15,18,15, +}; + +static const static_codebook _44p9_p5_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p9_p5_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44p9_p5_0, + 0 +}; + +static const long _vq_quantlist__44p9_p5_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44p9_p5_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44p9_p5_1 = { + 1, 7, + (long *)_vq_lengthlist__44p9_p5_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44p9_p5_1, + 0 +}; + +static const long _vq_quantlist__44p9_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p9_p6_0[] = { + 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, + 10, 8, 9,10, 8, 9,10,10,10,12,10,11,11, 8,10,10, + 10,11,12,10,11,10, 5, 8, 7, 8,10,10, 8,10, 9, 8, + 10,10,10,10,11,10,12,11, 8,10, 9,10,11,11,10,12, + 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9,10, 9,10,11, + 9,11,11, 8,10, 9,10,11,11, 9,11,10, 7, 9, 9, 9, + 10,11, 9,11,11, 9, 9,11,10,10,13,11,12,12, 9,11, + 11,11,12,13,11,13,11, 7, 9, 9, 9,10,11, 9,11,10, + 9,11,10,10,10,12,11,13,12, 9,11,11,11,12,12,10, + 12,10, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10, 9,10, + 11,10,11,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, + 9,10,11, 9,11,10, 9,11,11,10,10,12,11,12,12, 9, + 10,11,11,12,13,10,12,10, 7, 9, 9, 9,11,11, 9,11, + 10, 9,11,11,11,11,13,11,13,12, 9,11, 9,11,12,12, + 10,13,10, +}; + +static const static_codebook _44p9_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44p9_p6_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44p9_p6_0, + 0 +}; + +static const long _vq_quantlist__44p9_p6_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44p9_p6_1[] = { + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, + 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, + 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, + 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, + 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, + 8, 9, 8, +}; + +static const static_codebook _44p9_p6_1 = { + 5, 243, + (long *)_vq_lengthlist__44p9_p6_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44p9_p6_1, + 0 +}; + +static const long _vq_quantlist__44p9_p7_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_p7_0[] = { + 1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13, +}; + +static const static_codebook _44p9_p7_0 = { + 5, 3125, + (long *)_vq_lengthlist__44p9_p7_0, + 1, -510105088, 1635281408, 3, 0, + (long *)_vq_quantlist__44p9_p7_0, + 0 +}; + +static const long _vq_quantlist__44p9_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44p9_p7_1[] = { + 1, 4, 4,16,16, 4, 9,11,15,16, 4,12, 8,16,16,12, + 16,16,16,16,13,16,16,16,16, 5, 8,10,16,16, 9, 9, + 14,15,16,12,14,14,16,16,16,16,16,16,16,16,16,16, + 16,16, 5,11, 8,16,15,12,14,16,16,16, 9,15, 9,16, + 16,16,16,16,16,16,16,16,16,16,16,15,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16, 6,11,11, + 16,16,12,13,16,16,16,12,16,14,16,16,16,16,16,16, + 16,16,16,16,16,16,11,15,15,16,16,14,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, + 15,16,16,16,16,16,16,16,16,14,16,15,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16, 5,11,11,16,16,12, + 15,16,16,16,12,16,14,16,16,16,16,16,16,16,16,16, + 16,16,16,12,15,15,16,16,14,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,11,15,15,16, + 16,16,16,16,16,16,15,16,14,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16, 6,11,12,16,16,11,15,16,16,16,13,16,14,16,16, + 16,16,16,16,16,16,16,16,16,16,11,16,14,16,16,14, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,12,14,14,16,16,16,16,16,16,16,15,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,15,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16, 8,13, + 15,16,16,15,15,16,16,16,14,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,14,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16, 7,12,12,16,16, + 13,12,16,16,16,14,16,14,16,16,16,16,16,16,16,16, + 16,16,16,16,13,16,16,16,16,14,14,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,12,14,16, + 16,16,16,16,16,16,16,14,16,14,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16, 6,11,11,16,16,13,15,16,16,16,11,15,14,16, + 16,16,16,16,16,16,14,16,16,16,16,11,16,16,16,16, + 16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,11,16,14,16,16,14,16,16,16,16,13,15, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 7, + 11,11,16,16,13,13,16,16,16,13,16,13,16,16,16,16, + 16,16,16,16,16,16,16,16,12,16,15,16,16,14,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,12,14,16,16,16,16,16,16,16,16,14,16,13,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16, 8,13,14,16, + 16,15,16,16,16,16,14,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,16, + 15,16,16,16,16,16,16,16,16,16,15,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16, +}; + +static const static_codebook _44p9_p7_1 = { + 5, 3125, + (long *)_vq_lengthlist__44p9_p7_1, + 1, -514619392, 1630767104, 3, 0, + (long *)_vq_quantlist__44p9_p7_1, + 0 +}; + +static const long _vq_quantlist__44p9_p7_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p9_p7_2[] = { + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9,10,10,10,11,11,11, + 12,12,12,13,13,13,13,13,13, +}; + +static const static_codebook _44p9_p7_2 = { + 1, 25, + (long *)_vq_lengthlist__44p9_p7_2, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44p9_p7_2, + 0 +}; + +static const long _vq_quantlist__44p9_p7_3[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44p9_p7_3[] = { + 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44p9_p7_3 = { + 1, 25, + (long *)_vq_lengthlist__44p9_p7_3, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44p9_p7_3, + 0 +}; + +static const long _huff_lengthlist__44p9_short[] = { + 3, 3, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _huff_book__44p9_short = { + 1, 8, + (long *)_huff_lengthlist__44p9_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44pn1_l0_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44pn1_l0_0[] = { + 1, 3, 3, 8, 8,10,10,10,10,10,10,10,10, 5, 7, 5, + 9, 8,10,10,10,10,11,10,11,10, 5, 5, 7, 8, 9,10, + 10,11,10,10,11,10,11,10,10,10,11,11,11,11,11,11, + 11,10,11,11,10,10,10,10,11,11,11,11,11,10,11,11, + 11,11,11,11,11,11,12,11,10,11,11,11,11,11,11,11, + 11,11,11,11,11,10,10,11,11,12,11,11,11,11,11,11, + 12,11,11,11,10,11,11,11,11,11,11,11,11,10,11,11, + 10,11,10,11,11,11,11,11,11,11,11,11,11,12,11,11, + 12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,11, + 10,11,11,11,11,11,11,11,12,11,13,11,11,11,11,11, + 11,11,11,11,11,11,12,11,13, +}; + +static const static_codebook _44pn1_l0_0 = { + 2, 169, + (long *)_vq_lengthlist__44pn1_l0_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44pn1_l0_0, + 0 +}; + +static const long _vq_quantlist__44pn1_l0_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44pn1_l0_1[] = { + 1, 4, 4, 7, 7, 4, 5, 6, 7, 7, 4, 6, 5, 7, 7, 7, + 6, 7, 6, 7, 7, 7, 6, 7, 6, +}; + +static const static_codebook _44pn1_l0_1 = { + 2, 25, + (long *)_vq_lengthlist__44pn1_l0_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44pn1_l0_1, + 0 +}; + +static const long _vq_quantlist__44pn1_l1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_l1_0[] = { + 1, 4, 4, 4, 4, 4, 4, 4, 4, +}; + +static const static_codebook _44pn1_l1_0 = { + 2, 9, + (long *)_vq_lengthlist__44pn1_l1_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44pn1_l1_0, + 0 +}; + +static const long _huff_lengthlist__44pn1_lfe[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book__44pn1_lfe = { + 2, 4, + (long *)_huff_lengthlist__44pn1_lfe, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44pn1_long[] = { + 2, 3, 6, 7, 9,13,17, 3, 2, 5, 7, 9,13,17, 6, 5, + 5, 6, 9,12,16, 7, 7, 6, 6, 7,10,13,10,10, 9, 7, + 6,10,13,13,13,12,10,10,11,15,17,17,17,14,14,15, + 17, +}; + +static const static_codebook _huff_book__44pn1_long = { + 2, 49, + (long *)_huff_lengthlist__44pn1_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44pn1_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p1_0[] = { + 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44pn1_p1_0 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44pn1_p1_0, + 0 +}; + +static const long _vq_quantlist__44pn1_p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p2_0[] = { + 1, 5, 5, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, + 8, 8, 0, 9, 9, 0,13,13, 0, 8, 8, 0, 6, 6, 0,11, + 11, 0,12,12, 0,12,12, 0,14,14, 0,11,12, 0,12,12, + 0,15,15, 0,12,12, 0, 5, 5, 0, 5, 5, 0, 6, 6, 0, + 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,11,11, 0, 6, + 6, 0, 7, 7, 0,11,11, 0,12,11, 0,11,11, 0,14,14, + 0,10,10, 0,12,12, 0,15,15, 0,12,12, 0, 6, 6, 0, + 12,12, 0,12,12, 0,12,12, 0,14,14, 0,11,11, 0,12, + 12, 0,16,16, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0,12,12, 0,12,12, 0,12,12, 0,15, + 15, 0,12,12, 0,11,11, 0,16,16, 0,11,11, 0, 6, 6, + 0,12,12, 0,12,12, 0,13,13, 0,15,15, 0,12,12, 0, + 13,13, 0,15,15, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44pn1_p2_0 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p2_0, + 1, -533200896, 1614282752, 2, 0, + (long *)_vq_quantlist__44pn1_p2_0, + 0 +}; + +static const long _vq_quantlist__44pn1_p2_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p2_1[] = { + 1, 3, 3, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0, + 10,10, 0,10,10, 0,10,10, 0,10,10, 0, 7, 7, 0, 7, + 7, 0, 6, 6, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, + 0, 7, 7, 0, 8, 8, 0, 7, 7, 0, 9, 9, 0, 8, 9, 0, + 10,10, 0, 9, 9, 0,10,10, 0,10,11, 0, 9, 9, 0,10, + 10, 0, 9, 9, 0,11,11, 0,12,12, 0,12,12, 0,11,11, + 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0, 8, 8, 0, + 12,12, 0,12,12, 0,13,13, 0,13,13, 0,13,13, 0,13, + 13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0,11,11, 0,12,12, 0,13,13, 0,12, + 12, 0,13,13, 0,13,13, 0,12,12, 0,12,12, 0, 9, 9, + 0,12,12, 0,13,13, 0,14,14, 0,13,13, 0,14,14, 0, + 14,14, 0,13,13, 0,14,14, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +static const static_codebook _44pn1_p2_1 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p2_1, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44pn1_p2_1, + 0 +}; + +static const long _vq_quantlist__44pn1_p3_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p3_0[] = { + 1, 6, 6, 6, 8, 8, 6, 8, 8, 7, 9, 9,10,11,11, 8, + 8, 8, 7, 9, 9,11,12,12, 9, 9, 9, 6, 7, 7,10,11, + 11,10,11,11,10,11,11,13,13,13,12,12,12,10,12,11, + 14,14,14,12,12,12, 6, 5, 5, 9, 6, 6, 9, 6, 6, 9, + 7, 7,12,10,10,11, 7, 6, 9, 7, 7,13,11,11,12, 7, + 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, + 13, 9, 9,12,11,11,15,14,14,15,11,11, 8, 7, 7,12, + 11,11,12,11,11,11,11,11,14,13,14,14,12,12,12,11, + 11,16,15,15,14,12,12, 0,10,10, 0,12,12, 0,12,12, + 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, + 11,11, 7, 8, 8,13,11,11,12,10,10,12,11,11,15,13, + 13,14,11,11,12,10,10,16,14,14,15,10,10, 9, 7, 7, + 13,11,12,13,12,11,12,11,11,15,14,14,14,12,12,13, + 12,12,16,15,15,15,12,12, 0,11,11, 0,12,12, 0,12, + 13, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,16,15, + 0,12,12, +}; + +static const static_codebook _44pn1_p3_0 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p3_0, + 1, -531365888, 1616117760, 2, 0, + (long *)_vq_quantlist__44pn1_p3_0, + 0 +}; + +static const long _vq_quantlist__44pn1_p3_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44pn1_p3_1[] = { + 2, 3, 4, 9, 9,10,12,12,12,11,10,12,12,13,12,11, + 13,12,11,11,11,12,12,12,11,11,13,13,13,13,11,12, + 12,14,14,12,13,13,13,13,11,13,13,13,13,11,13,13, + 13,13,11,13,13,13,13,11,12,12,14,14,12,13,13,12, + 12,11,13,13,13,13,11,13,13,12,12,11,13,13,13,13, + 12,12,13,14,14,12,13,13,12,12,11,13,13,13,13,11, + 13,13,12,12,11,13,13,13,13,12,13,13,14,14,12,13, + 13,12,12,11,13,13,13,13,11,13,13,12,12,11,10,10, + 10,10,12,10,10,11,11,12, 9, 9,11,11,13,11,11,10, + 10,13,10,10,10,10,13,11,11,12,12,13,10,10,12,12, + 14,12,11,12,12,13,11,11,11,12,13,12,12,12,12,13, + 11,11,12,12,13,10,10,12,12,14,11,11,12,12,13,11, + 11,12,12,13,11,11,12,12,14,12,12,12,12,14,10,10, + 11,11,14,12,11,11,11,13,11,11,11,11,13,12,12,11, + 11,14,12,12,12,11,14,10,10,11,11,14,12,11,11,11, + 13,11,11,11,11,13,12,12,11,11,11,11,11,10,10,12, + 10,11, 9, 9,12,12,12,11,11,13,12,12, 9, 9,13,13, + 13,10,10,13,13,13,12,12,13,13,13,14,14,13,12,12, + 11,11,14,13,13,12,12,14,13,13,11,11,13,13,13,12, + 11,13,13,13,14,14,13,12,12,10,10,14,13,13,11,11, + 13,13,13,10,10,13,13,13,11,11,14,13,13,14,14,14, + 12,12,10,10,13,13,13,11,11,13,13,13,10,10,13,13, + 13,11,11,14,13,13,14,14,14,13,13,10,10,13,13,13, + 11,11,13,13,13,10,10,14,12,12, 8, 8,14,12,12, 9, + 9,14,11,11, 9, 9,14,12,12, 8, 8,14,12,12, 7, 7, + 15,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, + 12,13, 9, 9,15,13,13,10,10,15,13,13,10,10,15,12, + 12,10,10,15,13,13,10,10,15,13,13, 9, 9,15,13,13, + 10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, 9, + 9,14,13,12, 9, 9,14,13,13, 9, 9,15,13,13,10,10, + 15,12,12,10,10,15,13,13, 9, 9,15,13,13, 9, 9,14, + 13,13, 9, 9,14,12,12, 8, 8,13,13,13, 8, 8,14,14, + 13, 9, 9,14,14,13, 7, 7,14,14,14, 8, 8,14,14,14, + 10,10,15,14,14,12,12,14,14,14, 9, 9,15,14,14,10, + 10,14,14,14, 9, 9,14,14,14,10, 9,15,14,14,12,12, + 14,14,14, 9, 9,15,14,14,10,10,14,14,14, 9, 9,15, + 14,15, 9, 9,15,14,14,11,11,14,14,14, 8, 8,14,14, + 14, 9, 9,14,14,14, 8, 8,14,15,14,10,10,15,14,14, + 11,11,14,14,14, 8, 8,15,14,14, 9, 9,14,14,14, 8, + 8,12,12,12,13,13,16,16,15,12,12,17,16,16,13,13, + 17,16,16,11,11,17,16,16,12,12,17,16,17,13,13,17, + 16,16,14,14,17,17,16,12,12,18,16,16,13,13,17,16, + 17,12,12,17,17,17,13,13,18,16,16,14,14,18,17,17, + 12,12,17,17,17,13,13,18,17,17,13,13,17,17,17,13, + 13,17,16,16,14,14,17,17,17,12,12,16,16,17,13,13, + 17,17,16,12,12,18,17,17,13,13,18,16,16,14,14,18, + 17,17,12,12,19,16,17,13,13,17,16,17,12,12,13,14, + 14,10,10,16,14,14,13,13,17,15,15,14,14,17,14,14, + 13,13,16,14,14,13,13,17,16,15,14,14,16,16,16,15, + 15,17,15,15,14,14,17,15,15,14,14,17,15,15,14,14, + 17,16,15,14,14,16,16,16,15,15,18,15,15,13,13,16, + 16,15,14,14,17,15,15,14,13,17,15,15,14,14,16,16, + 16,15,15,18,15,14,13,13,17,15,15,14,14,18,14,15, + 13,13,18,15,15,14,14,16,16,16,15,15,17,15,15,13, + 13,17,15,15,14,14,17,15,15,13,13,13,11,11,10,10, + 16,14,14,13,13,17,14,15,14,14,17,15,15,12,12,17, + 14,14,12,12,16,15,15,14,14,16,14,14,14,14,16,15, + 15,14,14,16,15,15,14,14,16,15,15,14,14,16,15,15, + 14,14,16,15,14,15,15,17,15,15,14,14,17,15,15,14, + 14,17,15,15,14,14,17,15,16,14,14,16,14,14,14,14, + 17,15,15,13,13,17,15,15,13,13,16,15,15,13,13,17, + 16,16,14,14,17,15,14,15,14,17,15,15,13,13,17,15, + 15,13,13,17,15,15,13,13,14,14,14, 9, 9,14,14,14, + 18,19,14,15,15,19,18,14,14,14,19,19,15,14,14,19, + 19,15,16,16,19,19,15,16,16,19,19,15,15,15,19,19, + 15,16,16,19,20,15,15,15,19,19,15,15,15,19,19,15, + 16,16,20,20,15,15,15,18,19,15,15,16,19,20,15,15, + 15,19,18,15,15,15,18,18,15,16,16,21,20,15,15,15, + 19,19,15,15,15,19,19,15,15,14,19,20,15,15,15,20, + 19,15,16,16,19,20,15,15,15,19,19,15,15,15,20,21, + 15,14,15,19,19,14,12,12, 9, 9,14,14,15,21,19,14, + 14,14,18,19,14,15,15,19,20,14,14,14,19,19,15,15, + 15,19,20,15,15,14,21,19,15,15,15,20,19,15,14,15, + 20,21,15,15,15,18,18,15,15,15,20,21,16,14,14,18, + 19,15,15,15,20,19,15,15,15,18,21,15,15,15,19,19, + 15,15,15,19,20,16,15,14,20,19,15,16,15,19,19,15, + 15,15,19, 0,14,15,15,19,19,15,15,15,19,19,15,15, + 14,20,19,15,15,15,20,19,15,15,15,19,19,15,15,15, + 20,19,12,12,12,13,13,16,15,16,11,11,16,16,16,12, + 12,17,16,16,11,11,17,16,16,12,11,17,17,17,13,13, + 18,16,16,14,14,18,18,17,13,13,17,16,16,13,13,17, + 17,17,13,13,17,16,17,12,12,17,15,16,13,13,17,16, + 17,12,12,17,16,16,13,12,17,16,16,12,12,18,17,17, + 13,13,18,16,16,13,14,18,17,17,12,12,17,16,16,12, + 12,17,17,17,12,12,18,17,17,13,13,17,16,16,14,14, + 17,17,17,12,12,17,16,16,12,12,18,17,17,12,12,13, + 14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,16,14, + 14,13,13,16,14,14,13,13,17,16,15,15,15,16,15,16, + 16,15,17,15,15,14,14,17,15,15,15,15,17,15,15,14, + 14,17,15,15,14,14,16,15,16,16,16,17,15,15,14,14, + 16,15,15,14,15,16,15,15,14,14,17,15,15,15,15,16, + 16,16,15,16,18,15,14,13,14,17,15,15,14,14,17,14, + 14,13,13,17,15,15,14,14,16,15,15,15,15,17,15,14, + 14,14,17,15,15,14,14,17,14,14,13,13,13,11,11,11, + 11,16,14,14,12,12,16,14,14,13,13,16,14,14,12,12, + 16,14,14,12,12,16,15,15,13,13,17,14,14,14,14,17, + 15,15,13,13,16,15,15,14,13,16,15,15,13,13,16,15, + 15,13,13,16,14,14,14,14,16,15,15,13,13,16,14,15, + 13,13,17,15,15,13,13,17,15,15,13,13,16,14,14,14, + 14,17,15,15,12,12,17,14,15,13,13,17,15,15,12,12, + 16,15,15,13,13,17,14,14,14,14,17,15,15,12,12,17, + 15,15,13,13,16,15,15,12,12,14,15,15, 8, 8,14,14, + 14,19,18,14,15,15,19,20,14,14,14,19,19,14,14,15, + 19,20,15,16,15,19,21,15,16,16,21,19,15,15,15,20, + 19,15,16,16,19,20,15,15,15,19,18,15,16,15,20,19, + 15,16,16,19,20,15,15,15,19,19,15,16,15,20,20,14, + 15,15,19,19,15,15,15,21,19,15,17,16,19,20,15,14, + 15, 0,21,15,15,15,19,20,14,14,14,19,19,15,15,15, + 20,19,15,16,16,19,19,15,15,15,19,18,15,15,15,20, + 19,14,14,15,18,18,14,12,12, 9, 9,14,14,14,18,18, + 14,14,14,18,18,14,15,14,19,18,14,14,14,19,18,15, + 15,15,19,20,15,14,14,18,18,15,15,15,20,19,15,15, + 15,18,20,15,15,15,19,18,15,15,15,19,19,15,14,14, + 19,21,15,15,15,20,20,15,15,15,18,19,14,15,15,19, + 20,15,15,15,20,19,15,14,14,19,21,15,15,15,18,19, + 15,14,15,20,19,14,15,15,21,21,14,15,15,19,20,15, + 14,14,19,20,15,15,15,19,20,15,15,14,20,20,14,15, + 15,20,19,13,12,12,13,13,17,16,16,11,11,17,16,16, + 12,12,18,17,16,11,11,18,16,16,11,11,17,17,17,13, + 13,18,16,16,13,13,18,17,17,12,12,18,16,16,13,13, + 18,17,17,12,12,18,17,17,13,13,18,16,16,14,14,18, + 16,17,12,12,18,17,17,13,13,17,17,17,12,12,17,17, + 17,12,12,17,16,15,13,13,18,16,16,11,11,17,16,16, + 12,12,17,16,17,11,11,18,17,17,13,12,17,16,16,13, + 13,17,17,17,12,12,17,16,17,12,12,18,17,17,11,11, + 14,14,14, 9, 9,16,14,14,13,13,17,15,15,14,14,17, + 14,14,13,13,16,14,14,13,13,17,15,15,14,14,16,16, + 16,16,15,18,15,15,14,14,17,16,15,15,15,17,15,15, + 14,14,17,15,15,14,15,16,16,16,15,16,18,15,15,14, + 14,17,15,15,14,15,17,15,15,14,14,17,15,15,14,14, + 16,16,16,15,16,17,14,14,13,13,17,15,15,14,14,18, + 15,15,13,13,17,15,15,14,14,16,16,16,15,15,17,14, + 14,13,13,17,15,15,14,14,17,14,14,13,13,13,11,11, + 11,11,16,14,14,12,12,16,14,14,12,13,17,15,14,11, + 11,17,14,14,11,11,17,15,15,13,14,17,14,14,14,14, + 17,15,15,13,13,17,14,14,13,13,17,15,15,13,13,17, + 15,15,13,13,17,14,14,14,14,17,15,15,13,13,18,14, + 15,13,13,17,15,15,13,13,16,15,15,13,13,17,14,14, + 13,13,17,15,15,12,12,16,14,14,12,12,16,15,15,12, + 12,17,16,15,13,13,17,14,14,13,13,17,15,15,12,12, + 16,15,15,12,12,16,15,15,12,12,13,15,15, 8, 8,14, + 14,14,18,19,14,15,15,19,20,14,14,14,18,18,14,15, + 15,18,18,15,16,16,19,19,15,16,17,20,20,15,15,15, + 19,19,15,16,16,18,20,15,15,15,19,19,15,15,16,18, + 18,15,17,16,19,19,15,15,15,18,21,15,16,16,21,20, + 15,15,15,19,21,15,16,15,20,19,15,16,17,20,20,15, + 15,15,19,19,15,16,16,21,20,15,15,15,19,20,15,15, + 15,19,19,15,16,16,20,19,15,15,15,19,19,15,16,15, + 20,21,15,15,15,21,19,14,12,12, 8, 8,14,14,14,20, + 18,14,13,13,19,19,14,14,14,19,18,15,14,14,19,20, + 14,15,15,20,20,15,14,14,21,20,15,15,15,20,20,15, + 15,14,21,19,15,15,15,19,19,15,15,15,19,20,15,14, + 14,20,20,15,15,15,19,20,15,14,14,19,20,15,15,15, + 20,20,15,15,15,20,19,15,14,14,20,21,15,15,15,20, + 21,15,14,14,20, 0,15,16,15,20,21,15,15,15,19,20, + 15,14,14,19,19,15,15,15,19,20,15,15,15,19,19,15, + 15,15,18,20,13,12,12,13,13,18,16,17,12,12,17,16, + 16,12,12,17,17,16,11,11,18,16,16,11,11,17,17,18, + 13,13,18,16,16,14,14,18,17,17,13,13,18,16,16,13, + 13,18,17,17,12,12,17,17,16,13,13,17,16,16,13,14, + 18,17,17,12,12,18,16,16,12,13,17,16,17,12,12,17, + 18,17,13,13,18,16,16,13,13,18,17,17,12,12,17,16, + 16,12,12,17,17,17,11,11,17,16,17,12,12,17,16,16, + 13,13,17,16,16,11,11,17,16,16,12,12,18,16,17,11, + 11,14,14,14, 9, 9,16,14,15,13,13,17,15,15,14,14, + 17,14,14,12,12,16,14,14,13,13,18,15,15,15,15,17, + 15,16,15,16,18,15,15,14,14,17,15,16,15,15,17,15, + 15,14,14,18,15,15,14,14,16,16,16,16,15,17,15,15, + 14,14,16,15,15,14,14,17,15,15,14,14,17,15,15,14, + 14,17,16,16,15,15,17,15,14,13,13,17,15,15,14,14, + 17,15,15,13,13,17,15,15,14,14,16,16,16,15,15,18, + 15,14,14,14,17,15,15,14,14,18,15,15,13,13,13,12, + 12,11,11,16,14,14,12,12,16,14,14,13,13,17,15,15, + 12,12,17,14,14,12,12,17,15,15,14,14,17,14,14,14, + 14,17,15,15,13,13,17,15,14,13,13,17,15,15,13,13, + 17,15,15,13,13,16,14,14,14,14,17,15,15,13,13,16, + 14,14,13,13,16,15,15,13,13,17,15,16,13,13,17,14, + 14,14,13,17,15,15,12,12,16,15,14,12,12,17,15,15, + 12,12,16,15,16,13,13,16,14,14,14,13,17,15,15,12, + 12,16,14,14,12,12,17,15,15,12,12,14,15,15, 8, 8, + 14,14,14,18,18,14,15,15,19,18,14,14,14,18,18,14, + 15,15,19,20,15,16,15,21,18,15,16,16,18, 0,15,15, + 15,19,20,15,16,16,20, 0,15,16,15,19,18,15,15,15, + 19,19,15,16,16,21,19,15,15,15,19,19,15,16,16,20, + 20,15,15,15,19,19,15,15,15,19,18,15,16,16,20,20, + 15,14,15,20,19,15,15,15,19,20,15,15,15,19,19,15, + 16,15,19,20,15,16,16,19,20,15,15,15,19,19,15,16, + 15,20,20,15,15,15,20,18,13,12,12, 8, 8,14,14,14, + 19,20,14,14,14,19,19,14,15,15,20,20,14,14,14,18, + 19,15,15,15,20, 0,15,14,14,18,20,15,15,15,19,19, + 15,15,15,21,19,15,15,15,19,20,15,15,15,20,21,15, + 14,14,20,19,15,15,15,20,19,15,15,14,21,19,15,15, + 15,19,18,15,15,15,20,19,15,14,14,19,19,15,15,16, + 20,19,15,15,15,20, 0,15,15,15,19,21,15,15,15,22, + 20,15,14,14,22,19,15,15,15,19,20,15,14,14,20,19, + 14,15,15,19,21, +}; + +static const static_codebook _44pn1_p3_1 = { + 5, 3125, + (long *)_vq_lengthlist__44pn1_p3_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44pn1_p3_1, + 0 +}; + +static const long _vq_quantlist__44pn1_p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44pn1_p4_0[] = { + 1, 7, 7,14,14, 6, 8, 8,15,16, 7, 8, 8,16,15, 0, + 14,14,17,17, 0,14,14,16,16, 7, 9, 9,16,16,10,11, + 11,17,18, 9, 8, 8,16,16, 0,14,14,19,19, 0,14,14, + 17,16, 8, 9, 9,16,16,12,12,12,17,17,10, 9, 9,16, + 16, 0,15,14,18,20, 0,14,14,17,17, 0,15,15,18,17, + 0,21, 0, 0,21, 0,13,13,17,17, 0,17,17, 0, 0, 0, + 15,15,17,17, 0,15,15,17,18, 0, 0, 0, 0,21, 0,13, + 13,17,17, 0,18,18, 0,21, 0,16,15,17,18, 6, 7, 7, + 14,14, 9,10,10,16,16,11,10,10,15,15, 0,21, 0,20, + 21, 0, 0, 0,18,20,10,10,10,15,16,12,13,13,18,18, + 12,11,11,15,15, 0, 0, 0,20,20, 0, 0,21,19,19,12, + 11,11,15,15,15,14,14,18,18,13,11,11,15,16, 0, 0, + 0,20,19, 0, 0, 0,20,21, 0, 0,20,19,19, 0, 0, 0, + 0, 0, 0,20, 0,17,18, 0, 0,21, 0, 0, 0, 0, 0,21, + 0, 0,21, 0,20,19, 0, 0, 0, 0, 0, 0,21, 0,18,18, + 0, 0, 0,21, 0, 0, 0, 0, 0,20, 7, 6, 6,13,13, 9, + 6, 6,12,12, 9, 7, 7,14,14, 0,10,10,12,12, 0,11, + 11,15,15, 9, 7, 7,14,14,12, 9, 9,14,14,10, 7, 7, + 14,13, 0,11,11,16,15, 0,11,11,14,14, 9, 7, 7,14, + 14,13,10,10,14,14,11, 7, 7,14,13, 0,11,11,16,16, + 0,11,11,14,14, 0,12,12,16,16, 0,19, 0,17,18, 0, + 10,10,14,14, 0,15,14, 0, 0, 0,12,12,14,14, 0,12, + 12,15,15, 0,20, 0,18,19, 0,10,10,14,14, 0,16,15, + 0,20, 0,13,13,14,14, 0,11,11,13,13, 0,12,13,16, + 16, 0,12,12,16,16, 0,16,16, 0,21, 0,17,18, 0, 0, + 0,12,12,16,16, 0,15,15,18, 0, 0,12,12,16,16, 0, + 17,16,21,21, 0,16,17, 0, 0, 0,13,13,17,16, 0,16, + 16,20,21, 0,12,12,17,16, 0,17,17, 0,21, 0,17,17, + 21,21, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, + 0, 0,18,21, 0, 0, 0,18,19, 0, 0, 0,18,17,21,21, + 0, 0, 0, 0, 0, 0,16,16, 0, 0, 0, 0, 0, 0, 0, 0, + 19,19, 0, 0, 0,11,11,12,12, 0,11,11,10,10, 0,12, + 12,13,13, 0,12,12, 9, 9, 0,14,14,13,13, 0,12,12, + 13,13, 0,14,14,12,13, 0,11,11,12,12, 0,13,13,13, + 13, 0,13,13,13,13, 0,12,12,13,13, 0,14,14,12,12, + 0,11,11,12,12, 0,14,13,14,14, 0,13,13,13,13, 0, + 15,15,14,15, 0, 0, 0,16,16, 0,12,12,13,13, 0,16, + 17,20,21, 0,14,13,12,12, 0,14,14,14,14, 0,21, 0, + 16,16, 0,12,12,13,13, 0,18,17,21, 0, 0,14,14,13, + 13, 7, 8, 8,17,17,11,10,10,18,18,12,10,10,17,17, + 0,15,15,20,18, 0,15,15,17,17,11, 9, 9,17,17,14, + 12,12,19,19,13, 9, 9,16,16, 0,15,14, 0,19, 0,14, + 14,16,16,12,10,10,20,18,16,13,13,21,20,14,10,10, + 17,17, 0,15,15,21,20, 0,15,14,17,17, 0,15,15,21, + 21, 0, 0,21, 0, 0, 0,13,13,18,18, 0,19,16, 0, 0, + 0,15,15,17,16, 0,16,16, 0,21, 0, 0, 0, 0,21, 0, + 13,14,18,17, 0,20,19, 0, 0, 0,15,15,18,18, 8, 7, + 7,15,15,12,11,11,17,16,13,11,11,16,16, 0, 0, 0, + 21,20, 0, 0, 0, 0,20,11,10,10,17,17,14,13,13,19, + 18,14,11,11,16,16, 0,20, 0,21,19, 0, 0,21, 0,20, + 12,11,11,17,17,16,15,15, 0,19,14,11,11,17,16, 0, + 21, 0, 0,19, 0, 0, 0,21,20, 0, 0,21,20, 0, 0, 0, + 0, 0, 0, 0, 0, 0,19,21, 0, 0, 0, 0, 0, 0, 0, 0, + 19,20, 0, 0, 0,20,21, 0, 0, 0, 0, 0, 0,20, 0,19, + 21, 0, 0, 0, 0, 0, 0, 0, 0,21,20,11,10, 9,15,15, + 14,11,11,15,15,14,11,11,16,16, 0,14,14,14,14, 0, + 16,15,17,16,13,11,11,16,16,16,13,13,16,16,15,10, + 10,15,15, 0,14,15,17,17, 0,14,14,16,15,13,11,11, + 16,16,17,15,14,16,16,15,10,10,15,15, 0,15,15,17, + 18, 0,15,15,16,16, 0,16,16,17,17, 0,21, 0,21,20, + 0,13,13,15,15, 0,18,18, 0,21, 0,15,15,15,15, 0, + 16,16,17,17, 0, 0, 0, 0,18, 0,13,13,15,15, 0,19, + 18, 0, 0, 0,15,15,16,16, 0,12,12,15,15, 0,13,13, + 17,17, 0,13,13,17,18, 0,16,17,21, 0, 0,20,18, 0, + 0, 0,13,13,17,17, 0,15,15, 0,18, 0,12,12,17,18, + 0,16,16, 0, 0, 0,17,17,21, 0, 0,13,13,18,18, 0, + 16,16,21,21, 0,12,12,17,18, 0,16,17,21, 0, 0,17, + 17, 0,21, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,16,15, + 0,21, 0,21,19, 0, 0, 0,18,18, 0, 0, 0,18,19, 0, + 0, 0, 0, 0, 0, 0, 0,16,16,21,21, 0,20,19, 0, 0, + 0,19,21, 0,21, 0,12,12,15,15, 0,12,12,15,16, 0, + 13,13,16,16, 0,14,14,15,15, 0,16,15,17,17, 0,13, + 13,17,17, 0,15,15,16,18, 0,12,12,16,16, 0,14,14, + 17,17, 0,15,14,16,16, 0,13,13,16,16, 0,16,15,17, + 17, 0,12,12,16,16, 0,15,15,18,18, 0,14,14,17,16, + 0,16,16,17,18, 0, 0, 0,20,21, 0,13,13,16,17, 0, + 17,17, 0, 0, 0,15,15,16,16, 0,15,16,17,17, 0, 0, + 0,19, 0, 0,13,13,15,16, 0,19,18, 0, 0, 0,16,15, + 16,17, 8, 8, 8,17,17,13,11,10,17,18,13,10,10,17, + 17, 0,15,15,20,19, 0,15,15,17,17,12,10,10,19,18, + 15,12,12,20,18,14,10,10,17,16, 0,15,15,20,20, 0, + 14,15,16,16,13,10,10,17,17,17,14,14, 0,18,15,10, + 10,17,17, 0,16,15,20,20, 0,14,14,17,17, 0,15,16, + 20,20, 0, 0,21, 0, 0, 0,13,13,17,17, 0,18,17, 0, + 0, 0,15,16,17,18, 0,15,15,18,21, 0, 0, 0,21, 0, + 0,13,13,18,18, 0,19,19, 0, 0, 0,16,16,18,17, 9, + 8, 8,15,15,12,11,11,16,16,13,11,11,16,15, 0, 0, + 0, 0,21, 0,21, 0,19,19,12,11,11,17,18,15,13,13, + 18,19,14,11,11,16,16, 0, 0,21,21,19, 0, 0, 0,21, + 20,13,11,11,18,17,17,14,15,20,21,15,11,12,16,16, + 0, 0, 0,20, 0, 0, 0,21, 0,19, 0, 0, 0, 0,19, 0, + 0, 0, 0, 0, 0,21,21,19,19, 0, 0, 0,21, 0, 0, 0, + 0,19,21, 0, 0, 0,19,20, 0, 0, 0,21, 0, 0, 0,21, + 19,19, 0, 0, 0, 0, 0, 0, 0, 0,21,20, 0,11,11,15, + 15, 0,12,12,15,16, 0,12,12,16,16, 0,15,15,16,15, + 0,16,16,17,17, 0,12,12,17,17, 0,14,14,17,17, 0, + 11,11,16,16, 0,15,15,19,18, 0,15,15,16,16, 0,12, + 12,17,16, 0,14,15,16,16, 0,11,11,15,15, 0,16,16, + 18,19, 0,15,15,15,16, 0,17,17,18,20, 0,21, 0,21, + 19, 0,14,14,16,16, 0,18,18, 0, 0, 0,16,16,15,15, + 0,16,16,18,17, 0, 0, 0,19,20, 0,14,14,16,16, 0, + 19,19, 0, 0, 0,16,17,15,15, 0,12,12,14,15, 0,13, + 13,16,17, 0,12,12,17,17, 0,17,16, 0, 0, 0,18,17, + 21, 0, 0,13,13,19,17, 0,15,15,20,21, 0,12,12,17, + 17, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,13,13,17,18, + 0,16,16,21, 0, 0,12,12,17,17, 0,17,17, 0, 0, 0, + 17,17, 0, 0, 0,18,21, 0, 0, 0, 0, 0, 0, 0, 0,15, + 15,21, 0, 0,20,21, 0, 0, 0,18,19, 0, 0, 0,18,17, + 0, 0, 0, 0, 0, 0, 0, 0,16,16,21, 0, 0,21,21, 0, + 0, 0,18,19, 0, 0, 0,12,12,16,16, 0,13,13,16,17, + 0,13,13,17,16, 0,14,14,16,16, 0,16,15,19,18, 0, + 13,13,17,17, 0,15,15,18,18, 0,12,12,16,16, 0,15, + 15,18,19, 0,15,15,17,16, 0,13,13,17,17, 0,16,16, + 18,17, 0,12,12,17,16, 0,15,15,18,18, 0,15,15,17, + 17, 0,16,16, 0,19, 0, 0, 0, 0, 0, 0,14,14,16,17, + 0,18,18, 0, 0, 0,15,15,17,17, 0,16,16,21,19, 0, + 21, 0,21,21, 0,13,14,16,16, 0,19,19, 0, 0, 0,15, + 16,16,16, 0,11,11,17,16, 0,15,14,19,18, 0,14,14, + 19,19, 0,18,17,18,20, 0,17,17,18,19, 0,13,13,17, + 17, 0,16,17,21,18, 0,13,13,17,16, 0,18,17,19, 0, + 0,16,17,18,18, 0,12,12,19,18, 0,18,18,20,20, 0, + 13,13,17,17, 0,17,17,21, 0, 0,16,17,17,18, 0,18, + 17,19,18, 0, 0, 0, 0, 0, 0,14,14,17,17, 0,19,19, + 21, 0, 0,16,16,16,17, 0,17,17,19,20, 0, 0, 0, 0, + 21, 0,15,15,17,18, 0,21,21, 0, 0, 0,17,17,17,18, + 0,10,10,15,15, 0,15,14,17,18, 0,14,14,16,16, 0, + 0, 0,18, 0, 0,21, 0,19, 0, 0,13,13,17,16, 0,17, + 17,18, 0, 0,14,14,16,15, 0, 0, 0,21, 0, 0,21, 0, + 19,18, 0,13,13,17,17, 0,18,18,20,20, 0,15,15,16, + 16, 0, 0, 0,21,21, 0, 0, 0,20,20, 0, 0, 0,19, 0, + 0, 0, 0, 0, 0, 0,21,20,18,18, 0, 0, 0, 0, 0, 0, + 0, 0, 0,20, 0, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, + 0,19,18, 0, 0, 0, 0,21, 0, 0, 0,18,20, 0,18,19, + 16,17, 0,21,19,17,17, 0, 0,21,18,18, 0, 0,21,20, + 19, 0, 0, 0,20,20, 0, 0,21,17,17, 0, 0, 0,19,19, + 0,20,20,17,17, 0, 0, 0, 0,20, 0, 0,20,18,18, 0, + 21,20,17,17, 0, 0, 0,20,21, 0,19, 0,17,17, 0, 0, + 21, 0, 0, 0,20, 0,18,19, 0, 0, 0,21,21, 0, 0, 0, + 0,21, 0,20,20,17,17, 0, 0, 0, 0, 0, 0,21, 0,18, + 17, 0, 0, 0,20,19, 0, 0, 0, 0,21, 0,20,20,17,17, + 0, 0, 0, 0, 0, 0,21,21,18,18, 0,12,12,15,14, 0, + 14,14,17,17, 0,14,14,17,16, 0,18,18,21, 0, 0,19, + 20, 0, 0, 0,13,13,18,17, 0,16,16,19,18, 0,13,13, + 17,17, 0,17,17, 0, 0, 0,17,17,21, 0, 0,13,13,17, + 17, 0,17,17,21,20, 0,13,13,18,17, 0,18,19,21,21, + 0,19,18, 0, 0, 0,18,17, 0, 0, 0, 0, 0, 0, 0, 0, + 15,16, 0, 0, 0,21,21, 0, 0, 0,20,18,21, 0, 0,17, + 18, 0, 0, 0, 0, 0, 0, 0, 0,15,16, 0, 0, 0, 0,20, + 0, 0, 0, 0,19, 0, 0, 0,15,15,18,19, 0,18,17,21, + 0, 0,16,18, 0,20, 0,17,18,21, 0, 0,18,20, 0, 0, + 0,16,16,21,21, 0,19,20,21, 0, 0,16,15, 0,21, 0, + 18,20, 0, 0, 0,18,19, 0, 0, 0,16,15,21,21, 0,21, + 0, 0, 0, 0,16,15,21, 0, 0,20,19, 0, 0, 0,18,21, + 21, 0, 0,20,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0, + 20, 0,21, 0, 0, 0, 0,17,18,20,21, 0,18,18,21,21, + 0, 0, 0, 0, 0, 0,16,16,20, 0, 0, 0,21, 0, 0, 0, + 21,18, 0, 0, 0,12,12,20,17, 0,15,15,19,18, 0,14, + 14,19,18, 0,18,17,21,19, 0,17,17,21,17, 0,13,13, + 21,19, 0,16,17,20,19, 0,13,13,16,16, 0,17,17,20, + 21, 0,16,16,19,17, 0,13,13,18,18, 0,17,19,19,19, + 0,13,13,17,17, 0,18,18, 0,19, 0,16,17,18,18, 0, + 16,17,19,21, 0, 0, 0, 0, 0, 0,15,15,16,17, 0,20, + 19,21, 0, 0,17,17,17,17, 0,17,17,21,19, 0, 0, 0, + 0, 0, 0,15,15,17,17, 0,21, 0, 0, 0, 0,18,18,17, + 17, 0,10,10,15,15, 0,15,15,17,17, 0,15,14,16,16, + 0, 0, 0,21,19, 0,21,21,19,21, 0,13,13,17,16, 0, + 17,17,18,19, 0,14,15,16,15, 0, 0, 0,21,19, 0,21, + 21,18,19, 0,14,14,16,17, 0,18,18,18,19, 0,15,15, + 15,16, 0, 0,21, 0,21, 0, 0, 0,19,20, 0, 0, 0,21, + 19, 0, 0, 0, 0, 0, 0,21,21,19,17, 0, 0, 0, 0, 0, + 0, 0, 0,21,21, 0,21, 0, 0,21, 0, 0, 0, 0, 0, 0, + 21,21,19,18, 0, 0, 0, 0, 0, 0, 0, 0, 0,19, 0,21, + 18,18,17, 0,21, 0,20,20, 0, 0, 0,18,20, 0, 0,21, + 18,21, 0, 0, 0,21,18, 0, 0, 0, 0,19, 0, 0, 0,21, + 21, 0,20,21,17,19, 0,21, 0,21, 0, 0,21, 0,18,18, + 0,20,21,17,18, 0, 0, 0,21,19, 0,20,21,17,18, 0, + 0, 0,21,21, 0, 0, 0,20,19, 0, 0, 0,21,21, 0, 0, + 0, 0, 0, 0,21,21,19,18, 0, 0, 0, 0, 0, 0, 0,21, + 19,18, 0,21,21,19, 0, 0, 0, 0,21, 0, 0,21,21,18, + 17, 0, 0, 0, 0, 0, 0,21, 0,21,18, 0,12,12,14,14, + 0,15,14,17,17, 0,14,14,17,16, 0,19,17, 0, 0, 0, + 19,19, 0, 0, 0,13,13,17,17, 0,17,17,20,20, 0,13, + 13,18,18, 0,18,17, 0, 0, 0,18,21, 0, 0, 0,13,13, + 17,17, 0,18,18,21,20, 0,14,14,18,19, 0,19,18,21, + 0, 0,19,19, 0, 0, 0,20,18,20, 0, 0, 0, 0, 0, 0, + 0,15,16, 0, 0, 0,21,21, 0, 0, 0,19,19, 0, 0, 0, + 18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0, 0, + 0, 0, 0, 0,19,20, 0, 0, 0,15,15,20,21, 0,17,17, + 21,21, 0,17,17, 0, 0, 0,19,18, 0, 0, 0,18,19, 0, + 0, 0,17,16, 0,21, 0, 0,20, 0, 0, 0,16,16, 0,20, + 0,19,19, 0,21, 0,19,18, 0,21, 0,16,16, 0, 0, 0, + 21,21, 0, 0, 0,16,16, 0, 0, 0,21,21, 0, 0, 0,19, + 19, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17, + 0,21, 0, 0,20, 0, 0, 0,20,18,21,21, 0,19,18, 0, + 20, 0, 0, 0, 0, 0, 0,16,17,21, 0, 0, 0,21, 0, 0, + 0,19,20,21,20, +}; + +static const static_codebook _44pn1_p4_0 = { + 5, 3125, + (long *)_vq_lengthlist__44pn1_p4_0, + 1, -528744448, 1616642048, 3, 0, + (long *)_vq_quantlist__44pn1_p4_0, + 0 +}; + +static const long _vq_quantlist__44pn1_p4_1[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44pn1_p4_1[] = { + 2, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _44pn1_p4_1 = { + 1, 7, + (long *)_vq_lengthlist__44pn1_p4_1, + 1, -533200896, 1611661312, 3, 0, + (long *)_vq_quantlist__44pn1_p4_1, + 0 +}; + +static const long _vq_quantlist__44pn1_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p5_0[] = { + 1, 7, 7, 6, 8, 8, 7, 8, 8, 7, 9, 9,11,11,11, 9, + 8, 8, 7, 9, 9,11,12,11, 9, 9, 9, 6, 7, 7,10,11, + 11,10,10,10,10,11,11,15,14,14,12,12,12,11,11,11, + 14,14,14,12,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, + 8, 8,12,10,10,10, 7, 7, 8, 7, 7,12,10,10,10, 7, + 7, 6, 7, 7,12,11,11,12,10,10,11,10,10,14,14,13, + 13,10,10,11,10,10,16,14,14,14,11,10, 7, 7, 7,13, + 12,12,12,12,11,11,11,11,15,14,17,13,12,12,12,11, + 11,15,15,15,14,13,13,10, 9, 9,14,12,11,13,11,11, + 12,11,11,16,15,14,14,11,11,12,11,11,17,14,14,15, + 11,11, 7, 8, 8,12,11,11,13,10,10,11,10,10,17,14, + 13,14,10,10,12,10,10,18,15,15,14,10,10, 8, 7, 7, + 13,12,12,13,11,11,12,11,11,16,14,15,14,12,12,12, + 11,11,18,16,16,14,12,12,11,10,10,13,12,11,13,11, + 11,13,12,12, 0,15,14,14,11,11,13,11,11,16,15,15, + 15,11,11, +}; + +static const static_codebook _44pn1_p5_0 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p5_0, + 1, -527106048, 1620377600, 2, 0, + (long *)_vq_quantlist__44pn1_p5_0, + 0 +}; + +static const long _vq_quantlist__44pn1_p5_1[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p5_1[] = { + 2, 6, 7, 6, 8, 8, 7, 7, 8, 7, 8, 8, 9, 9, 9, 8, + 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 6, 6, 9, 7, + 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, + 10, 9, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 6, 6, 9, + 7, 7,10, 8, 8,10, 6, 6, 9, 7, 7,10, 8, 8,10, 6, + 6, 7, 7, 7,11, 9, 9,11, 9, 9,10, 9, 9,12,10,10, + 12, 8, 8,11, 9, 9,13, 9,10,12, 8, 8, 8, 7, 7,11, + 9,10,11,10,10,10, 9, 9,11,11,11,11, 9, 9,11,10, + 9,12,11,11,11, 9,10,10, 8, 8,11, 9,10,11, 9, 9, + 11, 9, 9,12,10,10,11, 9, 9,11, 9, 9,12,10,11,11, + 9, 9, 8, 8, 8,12, 9, 9,12, 9, 9,11, 9, 9,13, 9, + 9,13, 8, 8,12, 9, 9,13,10,10,12, 8, 8, 9, 7, 7, + 11,10,10,11,10,10,11,10,10,12,11,11,11,10, 9,11, + 10,10,11,11,11,11, 9, 9,11, 9, 9,12,10,10,11,10, + 10,12,10,10,11,11,11,11, 9, 9,11,10,10,12,11,11, + 11, 9, 9, +}; + +static const static_codebook _44pn1_p5_1 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p5_1, + 1, -530841600, 1616642048, 2, 0, + (long *)_vq_quantlist__44pn1_p5_1, + 0 +}; + +static const long _vq_quantlist__44pn1_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44pn1_p6_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, +}; + +static const static_codebook _44pn1_p6_0 = { + 5, 243, + (long *)_vq_lengthlist__44pn1_p6_0, + 1, -516716544, 1630767104, 2, 0, + (long *)_vq_quantlist__44pn1_p6_0, + 0 +}; + +static const long _vq_quantlist__44pn1_p6_1[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44pn1_p6_1[] = { + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _44pn1_p6_1 = { + 1, 25, + (long *)_vq_lengthlist__44pn1_p6_1, + 1, -518864896, 1620639744, 5, 0, + (long *)_vq_quantlist__44pn1_p6_1, + 0 +}; + +static const long _vq_quantlist__44pn1_p6_2[] = { + 12, + 11, + 13, + 10, + 14, + 9, + 15, + 8, + 16, + 7, + 17, + 6, + 18, + 5, + 19, + 4, + 20, + 3, + 21, + 2, + 22, + 1, + 23, + 0, + 24, +}; + +static const long _vq_lengthlist__44pn1_p6_2[] = { + 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 4, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44pn1_p6_2 = { + 1, 25, + (long *)_vq_lengthlist__44pn1_p6_2, + 1, -529006592, 1611661312, 5, 0, + (long *)_vq_quantlist__44pn1_p6_2, + 0 +}; + +static const long _huff_lengthlist__44pn1_short[] = { + 4, 3, 7, 9,12,16,16, 3, 2, 5, 7,11,14,15, 7, 4, + 5, 6, 9,12,15, 8, 5, 5, 5, 8,10,14, 9, 7, 6, 6, + 8,10,12,12,10,10, 7, 6, 8,10,15,12,10, 6, 4, 7, + 9, +}; + +static const static_codebook _huff_book__44pn1_short = { + 2, 49, + (long *)_huff_lengthlist__44pn1_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h new file mode 100644 index 0000000000..e13b06a467 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h @@ -0,0 +1,15782 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: static codebooks autogenerated by huff/huffbuld + last modified: $Id: res_books_stereo.h 17025 2010-03-25 04:56:56Z xiphmont $ + + ********************************************************************/ + +#include "../../codebook.h" + +static const long _vq_quantlist__16c0_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c0_s_p1_0[] = { + 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, + 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, + 0, 0, 0, 9, 9,12, 0, 0, 0, 0, 0, 0,10,12,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, + 0, 0, 0, 0, 9,12,10, 0, 0, 0, 0, 0, 0,10,11,12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, + 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,12,11, 0, + 0, 0, 0, 0, 0, 9,10,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,12, + 0, 0, 0, 0, 0, 0, 9,12, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c0_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__16c0_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16c0_s_p1_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16c0_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 7, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c0_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__16c0_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16c0_s_p3_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16c0_s_p4_0[] = { + 1, 3, 2, 7, 8, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c0_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__16c0_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16c0_s_p4_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16c0_s_p5_0[] = { + 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 8, 0, 0, 0, 7, 7, + 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, 0, 0, + 8, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _16c0_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__16c0_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16c0_s_p5_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__16c0_s_p6_0[] = { + 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, + 11,11, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, + 11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,12,13, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10,10,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, 0, 0, + 10,10,10,11,11,11,12,12,13,13,13,14, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,13,13,14,15,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,14,14,15, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,13,14, + 14, +}; + +static const static_codebook _16c0_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__16c0_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__16c0_s_p6_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c0_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,11,10,10,11, + 11,10, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, + 11,11,11,10, 6, 9, 9,11,12,12,11, 9, 9, 6, 9,10, + 11,12,12,11, 9,10, 7,11,11,11,11,11,12,13,12, 6, + 9,10,11,10,10,12,13,13, 6,10, 9,11,10,10,11,12, + 13, +}; + +static const static_codebook _16c0_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__16c0_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__16c0_s_p7_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16c0_s_p7_1[] = { + 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, + 8, 8, 8, 9, 9, 9,10,10,10, 6, 7, 8, 8, 8, 8, 9, + 8,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, 7, + 7, 8, 8, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9, 9, + 9, 9,11,11,11, 8, 8, 9, 9, 9, 9, 9,10,10,11,11, + 9, 9, 9, 9, 9, 9, 9,10,11,11,11,10,11, 9, 9, 9, + 9,10, 9,11,11,11,10,11,10,10, 9, 9,10,10,11,11, + 11,11,11, 9, 9, 9, 9,10,10, +}; + +static const static_codebook _16c0_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__16c0_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16c0_s_p7_1, + 0 +}; + +static const long _vq_quantlist__16c0_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16c0_s_p8_0[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8,10,10, 6, 5, 6, + 8, 8, 8, 8, 8, 8, 8, 9,10,10, 7, 6, 6, 8, 8, 8, + 8, 8, 8, 8, 8,10,10, 0, 8, 8, 8, 8, 9, 8, 9, 9, + 9,10,10,10, 0, 9, 8, 8, 8, 9, 9, 8, 8, 9, 9,10, + 10, 0,12,11, 8, 8, 9, 9, 9, 9,10,10,11,10, 0,12, + 13, 8, 8, 9,10, 9, 9,11,11,11,12, 0, 0, 0, 8, 8, + 8, 8,10, 9,12,13,12,14, 0, 0, 0, 8, 8, 8, 9,10, + 10,12,12,13,14, 0, 0, 0,13,13, 9, 9,11,11, 0, 0, + 14, 0, 0, 0, 0,14,14,10,10,12,11,12,14,14,14, 0, + 0, 0, 0, 0,11,11,13,13,14,13,14,14, 0, 0, 0, 0, + 0,12,13,13,12,13,14,14,14, +}; + +static const static_codebook _16c0_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__16c0_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__16c0_s_p8_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16c0_s_p8_1[] = { + 1, 4, 3, 5, 5, 7, 7, 7, 6, 6, 7, 7, 7, 5, 5, 7, + 7, 7, 6, 6, 7, 7, 7, 6, 6, +}; + +static const static_codebook _16c0_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__16c0_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16c0_s_p8_1, + 0 +}; + +static const long _vq_quantlist__16c0_s_p9_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c0_s_p9_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _16c0_s_p9_0 = { + 4, 81, + (long *)_vq_lengthlist__16c0_s_p9_0, + 1, -518803456, 1628680192, 2, 0, + (long *)_vq_quantlist__16c0_s_p9_0, + 0 +}; + +static const long _vq_quantlist__16c0_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16c0_s_p9_1[] = { + 1, 5, 5, 5, 5, 9,11,11,10,10,10,10,10,10,10, 7, + 6, 6, 6, 6,10,10,10,10,10,10,10,10,10,10, 7, 6, + 6, 6, 6,10, 9,10,10,10,10,10,10,10,10,10, 7, 7, + 8, 9,10,10,10,10,10,10,10,10,10,10,10, 8, 7,10, + 10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _16c0_s_p9_1 = { + 2, 225, + (long *)_vq_lengthlist__16c0_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__16c0_s_p9_1, + 0 +}; + +static const long _vq_quantlist__16c0_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__16c0_s_p9_2[] = { + 1, 5, 5, 7, 8, 8, 7, 9, 9, 9,12,12,11,12,12,10, + 10,11,12,12,12,11,12,12, 8, 9, 8, 7, 9,10,10,11, + 11,10,11,12,10,12,10,12,12,12,11,12,11, 9, 8, 8, + 9,10, 9, 8, 9,10,12,12,11,11,12,11,10,11,12,11, + 12,12, 8, 9, 9, 9,10,11,12,11,12,11,11,11,11,12, + 12,11,11,12,12,11,11, 9, 9, 8, 9, 9,11, 9, 9,10, + 9,11,11,11,11,12,11,11,10,12,12,12, 9,12,11,10, + 11,11,11,11,12,12,12,11,11,11,12,10,12,12,12,10, + 10, 9,10, 9,10,10, 9, 9, 9,10,10,12,10,11,11, 9, + 11,11,10,11,11,11,10,10,10, 9, 9,10,10, 9, 9,10, + 11,11,10,11,10,11,10,11,11,10,11,11,11,10, 9,10, + 10, 9,10, 9, 9,11, 9, 9,11,10,10,11,11,10,10,11, + 10,11, 8, 9,11,11,10, 9,10,11,11,10,11,11,10,10, + 10,11,10, 9,10,10,11, 9,10,10, 9,11,10,10,10,10, + 11,10,11,11, 9,11,10,11,10,10,11,11,10,10,10, 9, + 10,10,11,11,11, 9,10,10,10,10,10,11,10,10,10, 9, + 10,10,11,10,10,10,10,10, 9,10,11,10,10,10,10,11, + 11,11,10,10,10,10,10,11,10,11,10,11,10,10,10, 9, + 11,11,10,10,10,11,11,10,10,10,10,10,10,10,10,11, + 11, 9,10,10,10,11,10,11,10,10,10,11, 9,10,11,10, + 11,10,10, 9,10,10,10,11,10,11,10,10,10,10,10,11, + 11,10,11,11,10,10,11,11,10, 9, 9,10,10,10,10,10, + 9,11, 9,10,10,10,11,11,10,10,10,10,11,11,11,10, + 9, 9,10,10,11,10,10,10,10,10,11,11,11,10,10,10, + 11,11,11, 9,10,10,10,10, 9,10, 9,10,11,10,11,10, + 10,11,11,10,11,11,11,11,11,10,11,10,10,10, 9,11, + 11,10,11,11,11,11,11,11,11,11,11,10,11,10,10,10, + 10,11,10,10,11, 9,10,10,10, +}; + +static const static_codebook _16c0_s_p9_2 = { + 2, 441, + (long *)_vq_lengthlist__16c0_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__16c0_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__16c0_s_single[] = { + 3, 4,19, 7, 9, 7, 8,11, 9,12, 4, 1,19, 6, 7, 7, + 8,10,11,13,18,18,18,18,18,18,18,18,18,18, 8, 6, + 18, 8, 9, 9,11,12,14,18, 9, 6,18, 9, 7, 8, 9,11, + 12,18, 7, 6,18, 8, 7, 7, 7, 9,11,17, 8, 8,18, 9, + 7, 6, 6, 8,11,17,10,10,18,12, 9, 8, 7, 9,12,18, + 13,15,18,15,13,11,10,11,15,18,14,18,18,18,18,18, + 16,16,18,18, +}; + +static const static_codebook _huff_book__16c0_s_single = { + 2, 100, + (long *)_huff_lengthlist__16c0_s_single, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__16c1_s_long[] = { + 2, 5,20, 7,10, 7, 8,10,11,11, 4, 2,20, 5, 8, 6, + 7, 9,10,10,20,20,20,20,19,19,19,19,19,19, 7, 5, + 19, 6,10, 7, 9,11,13,17,11, 8,19,10, 7, 7, 8,10, + 11,15, 7, 5,19, 7, 7, 5, 6, 9,11,16, 7, 6,19, 8, + 7, 6, 6, 7, 9,13, 9, 9,19,11, 9, 8, 6, 7, 8,13, + 12,14,19,16,13,10, 9, 8, 9,13,14,17,19,18,18,17, + 12,11,11,13, +}; + +static const static_codebook _huff_book__16c1_s_long = { + 2, 100, + (long *)_huff_lengthlist__16c1_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__16c1_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c1_s_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c1_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__16c1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16c1_s_p1_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16c1_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c1_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__16c1_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16c1_s_p3_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16c1_s_p4_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c1_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__16c1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16c1_s_p4_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16c1_s_p5_0[] = { + 1, 3, 3, 5, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 8, 8, + 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _16c1_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__16c1_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16c1_s_p5_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__16c1_s_p6_0[] = { + 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11,12, + 12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 0, 0, 8, 8, 8, 9,10, 9,10,10,10,10, + 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10,11, + 11,11,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,13,13, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, + 14, +}; + +static const static_codebook _16c1_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__16c1_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__16c1_s_p6_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c1_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9,10,10, + 10, 9, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, + 11,11,10,10, 6,10, 9,11,11,11,11,10,10, 6,10,10, + 11,11,11,11,10,10, 7,11,11,11,11,11,12,12,11, 6, + 10,10,11,10,10,11,11,11, 6,10,10,10,11,10,11,11, + 11, +}; + +static const static_codebook _16c1_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__16c1_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__16c1_s_p7_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16c1_s_p7_1[] = { + 2, 3, 3, 5, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, + 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, + 8, 9, 9,10,10,10,10,10, 9, 9, 8, 8, 9, 9,10,10, + 10,10,10, 8, 8, 8, 8, 9, 9, +}; + +static const static_codebook _16c1_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__16c1_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16c1_s_p7_1, + 0 +}; + +static const long _vq_quantlist__16c1_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16c1_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, + 7, 8, 8, 9, 8, 8, 9, 9,10,11, 6, 5, 5, 8, 8, 9, + 9, 8, 8, 9,10,10,11, 0, 8, 8, 8, 9, 9, 9, 9, 9, + 10,10,11,11, 0, 9, 9, 9, 8, 9, 9, 9, 9,10,10,11, + 11, 0,13,13, 9, 9,10,10,10,10,11,11,12,12, 0,14, + 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, + 9, 9,11,11,12,12,13,12, 0, 0, 0,10,10, 9, 9,10, + 10,12,12,13,13, 0, 0, 0,13,14,11,10,11,11,12,12, + 13,14, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,12,12,12,12,13,13,14,15, 0, 0, 0, 0, + 0,12,12,12,12,13,13,14,15, +}; + +static const static_codebook _16c1_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__16c1_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__16c1_s_p8_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16c1_s_p8_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _16c1_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__16c1_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16c1_s_p8_1, + 0 +}; + +static const long _vq_quantlist__16c1_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16c1_s_p9_0[] = { + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _16c1_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__16c1_s_p9_0, + 1, -513964032, 1628680192, 4, 0, + (long *)_vq_quantlist__16c1_s_p9_0, + 0 +}; + +static const long _vq_quantlist__16c1_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16c1_s_p9_1[] = { + 1, 4, 4, 4, 4, 8, 8,12,13,14,14,14,14,14,14, 6, + 6, 6, 6, 6,10, 9,14,14,14,14,14,14,14,14, 7, 6, + 5, 6, 6,10, 9,12,13,13,13,13,13,13,13,13, 7, 7, + 9, 9,11,11,12,13,13,13,13,13,13,13,13, 7, 7, 8, + 8,11,12,13,13,13,13,13,13,13,13,13,12,12,10,10, + 13,12,13,13,13,13,13,13,13,13,13,12,12,10,10,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,12, + 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13, +}; + +static const static_codebook _16c1_s_p9_1 = { + 2, 225, + (long *)_vq_lengthlist__16c1_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__16c1_s_p9_1, + 0 +}; + +static const long _vq_quantlist__16c1_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__16c1_s_p9_2[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9,10, + 10,10, 9,10,10,11,12,12, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,10,10,10,11,11,10,12,11,11,13,11, 7, 7, 8, + 8, 8, 8, 9, 9, 9,10,10,10,10, 9,10,10,11,11,12, + 11,11, 8, 8, 8, 8, 9, 9,10,10,10,10,11,11,11,11, + 11,11,11,12,11,12,12, 8, 8, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,11,11,11,11,11,11,12,11, 9, 9, 9, 9, + 10,10,10,10,11,10,11,11,11,11,11,11,12,12,12,12, + 11, 9, 9, 9, 9,10,10,10,10,11,11,11,11,11,11,11, + 11,11,12,12,12,13, 9,10,10, 9,11,10,10,10,10,11, + 11,11,11,11,10,11,12,11,12,12,11,12,11,10, 9,10, + 10,11,10,11,11,11,11,11,11,11,11,11,12,12,11,12, + 12,12,10,10,10,11,10,11,11,11,11,11,11,11,11,11, + 11,11,12,13,12,12,11, 9,10,10,11,11,10,11,11,11, + 12,11,11,11,11,11,12,12,13,13,12,13,10,10,12,10, + 11,11,11,11,11,11,11,11,11,12,12,11,13,12,12,12, + 12,13,12,11,11,11,11,11,11,12,11,12,11,11,11,11, + 12,12,13,12,11,12,12,11,11,11,11,11,12,11,11,11, + 11,12,11,11,12,11,12,13,13,12,12,12,12,11,11,11, + 11,11,12,11,11,12,11,12,11,11,11,11,13,12,12,12, + 12,13,11,11,11,12,12,11,11,11,12,11,12,12,12,11, + 12,13,12,11,11,12,12,11,12,11,11,11,12,12,11,12, + 11,11,11,12,12,12,12,13,12,13,12,12,12,12,11,11, + 12,11,11,11,11,11,11,12,12,12,13,12,11,13,13,12, + 12,11,12,10,11,11,11,11,12,11,12,12,11,12,12,13, + 12,12,13,12,12,12,12,12,11,12,12,12,11,12,11,11, + 11,12,13,12,13,13,13,13,13,12,13,13,12,12,13,11, + 11,11,11,11,12,11,11,12,11, +}; + +static const static_codebook _16c1_s_p9_2 = { + 2, 441, + (long *)_vq_lengthlist__16c1_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__16c1_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__16c1_s_short[] = { + 5, 6,17, 8,12, 9,10,10,12,13, 5, 2,17, 4, 9, 5, + 7, 8,11,13,16,16,16,16,16,16,16,16,16,16, 6, 4, + 16, 5,10, 5, 7,10,14,16,13, 9,16,11, 8, 7, 8, 9, + 13,16, 7, 4,16, 5, 7, 4, 6, 8,11,13, 8, 6,16, 7, + 8, 5, 5, 7, 9,13, 9, 8,16, 9, 8, 6, 6, 7, 9,13, + 11,11,16,10,10, 7, 7, 7, 9,13,13,13,16,13,13, 9, + 9, 9,10,13, +}; + +static const static_codebook _huff_book__16c1_s_short = { + 2, 100, + (long *)_huff_lengthlist__16c1_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__16c2_s_long[] = { + 4, 7, 9, 9, 9, 8, 9,10,13,16, 5, 4, 5, 6, 7, 7, + 8, 9,12,16, 6, 5, 5, 5, 7, 7, 9,10,12,15, 7, 6, + 5, 4, 5, 6, 8, 9,10,13, 8, 7, 7, 5, 5, 5, 7, 9, + 10,12, 7, 7, 7, 6, 5, 5, 6, 7,10,12, 8, 8, 8, 7, + 7, 5, 5, 6, 9,11, 8, 9, 9, 8, 8, 6, 6, 5, 8,11, + 10,11,12,12,11, 9, 9, 8, 9,12,13,14,15,15,14,12, + 12,11,11,13, +}; + +static const static_codebook _huff_book__16c2_s_long = { + 2, 100, + (long *)_huff_lengthlist__16c2_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__16c2_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c2_s_p1_0[] = { + 1, 3, 3, 0, 0, 0, 0, 0, 0, 4, 5, 5, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c2_s_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__16c2_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16c2_s_p1_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16c2_s_p2_0[] = { + 2, 4, 4, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, + 0, 0, 8, 8, 0, 0, 0, 8, 8, 4, 4, 4, 8, 7, 0, 0, + 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 9, 9, 4, 4, 4, 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, + 8, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 7, 8, 8,10, 9, + 0, 0, 0,12,11, 0, 0, 0,11,12, 0, 0, 0,14,13, 0, + 0, 0,14,14, 7, 8, 8, 9,10, 0, 0, 0,11,12, 0, 0, + 0,11,11, 0, 0, 0,14,14, 0, 0, 0,14,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8,11,11, 0, 0, 0, + 12,11, 0, 0, 0,12,12, 0, 0, 0,13,12, 0, 0, 0,13, + 13, 8, 8, 8,11,11, 0, 0, 0,11,11, 0, 0, 0,12,12, + 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 9, 8,12,11, 0, 0, 0,12,12, 0, + 0, 0,12,11, 0, 0, 0,13,13, 0, 0, 0,13,13, 8, 8, + 8,11,12, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, + 13,14, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 9, 9,14,14, 0, 0, 0,13,13, 0, 0, 0,13, + 13, 0, 0, 0,13,12, 0, 0, 0,13,13, 8, 9, 9,14,14, + 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0,12,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, + 9, 9,14,14, 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, + 0,13,13, 0, 0, 0,13,12, 8, 9, 9,14,14, 0, 0, 0, + 13,13, 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0,12, + 12, +}; + +static const static_codebook _16c2_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__16c2_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16c2_s_p2_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16c2_s_p3_0[] = { + 1, 3, 3, 5, 5, 7, 7, 8, 8, 0, 0, 0, 6, 6, 8, 8, + 9, 9, 0, 0, 0, 6, 6, 8, 8, 9, 9, 0, 0, 0, 7, 7, + 8, 9,10,10, 0, 0, 0, 7, 7, 9, 9,10,10, 0, 0, 0, + 8, 8, 9, 9,11,11, 0, 0, 0, 7, 7, 9, 9,11,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c2_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__16c2_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16c2_s_p3_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__16c2_s_p4_0[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, + 9, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, + 11,10, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, + 10,10,10, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11, 0, 0, 0, 7, 6, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, + 11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, + 10,11,11,11,11,12,12, 0, 0, 0, 7, 8, 8, 8, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _16c2_s_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__16c2_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__16c2_s_p4_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16c2_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6,10,11,10,10, + 10,11, 4, 6, 6,10,10,11,10,11,10, 5,10,10, 9,12, + 11,10,12,12, 7,10,10,12,12,12,12,13,13, 7,11,10, + 11,12,12,12,13,13, 6,11,10,10,12,12,11,12,12, 7, + 11,10,12,13,13,12,12,12, 7,10,11,12,13,13,12,12, + 12, +}; + +static const static_codebook _16c2_s_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__16c2_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__16c2_s_p5_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16c2_s_p5_1[] = { + 2, 3, 3, 6, 6, 6, 6, 7, 7, 7, 7,11,10,10, 6, 6, + 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, + 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, 6, + 7, 8, 8, 8, 8, 9, 9,11,11,11, 7, 7, 8, 8, 8, 8, + 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, + 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,11,11, 8, 8, 8, + 8, 8, 8,12,11,11,11,11, 8, 8, 8, 8, 8, 8,12,11, + 11,11,11, 7, 7, 8, 8, 8, 8, +}; + +static const static_codebook _16c2_s_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__16c2_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16c2_s_p5_1, + 0 +}; + +static const long _vq_quantlist__16c2_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16c2_s_p6_0[] = { + 1, 4, 4, 6, 6, 8, 7, 8, 8, 9, 9,10,10, 5, 5, 5, + 7, 7, 9, 9, 9, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9,10, 9,11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10, + 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12, 0,11,11, 8, 8,10,10,11,11,12,12,13,13, 0,12, + 12, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const static_codebook _16c2_s_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__16c2_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__16c2_s_p6_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16c2_s_p6_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _16c2_s_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__16c2_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16c2_s_p6_1, + 0 +}; + +static const long _vq_quantlist__16c2_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16c2_s_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8,10, 9,10,10, 5, 5, 5, + 7, 7, 9, 9,10,10,11,10,12,11, 6, 5, 5, 7, 7, 9, + 9,10,10,11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10, + 11,11,12,12,20, 7, 7, 7, 7, 9, 9,11,10,12,11,12, + 12,20,11,11, 8, 8,10,10,11,11,12,12,13,13,20,12, + 12, 8, 8, 9, 9,11,11,12,12,13,13,20,20,21,10,10, + 10,10,11,11,12,12,13,13,21,21,21,10,10,10,10,11, + 11,12,12,13,13,21,21,21,14,14,11,11,12,12,13,13, + 13,14,21,21,21,16,15,11,11,12,11,13,13,14,14,21, + 21,21,21,21,13,13,12,12,13,13,14,14,21,21,21,21, + 21,13,13,12,12,13,13,14,14, +}; + +static const static_codebook _16c2_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__16c2_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__16c2_s_p7_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16c2_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 9, 9, 6, 7, + 7, 7, 7, 7, 8, 8, 9, 9, 9, 6, 6, 7, 7, 7, 7, 8, + 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, + 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, + 7, 7, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, + 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, 7, 8, 8, 9, 9, + 9, 9, 9, 7, 7, 7, 7, 8, 8, +}; + +static const static_codebook _16c2_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__16c2_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16c2_s_p7_1, + 0 +}; + +static const long _vq_quantlist__16c2_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16c2_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9,10,10, 6, + 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11, 6, 5, + 5, 8, 7, 9, 9, 8, 8, 9, 9,10,10,11,11,20, 8, 8, + 8, 8, 9, 9, 9, 9,10,10,11,10,12,11,20, 8, 8, 8, + 8, 9, 9, 9, 9,10,10,11,11,12,12,20,12,12, 9, 9, + 10,10,10,10,11,11,12,12,13,12,20,13,13, 9, 9,10, + 10,10,10,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9, + 10,10,11,11,12,12,13,12,20,20,20, 9, 9, 9, 8,10, + 10,12,11,12,12,13,13,20,20,20,13,13,10,10,11,11, + 12,12,13,13,13,13,20,20,20,13,13,10,10,11,10,12, + 11,13,13,14,14,20,20,20,20,20,11,11,11,11,12,12, + 13,13,14,14,20,20,20,20,20,11,10,11,11,13,11,13, + 13,14,14,20,20,21,21,21,14,14,11,12,13,13,13,13, + 14,14,21,21,21,21,21,15,15,12,11,13,12,14,13,15, + 14, +}; + +static const static_codebook _16c2_s_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__16c2_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__16c2_s_p8_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__16c2_s_p8_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,10, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10, 9,10,10,10,10,11,11,11, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, + 10,10,10,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,11,11, + 11,11, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,11,11,11,11,11,10, 9,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, + 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, + 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _16c2_s_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__16c2_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__16c2_s_p8_1, + 0 +}; + +static const long _vq_quantlist__16c2_s_p9_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__16c2_s_p9_0[] = { + 1, 4, 3,10, 8,10,10,10,10,10,10,10,10,10,10,10, + 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 6,10, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _16c2_s_p9_0 = { + 2, 289, + (long *)_vq_lengthlist__16c2_s_p9_0, + 1, -509798400, 1631393792, 5, 0, + (long *)_vq_quantlist__16c2_s_p9_0, + 0 +}; + +static const long _vq_quantlist__16c2_s_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__16c2_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 7, 8, 8,10, 9,11,10,13, + 11,14,13, 6, 6, 6, 8, 8, 8, 8, 8, 7, 9, 8,11, 9, + 13,11,14,12,14,13, 5, 6, 6, 8, 8, 8, 8, 8, 8, 9, + 9,11,11,13,11,14,13,15,15,17, 8, 8, 8, 8, 9, 9, + 9, 8,11, 9,12,10,13,11,14,12,14,13,17, 8, 8, 8, + 8, 9, 9, 9, 9,10,10,11,11,13,13,13,14,16,15,17, + 12,12, 8, 8, 9, 9,10,10,11,11,12,11,13,12,13,12, + 14,13,16,12,12, 8, 8, 9, 9,10,10,11,11,12,12,13, + 13,14,14,15,15,17,17,17, 9, 9, 9, 9,11,11,12,12, + 12,13,13,13,16,14,14,14,17,17,17, 9, 8, 9, 8,11, + 10,12,12,13,13,14,14,15,15,16,16,17,17,17,12,12, + 10,10,11,12,12,13,13,14,13,15,15,14,16,15,17,17, + 17,12,12,10, 8,12, 9,13,12,14,14,15,14,15,16,16, + 16,17,17,17,17,17,11,11,12,12,14,14,14,16,15,16, + 15,16,15,17,17,17,17,17,17,11, 9,12,10,13,11,15, + 14,16,16,17,16,16,15,17,17,17,17,17,15,15,12,12, + 14,14,15,16,16,15,16,16,17,17,17,17,17,17,17,14, + 14,12,10,14,11,15,12,17,16,15,16,17,16,17,17,17, + 17,17,17,17,13,13,14,14,14,16,17,17,16,17,17,17, + 17,17,17,17,17,17,17,13, 9,13,12,15,13,16,16,17, + 17,17,17,17,17,17,17,17,17,17,15,17,14,14,15,16, + 16,17,16,17,16,17,17,17,17,17,17,17,17,17,17,14, + 13,15,16,16,17,16,17,17,17, +}; + +static const static_codebook _16c2_s_p9_1 = { + 2, 361, + (long *)_vq_lengthlist__16c2_s_p9_1, + 1, -518287360, 1622704128, 5, 0, + (long *)_vq_quantlist__16c2_s_p9_1, + 0 +}; + +static const long _vq_quantlist__16c2_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__16c2_s_p9_2[] = { + 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _16c2_s_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__16c2_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__16c2_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__16c2_s_short[] = { + 7,10,12,11,12,13,15,16,18,15,10, 8, 8, 8, 9,10, + 12,13,14,17,10, 7, 7, 7, 7, 8,10,12,15,18,10, 7, + 7, 5, 5, 6, 8,10,13,15,10, 7, 6, 5, 4, 4, 6, 9, + 12,15,11, 7, 7, 5, 4, 3, 4, 7,11,13,12, 9, 8, 7, + 5, 4, 4, 5,10,13,11,11,11, 9, 7, 5, 5, 5, 9,12, + 13,12,13,12,10, 8, 8, 7, 9,13,14,14,14,14,13,11, + 11,10,10,13, +}; + +static const static_codebook _huff_book__16c2_s_short = { + 2, 100, + (long *)_huff_lengthlist__16c2_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__8c0_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8c0_s_p1_0[] = { + 1, 5, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, + 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 9,11,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,10, 0, 0, + 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 9,11,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,11, 0, + 0, 0, 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,11,11, + 0, 0, 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _8c0_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__8c0_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__8c0_s_p1_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8c0_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _8c0_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__8c0_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8c0_s_p3_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8c0_s_p4_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _8c0_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__8c0_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8c0_s_p4_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8c0_s_p5_0[] = { + 1, 3, 3, 5, 5, 7, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 9, 0, 0, 0, 8, 8, + 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8, 9, 9, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _8c0_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__8c0_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8c0_s_p5_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__8c0_s_p6_0[] = { + 1, 3, 3, 6, 6, 8, 8, 9, 9, 8, 8,10, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,11, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,11, + 10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10,10, + 11,11,11,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10, + 10,11,11,12,12,13,13, 0, 0, 0,10,10,10,10,11,11, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10, 9,10, + 11,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10, 9,10,11,12,12,13,13,14,13, 0, 0, 0, 0, 0, 9, + 9, 9,10,10,10,11,11,13,12,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,13,14,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,13,13,14,14,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, +}; + +static const static_codebook _8c0_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__8c0_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__8c0_s_p6_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8c0_s_p7_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,11, 9,10,12, + 9,10, 4, 7, 7,10,10,10,11, 9, 9, 6,11,10,11,11, + 12,11,11,11, 6,10,10,11,11,12,11,10,10, 6, 9,10, + 11,11,11,11,10,10, 7,10,11,12,11,11,12,11,12, 6, + 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10,10,10,11,10, + 10, +}; + +static const static_codebook _8c0_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__8c0_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__8c0_s_p7_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__8c0_s_p7_1[] = { + 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, 7, 7, + 8, 8, 9, 9, 9, 9,10,10, 9, 7, 7, 8, 8, 9, 9, 9, + 9,10,10,10, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10, 8, + 8, 9, 9, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9,10, + 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10,11,10,11, + 9, 9, 9, 9,10,10,10,10,11,11,11,10,10, 9, 9,10, + 10,10, 9,11,10,10,10,10,10,10, 9, 9,10,10,11,11, + 10,10,10, 9, 9, 9,10,10,10, +}; + +static const static_codebook _8c0_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__8c0_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__8c0_s_p7_1, + 0 +}; + +static const long _vq_quantlist__8c0_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__8c0_s_p8_0[] = { + 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 6, 6, + 7, 7, 8, 8, 7, 7, 8, 9,10,10, 7, 6, 6, 7, 7, 8, + 7, 7, 7, 9, 9,10,12, 0, 8, 8, 8, 8, 8, 9, 8, 8, + 9, 9,10,10, 0, 8, 8, 8, 8, 8, 9, 8, 9, 9, 9,11, + 10, 0, 0,13, 9, 8, 9, 9, 9, 9,10,10,11,11, 0,13, + 0, 9, 9, 9, 9, 9, 9,11,10,11,11, 0, 0, 0, 8, 9, + 10, 9,10,10,13,11,12,12, 0, 0, 0, 8, 9, 9, 9,10, + 10,13,12,12,13, 0, 0, 0,12, 0,10,10,12,11,10,11, + 12,12, 0, 0, 0,13,13,10,10,10,11,12, 0,13, 0, 0, + 0, 0, 0, 0,13,11, 0,12,12,12,13,12, 0, 0, 0, 0, + 0, 0,13,13,11,13,13,11,12, +}; + +static const static_codebook _8c0_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__8c0_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__8c0_s_p8_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8c0_s_p8_1[] = { + 1, 3, 4, 5, 5, 7, 6, 6, 6, 5, 7, 7, 7, 6, 6, 7, + 7, 7, 6, 6, 7, 7, 7, 6, 6, +}; + +static const static_codebook _8c0_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__8c0_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8c0_s_p8_1, + 0 +}; + +static const long _vq_quantlist__8c0_s_p9_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8c0_s_p9_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _8c0_s_p9_0 = { + 4, 81, + (long *)_vq_lengthlist__8c0_s_p9_0, + 1, -518803456, 1628680192, 2, 0, + (long *)_vq_quantlist__8c0_s_p9_0, + 0 +}; + +static const long _vq_quantlist__8c0_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__8c0_s_p9_1[] = { + 1, 4, 4, 5, 5,10, 8,11,11,11,11,11,11,11,11, 6, + 6, 6, 7, 6,11,10,11,11,11,11,11,11,11,11, 7, 5, + 6, 6, 6, 8, 7,11,11,11,11,11,11,11,11,11, 7, 8, + 8, 8, 9, 9,11,11,11,11,11,11,11,11,11, 9, 8, 7, + 8, 9,11,11,11,11,11,11,11,11,11,11,11,10,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11, +}; + +static const static_codebook _8c0_s_p9_1 = { + 2, 225, + (long *)_vq_lengthlist__8c0_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__8c0_s_p9_1, + 0 +}; + +static const long _vq_quantlist__8c0_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__8c0_s_p9_2[] = { + 1, 5, 5, 7, 7, 8, 7, 8, 8,10,10, 9, 9,10,10,10, + 11,11,10,12,11,12,12,12, 9, 8, 8, 8, 8, 8, 9,10, + 10,10,10,11,11,11,10,11,11,12,12,11,12, 8, 8, 7, + 7, 8, 9,10,10,10, 9,10,10, 9,10,10,11,11,11,11, + 11,11, 9, 9, 9, 9, 8, 9,10,10,11,10,10,11,11,12, + 10,10,12,12,11,11,10, 9, 9,10, 8, 9,10,10,10, 9, + 10,10,11,11,10,11,10,10,10,12,12,12, 9,10, 9,10, + 9, 9,10,10,11,11,11,11,10,10,10,11,12,11,12,11, + 12,10,11,10,11, 9,10, 9,10, 9,10,10, 9,10,10,11, + 10,11,11,11,11,12,11, 9,10,10,10,10,11,11,11,11, + 11,10,11,11,11,11,10,12,10,12,12,11,12,10,10,11, + 10, 9,11,10,11, 9,10,11,10,10,10,11,11,11,11,12, + 12,10, 9, 9,11,10, 9,12,11,10,12,12,11,11,11,11, + 10,11,11,12,11,10,12, 9,11,10,11,10,10,11,10,11, + 9,10,10,10,11,12,11,11,12,11,10,10,11,11, 9,10, + 10,12,10,11,10,10,10, 9,10,10,10,10, 9,10,10,11, + 11,11,11,12,11,10,10,10,10,11,11,10,11,11, 9,11, + 10,12,10,12,11,10,11,10,10,10,11,10,10,11,11,10, + 11,10,10,10,10,11,11,12,10,10,10,11,10,11,12,11, + 10,11,10,10,11,11,10,12,10, 9,10,10,11,11,11,10, + 12,10,10,11,11,11,10,10,11,10,10,10,11,10,11,10, + 12,11,11,10,10,10,12,10,10,11, 9,10,11,11,11,10, + 10,11,10,10, 9,11,11,12,12,11,12,11,11,11,11,11, + 11, 9,10,11,10,12,10,10,10,10,11,10,10,11,10,10, + 12,10,10,10,10,10, 9,12,10,10,10,10,12, 9,11,10, + 10,11,10,12,12,10,12,12,12,10,10,10,10, 9,10,11, + 10,10,12,10,10,12,11,10,11,10,10,12,11,10,12,10, + 10,11, 9,11,10, 9,10, 9,10, +}; + +static const static_codebook _8c0_s_p9_2 = { + 2, 441, + (long *)_vq_lengthlist__8c0_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__8c0_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__8c0_s_single[] = { + 4, 5,18, 7,10, 6, 7, 8, 9,10, 5, 2,18, 5, 7, 5, + 6, 7, 8,11,17,17,17,17,17,17,17,17,17,17, 7, 4, + 17, 6, 9, 6, 8,10,12,15,11, 7,17, 9, 6, 6, 7, 9, + 11,15, 6, 4,17, 6, 6, 4, 5, 8,11,16, 6, 6,17, 8, + 6, 5, 6, 9,13,16, 8, 9,17,11, 9, 8, 8,11,13,17, + 9,12,17,15,14,13,12,13,14,17,12,15,17,17,17,17, + 17,16,17,17, +}; + +static const static_codebook _huff_book__8c0_s_single = { + 2, 100, + (long *)_huff_lengthlist__8c0_s_single, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__8c1_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8c1_s_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 8, 8,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 8,10, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _8c1_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__8c1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__8c1_s_p1_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8c1_s_p3_0[] = { + 2, 4, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _8c1_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__8c1_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8c1_s_p3_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8c1_s_p4_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _8c1_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__8c1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8c1_s_p4_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8c1_s_p5_0[] = { + 1, 3, 3, 4, 5, 6, 6, 8, 8, 0, 0, 0, 8, 8, 7, 7, + 9, 9, 0, 0, 0, 8, 8, 7, 7, 9, 9, 0, 0, 0, 9,10, + 8, 8, 9, 9, 0, 0, 0,10,10, 8, 8, 9, 9, 0, 0, 0, + 11,10, 8, 8,10,10, 0, 0, 0,11,11, 8, 8,10,10, 0, + 0, 0,12,12, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _8c1_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__8c1_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8c1_s_p5_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__8c1_s_p6_0[] = { + 1, 3, 3, 5, 5, 8, 8, 8, 8, 9, 9,10,10,11,11,11, + 11, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11,11, + 12,12,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11, + 11,12,12,12,12, 0, 0, 0,10,10, 9, 9,10,10,10,10, + 11,11,12,12,13,13, 0, 0, 0,10,10, 9, 9,10,10,10, + 10,11,11,12,12,13,13, 0, 0, 0,11,11, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,11,11,11,11,12,12,13,12,13,13, 0, 0, 0, 0, + 0, 0, 0,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, + 14, +}; + +static const static_codebook _8c1_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__8c1_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__8c1_s_p6_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8c1_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10, 9,10,11,10,10, 6, 9, 9, + 10, 9, 9,11, 9,10, 7,10,10,11,11,11,11,10,10, 6, + 9, 9,10,10,10,11, 9, 9, 6, 9, 9,10,10,10,10, 9, + 9, +}; + +static const static_codebook _8c1_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__8c1_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__8c1_s_p7_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__8c1_s_p7_1[] = { + 2, 3, 3, 5, 5, 7, 7, 7, 7, 7, 7,10,10, 9, 7, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, + 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 8, 8, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _8c1_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__8c1_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__8c1_s_p7_1, + 0 +}; + +static const long _vq_quantlist__8c1_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__8c1_s_p8_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10, 9,10,11,11,11, 0,13, + 12, 9, 8, 9, 9,10,10,11,11,12,11, 0, 0, 0, 9, 9, + 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 9,10, + 10,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,12,11, + 13,12, 0, 0, 0,14,14,10,10,11,10,11,11,12,12, 0, + 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,10,12,11,13,12, +}; + +static const static_codebook _8c1_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__8c1_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__8c1_s_p8_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8c1_s_p8_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _8c1_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__8c1_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8c1_s_p8_1, + 0 +}; + +static const long _vq_quantlist__8c1_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__8c1_s_p9_0[] = { + 1, 3, 3,10,10,10,10,10,10,10,10,10,10, 5, 6, 6, + 10,10,10,10,10,10,10,10,10,10, 6, 7, 8,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9, 9, 9, +}; + +static const static_codebook _8c1_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__8c1_s_p9_0, + 1, -513964032, 1628680192, 4, 0, + (long *)_vq_quantlist__8c1_s_p9_0, + 0 +}; + +static const long _vq_quantlist__8c1_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__8c1_s_p9_1[] = { + 1, 4, 4, 5, 5, 7, 7, 9, 9,11,11,12,12,13,13, 6, + 5, 5, 6, 6, 9, 9,10,10,12,12,12,13,15,14, 6, 5, + 5, 7, 7, 9, 9,10,10,12,12,12,13,14,13,17, 7, 7, + 8, 8,10,10,11,11,12,13,13,13,13,13,17, 7, 7, 8, + 8,10,10,11,11,13,13,13,13,14,14,17,11,11, 9, 9, + 11,11,12,12,12,13,13,14,15,13,17,12,12, 9, 9,11, + 11,12,12,13,13,13,13,14,16,17,17,17,11,12,12,12, + 13,13,13,14,15,14,15,15,17,17,17,12,12,11,11,13, + 13,14,14,15,14,15,15,17,17,17,15,15,13,13,14,14, + 15,14,15,15,16,15,17,17,17,15,15,13,13,13,14,14, + 15,15,15,15,16,17,17,17,17,16,14,15,14,14,15,14, + 14,15,15,15,17,17,17,17,17,14,14,16,14,15,15,15, + 15,15,15,17,17,17,17,17,17,16,16,15,17,15,15,14, + 17,15,17,16,17,17,17,17,16,15,14,15,15,15,15,15, + 15, +}; + +static const static_codebook _8c1_s_p9_1 = { + 2, 225, + (long *)_vq_lengthlist__8c1_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__8c1_s_p9_1, + 0 +}; + +static const long _vq_quantlist__8c1_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__8c1_s_p9_2[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, + 9, 9, 9, 9, 9,11,11,12, 7, 7, 7, 7, 8, 8, 9, 9, + 9, 9,10,10,10,10,10,10,10,10,11,11,11, 7, 7, 7, + 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,11, + 11,12, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10, + 10,10,10,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,11,12,11, 9, 9, 8, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,10,11,11,11,11,11, 8, 8, 9, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,12,11, + 12,11, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,12,11,12,11,11, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10,12,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,12,11,11,12,11,10,10,10,10,10,10,10,10, + 10,10,10,10,11,10,11,11,11,11,11,11,11,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,11,11,12,11,12, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,12,11,12,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,12,11,11,12,11,11,12,10,10, + 11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,12, + 12,11,12,11,11,12,12,12,11,11,10,10,10,10,10,10, + 10,10,10,11,12,12,11,12,12,11,12,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _8c1_s_p9_2 = { + 2, 441, + (long *)_vq_lengthlist__8c1_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__8c1_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__8c1_s_single[] = { + 4, 6,18, 8,11, 8, 8, 9, 9,10, 4, 4,18, 5, 9, 5, + 6, 7, 8,10,18,18,18,18,17,17,17,17,17,17, 7, 5, + 17, 6,11, 6, 7, 8, 9,12,12, 9,17,12, 8, 8, 9,10, + 10,13, 7, 5,17, 6, 8, 4, 5, 6, 8,10, 6, 5,17, 6, + 8, 5, 4, 5, 7, 9, 7, 7,17, 8, 9, 6, 5, 5, 6, 8, + 8, 8,17, 9,11, 8, 6, 6, 6, 7, 9,10,17,12,12,10, + 9, 7, 7, 8, +}; + +static const static_codebook _huff_book__8c1_s_single = { + 2, 100, + (long *)_huff_lengthlist__8c1_s_single, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c2_s_long[] = { + 6, 6,12,10,10,10, 9,10,12,12, 6, 1,10, 5, 6, 6, + 7, 9,11,14,12, 9, 8,11, 7, 8, 9,11,13,15,10, 5, + 12, 7, 8, 7, 9,12,14,15,10, 6, 7, 8, 5, 6, 7, 9, + 12,14, 9, 6, 8, 7, 6, 6, 7, 9,12,12, 9, 7, 9, 9, + 7, 6, 6, 7,10,10,10, 9,10,11, 8, 7, 6, 6, 8,10, + 12,11,13,13,11,10, 8, 8, 8,10,11,13,15,15,14,13, + 10, 8, 8, 9, +}; + +static const static_codebook _huff_book__44c2_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c2_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c2_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c2_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c2_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c2_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c2_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c2_s_p2_0[] = { + 1, 4, 4, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, + 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 4, 6, 6, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0,11,11, 0, 0, + 0,11,11, 0, 0, 0,12,11, 0, 0, 0, 0, 0, 0, 0, 7, + 8, 8, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, 0,11, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0,11,11, 0, 0, 0,11,11, + 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, + 0, 0,10,11, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 9, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, + 12,11, 0, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0,12, + 11, 0, 0, 0,12,11, 0, 0, 0,11,12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c2_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c2_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c2_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c2_s_p3_0[] = { + 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c2_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44c2_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c2_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c2_s_p4_0[] = { + 1, 3, 3, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 7, 7, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c2_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c2_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c2_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c2_s_p5_0[] = { + 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 7, 7, 7, 7, 7, 7, + 9, 9, 0, 7, 7, 7, 7, 7, 7, 9, 9, 0, 8, 8, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, +}; + +static const static_codebook _44c2_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44c2_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c2_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c2_s_p6_0[] = { + 1, 4, 3, 6, 6, 8, 8, 9, 9, 9, 9, 9, 9,10,10,11, + 11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,11,12, 0, 8, 8, 7, 7, 9, 9,10,10, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,12,12,13,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, + 14, +}; + +static const static_codebook _44c2_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__44c2_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c2_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c2_s_p7_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,10, 9, 9, 7,10,10,11,10, + 11,11,10,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, + 11,10,11,11,10,10, 7,11,10,11,11,11,12,11,11, 6, + 9, 9,11,10,10,11,11,10, 6, 9, 9,11,10,10,12,10, + 11, +}; + +static const static_codebook _44c2_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44c2_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c2_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c2_s_p7_1[] = { + 2, 3, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 7, 7, 6, 6, + 7, 7, 8, 8, 8, 8, 9, 6, 6, 6, 6, 7, 7, 8, 8, 8, + 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c2_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c2_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c2_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c2_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c2_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 5, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, + 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, + 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, + 11,12,12,12,12, 0, 0, 0,14,14,10,11,11,11,12,12, + 13,13, 0, 0, 0,14,14,11,10,11,11,13,12,13,13, 0, + 0, 0, 0, 0,12,12,11,12,13,12,14,14, 0, 0, 0, 0, + 0,12,12,12,12,13,12,14,14, +}; + +static const static_codebook _44c2_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__44c2_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c2_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c2_s_p8_1[] = { + 2, 4, 4, 5, 4, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c2_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__44c2_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c2_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c2_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c2_s_p9_0[] = { + 1, 5, 4,12,12,12,12,12,12,12,12,12,12, 4, 9, 8, + 11,11,11,11,11,11,11,11,11,11, 2, 8, 7,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11, +}; + +static const static_codebook _44c2_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__44c2_s_p9_0, + 1, -514541568, 1627103232, 4, 0, + (long *)_vq_quantlist__44c2_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c2_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c2_s_p9_1[] = { + 1, 4, 4, 6, 6, 7, 6, 8, 8,10, 9,10,10, 6, 5, 5, + 7, 7, 8, 7,10, 9,11,11,12,13, 6, 5, 5, 7, 7, 8, + 8,10,10,11,11,13,13,18, 8, 8, 8, 8, 9, 9,10,10, + 12,12,12,13,18, 8, 8, 8, 8, 9, 9,10,10,12,12,13, + 13,18,11,11, 8, 8,10,10,11,11,12,11,13,12,18,11, + 11, 9, 7,10,10,11,11,11,12,12,13,17,17,17,10,10, + 11,11,12,12,12,10,12,12,17,17,17,11,10,11,10,13, + 12,11,12,12,12,17,17,17,15,14,11,11,12,11,13,10, + 13,12,17,17,17,14,14,12,10,11,11,13,13,13,13,17, + 17,16,17,16,13,13,12,10,13,10,14,13,17,16,17,16, + 17,13,12,12,10,13,11,14,14, +}; + +static const static_codebook _44c2_s_p9_1 = { + 2, 169, + (long *)_vq_lengthlist__44c2_s_p9_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44c2_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c2_s_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c2_s_p9_2[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9,10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 8, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 9, 9, 9,10,11,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9,10,10,10,10,11,10, 8, 8, 9, 9, 9, 9, + 9, 9,10, 9, 9,10, 9,10,11,10,11,11,11, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,11,11,11,11,11, 9, 9, + 9, 9, 9, 9,10, 9, 9, 9,10,10,11,11,11,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,11,11,11,11,11, + 9, 9, 9, 9,10,10, 9, 9, 9,10,10,10,11,11,11,11, + 11,11,11, 9, 9, 9,10, 9, 9,10,10,10,10,11,11,10, + 11,11,11,11,10, 9,10,10, 9, 9, 9, 9,10,10,11,10, + 11,11,11,11,11, 9, 9, 9, 9,10, 9,10,10,10,10,11, + 10,11,11,11,11,11,10,10, 9, 9,10, 9,10,10,10,10, + 10,10,10,11,11,11,11,11,11, 9, 9,10, 9,10, 9,10, + 10, +}; + +static const static_codebook _44c2_s_p9_2 = { + 2, 289, + (long *)_vq_lengthlist__44c2_s_p9_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c2_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c2_s_short[] = { + 11, 9,13,12,12,11,12,12,13,15, 8, 2,11, 4, 8, 5, + 7,10,12,15,13, 7,10, 9, 8, 8,10,13,17,17,11, 4, + 12, 5, 9, 5, 8,11,14,16,12, 6, 8, 7, 6, 6, 8,11, + 13,16,11, 4, 9, 5, 6, 4, 6,10,13,16,11, 6,11, 7, + 7, 6, 7,10,13,15,13, 9,12, 9, 8, 6, 8,10,12,14, + 14,10,10, 8, 6, 5, 6, 9,11,13,15,11,11, 9, 6, 5, + 6, 8, 9,12, +}; + +static const static_codebook _huff_book__44c2_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c2_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c3_s_long[] = { + 5, 6,11,11,11,11,10,10,12,11, 5, 2,11, 5, 6, 6, + 7, 9,11,13,13,10, 7,11, 6, 7, 8, 9,10,12,11, 5, + 11, 6, 8, 7, 9,11,14,15,11, 6, 6, 8, 4, 5, 7, 8, + 10,13,10, 5, 7, 7, 5, 5, 6, 8,10,11,10, 7, 7, 8, + 6, 5, 5, 7, 9, 9,11, 8, 8,11, 8, 7, 6, 6, 7, 9, + 12,11,10,13, 9, 9, 7, 7, 7, 9,11,13,12,15,12,11, + 9, 8, 8, 8, +}; + +static const static_codebook _huff_book__44c3_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c3_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c3_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c3_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c3_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c3_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c3_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c3_s_p2_0[] = { + 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, + 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, + 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, + 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, + 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0, 9, + 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c3_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c3_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c3_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c3_s_p3_0[] = { + 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c3_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44c3_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c3_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c3_s_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c3_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c3_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c3_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c3_s_p5_0[] = { + 1, 3, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 7, 8, + 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, + 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, + 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, + 11, +}; + +static const static_codebook _44c3_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44c3_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c3_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c3_s_p6_0[] = { + 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 10, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, + 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,10,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 8, + 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, + 8, 9, 9,10,10,11,11,12,11,12,12, 0, 0, 0, 0, 0, + 9,10,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, + 13, +}; + +static const static_codebook _44c3_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__44c3_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c3_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c3_s_p7_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, + 10,12,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, + 11,10,10,11,10,10, 7,11,11,11,11,11,12,11,11, 6, + 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, + 10, +}; + +static const static_codebook _44c3_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44c3_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c3_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c3_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c3_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c3_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c3_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c3_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c3_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, + 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,12, 0,13, + 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, + 10,10,11,11,12,12,12,12, 0, 0, 0,10,10,10,10,11, + 11,12,12,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, + 13,13, 0, 0, 0,14,14,11,11,11,11,12,12,13,13, 0, + 0, 0, 0, 0,12,12,12,12,13,13,14,13, 0, 0, 0, 0, + 0,13,13,12,12,13,12,14,13, +}; + +static const static_codebook _44c3_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__44c3_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c3_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c3_s_p8_1[] = { + 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c3_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__44c3_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c3_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c3_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c3_s_p9_0[] = { + 1, 4, 4,12,12,12,12,12,12,12,12,12,12, 4, 9, 8, + 12,12,12,12,12,12,12,12,12,12, 2, 9, 7,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,11,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11, +}; + +static const static_codebook _44c3_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__44c3_s_p9_0, + 1, -514332672, 1627381760, 4, 0, + (long *)_vq_quantlist__44c3_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c3_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c3_s_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 9,10,10,10,10, 6, + 5, 5, 7, 7, 8, 8,10, 8,11,10,12,12,13,13, 6, 5, + 5, 7, 7, 8, 8,10, 9,11,11,12,12,13,12,18, 8, 8, + 8, 8, 9, 9,10, 9,11,10,12,12,13,13,18, 8, 8, 8, + 8, 9, 9,10,10,11,11,13,12,14,13,18,11,11, 9, 9, + 10,10,11,11,11,12,13,12,13,14,18,11,11, 9, 8,11, + 10,11,11,11,11,12,12,14,13,18,18,18,10,11,10,11, + 12,12,12,12,13,12,14,13,18,18,18,10,11,11, 9,12, + 11,12,12,12,13,13,13,18,18,17,14,14,11,11,12,12, + 13,12,14,12,14,13,18,18,18,14,14,11,10,12, 9,12, + 13,13,13,13,13,18,18,17,16,18,13,13,12,12,13,11, + 14,12,14,14,17,18,18,17,18,13,12,13,10,12,11,14, + 14,14,14,17,18,18,18,18,15,16,12,12,13,10,14,12, + 14,15,18,18,18,16,17,16,14,12,11,13,10,13,13,14, + 15, +}; + +static const static_codebook _44c3_s_p9_1 = { + 2, 225, + (long *)_vq_lengthlist__44c3_s_p9_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__44c3_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c3_s_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c3_s_p9_2[] = { + 2, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9,10, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11,11, 9, 9, + 9, 9, 9, 9,10,10, 9, 9,10, 9,11,10,11,11,11, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,11,11,11,11,11, + 9, 9, 9, 9,10,10, 9, 9, 9, 9,10, 9,11,11,11,11, + 11,11,11, 9, 9, 9, 9, 9, 9,10,10,10,10,11,11,11, + 11,11,11,11,10, 9,10,10, 9,10, 9, 9,10, 9,11,10, + 10,11,11,11,11, 9,10, 9, 9, 9, 9,10,10,10,10,11, + 11,11,11,11,11,10,10,10, 9, 9,10, 9,10, 9,10,10, + 10,10,11,11,11,11,11,11,11, 9, 9, 9, 9, 9,10,10, + 10, +}; + +static const static_codebook _44c3_s_p9_2 = { + 2, 289, + (long *)_vq_lengthlist__44c3_s_p9_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c3_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c3_s_short[] = { + 10, 9,13,11,14,10,12,13,13,14, 7, 2,12, 5,10, 5, + 7,10,12,14,12, 6, 9, 8, 7, 7, 9,11,13,16,10, 4, + 12, 5,10, 6, 8,12,14,16,12, 6, 8, 7, 6, 5, 7,11, + 12,16,10, 4, 8, 5, 6, 4, 6, 9,13,16,10, 6,10, 7, + 7, 6, 7, 9,13,15,12, 9,11, 9, 8, 6, 7,10,12,14, + 14,11,10, 9, 6, 5, 6, 9,11,13,15,13,11,10, 6, 5, + 6, 8, 9,11, +}; + +static const static_codebook _huff_book__44c3_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c3_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c4_s_long[] = { + 4, 7,11,11,11,11,10,11,12,11, 5, 2,11, 5, 6, 6, + 7, 9,11,12,11, 9, 6,10, 6, 7, 8, 9,10,11,11, 5, + 11, 7, 8, 8, 9,11,13,14,11, 6, 5, 8, 4, 5, 7, 8, + 10,11,10, 6, 7, 7, 5, 5, 6, 8, 9,11,10, 7, 8, 9, + 6, 6, 6, 7, 8, 9,11, 9, 9,11, 7, 7, 6, 6, 7, 9, + 12,12,10,13, 9, 8, 7, 7, 7, 8,11,13,11,14,11,10, + 9, 8, 7, 7, +}; + +static const static_codebook _huff_book__44c4_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c4_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c4_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c4_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c4_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c4_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c4_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c4_s_p2_0[] = { + 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, + 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 7, 7, 0, 0, + 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, + 7, 8, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, + 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0, 9, + 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c4_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c4_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c4_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c4_s_p3_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c4_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44c4_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c4_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c4_s_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c4_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c4_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c4_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c4_s_p5_0[] = { + 2, 3, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 5, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10, 9, 0, 0, 0, + 9, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _44c4_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44c4_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c4_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c4_s_p6_0[] = { + 2, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11, + 11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, + 11,11, 0, 4, 4, 7, 6, 8, 8, 9, 9, 9, 9,10,10,11, + 11,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, + 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9, + 9,10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, + 9, 9, 9,10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,11,11,12,12,13,12, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,11,11,12,12,12,12, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,12,12,13,13,13,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,12,13,13, + 13, +}; + +static const static_codebook _44c4_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__44c4_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c4_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c4_s_p7_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, + 10,11,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, + 11,10,10,11,10,10, 7,11,11,12,11,11,12,11,11, 6, + 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, + 10, +}; + +static const static_codebook _44c4_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44c4_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c4_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c4_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, + 10,10,10, 8, 8, 8, 8, 9, 9, +}; + +static const static_codebook _44c4_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c4_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c4_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c4_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c4_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10,10,10,10,11,11, 0,13, + 13, 9, 9,10, 9,10,10,11,11,11,12, 0, 0, 0,10,10, + 10,10,10,10,11,11,12,12, 0, 0, 0,10,10,10,10,10, + 10,11,11,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, + 12,12, 0, 0, 0,14,14,11,11,11,11,12,12,12,13, 0, + 0, 0, 0, 0,12,12,12,12,12,12,13,13, 0, 0, 0, 0, + 0,13,12,12,12,12,12,13,13, +}; + +static const static_codebook _44c4_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__44c4_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c4_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c4_s_p8_1[] = { + 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 5, 4, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c4_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__44c4_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c4_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c4_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c4_s_p9_0[] = { + 1, 3, 3,12,12,12,12,12,12,12,12,12,12, 4, 7, 7, + 12,12,12,12,12,12,12,12,12,12, 3, 8, 8,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12, +}; + +static const static_codebook _44c4_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__44c4_s_p9_0, + 1, -513964032, 1628680192, 4, 0, + (long *)_vq_quantlist__44c4_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c4_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c4_s_p9_1[] = { + 1, 4, 4, 5, 5, 7, 7, 9, 8,10, 9,10,10,10,10, 6, + 5, 5, 7, 7, 9, 8,10, 9,11,10,12,12,13,13, 6, 5, + 5, 7, 7, 9, 9,10,10,11,11,12,12,12,13,19, 8, 8, + 8, 8, 9, 9,10,10,12,11,12,12,13,13,19, 8, 8, 8, + 8, 9, 9,11,11,12,12,13,13,13,13,19,12,12, 9, 9, + 11,11,11,11,12,11,13,12,13,13,18,12,12, 9, 9,11, + 10,11,11,12,12,12,13,13,14,19,18,18,11,11,11,11, + 12,12,13,12,13,13,14,14,16,18,18,11,11,11,10,12, + 11,13,13,13,13,13,14,17,18,18,14,15,11,12,12,13, + 13,13,13,14,14,14,18,18,18,15,15,12,10,13,10,13, + 13,13,13,13,14,18,17,18,17,18,12,13,12,13,13,13, + 14,14,16,14,18,17,18,18,17,13,12,13,10,12,12,14, + 14,14,14,17,18,18,18,18,14,15,12,12,13,12,14,14, + 15,15,18,18,18,17,18,15,14,12,11,12,12,14,14,14, + 15, +}; + +static const static_codebook _44c4_s_p9_1 = { + 2, 225, + (long *)_vq_lengthlist__44c4_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44c4_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c4_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44c4_s_p9_2[] = { + 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 9, 9, 9, 9,11, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10,11, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,11, + 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10,10,10,12,11,11, 7, 7, 8, 8, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,12,11,12, 8, 8, 8, 8, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,10,10,10, + 10,10,10,11,11,12, 9, 9, 9, 9, 9, 9,10, 9,10,10, + 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,10,10,10,10,11,12,11, + 11,11, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,11,11,11,12,12,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,11,12,11,12, + 11,11,11, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10,11,12,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,11,11,11,12,11,11,11,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,12,11,11,12,11, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,11,11,12,12,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10,10,12,12,12,11,11,11, + 12,11,11,11,10,10,10,10,10,10,10,10,10,10,10,12, + 11,12,12,12,12,12,11,12,11,11,10,10,10,10,10,10, + 10,10,10,10,12,12,12,12,11,11,11,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44c4_s_p9_2 = { + 2, 441, + (long *)_vq_lengthlist__44c4_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44c4_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c4_s_short[] = { + 4, 7,14,10,15,10,12,15,16,15, 4, 2,11, 5,10, 6, + 8,11,14,14,14,10, 7,11, 6, 8,10,11,13,15, 9, 4, + 11, 5, 9, 6, 9,12,14,15,14, 9, 6, 9, 4, 5, 7,10, + 12,13, 9, 5, 7, 6, 5, 5, 7,10,13,13,10, 8, 9, 8, + 7, 6, 8,10,14,14,13,11,10,10, 7, 7, 8,11,14,15, + 13,12, 9, 9, 6, 5, 7,10,14,17,15,13,11,10, 6, 6, + 7, 9,12,17, +}; + +static const static_codebook _huff_book__44c4_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c4_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c5_s_long[] = { + 3, 8, 9,13,10,12,12,12,12,12, 6, 4, 6, 8, 6, 8, + 10,10,11,12, 8, 5, 4,10, 4, 7, 8, 9,10,11,13, 8, + 10, 8, 9, 9,11,12,13,14,10, 6, 4, 9, 3, 5, 6, 8, + 10,11,11, 8, 6, 9, 5, 5, 6, 7, 9,11,12, 9, 7,11, + 6, 6, 6, 7, 8,10,12,11, 9,12, 7, 7, 6, 6, 7, 9, + 13,12,10,13, 9, 8, 7, 7, 7, 8,11,15,11,15,11,10, + 9, 8, 7, 7, +}; + +static const static_codebook _huff_book__44c5_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c5_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c5_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c5_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c5_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c5_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c5_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c5_s_p2_0[] = { + 2, 4, 4, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, + 8, 7, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, + 8, 0, 0, 0, 8, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 4, 6, 6, 0, 0, 0, 8, 8, 0, 0, 0, 7, 8, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 8, 8, 0, 0, + 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 5, + 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, + 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8,10,10, 0, 0, 0,10,10, 0, 0, 0, 9,10, 0, 0, 0, + 11,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0,10, + 10, 0, 0, 0,10,10, 0, 0, 0,10,11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c5_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c5_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c5_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c5_s_p3_0[] = { + 2, 4, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c5_s_p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44c5_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c5_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c5_s_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c5_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c5_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c5_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c5_s_p5_0[] = { + 2, 4, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, + 7, 7, 9, 9, 0, 0, 0, 7, 6, 7, 7, 9, 9, 0, 0, 0, + 8, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0, 9, 9, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _44c5_s_p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44c5_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c5_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c5_s_p6_0[] = { + 2, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10,11, + 11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, + 11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 9,10,10,10, + 10,11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, + 10,10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, + 9, 9,10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,11,12,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,12,13,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,12,13,13,13,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, + 13, +}; + +static const static_codebook _44c5_s_p6_0 = { + 2, 289, + (long *)_vq_lengthlist__44c5_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c5_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c5_s_p7_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, + 10,11,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, + 11,10,10,11,10,10, 7,11,11,12,11,11,12,11,11, 6, + 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, + 10, +}; + +static const static_codebook _44c5_s_p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44c5_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c5_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c5_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 9,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c5_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c5_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c5_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c5_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c5_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 8, 9,10,10,10,10, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9,10,10,10,10,10,11,11, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0,10,10, + 10,10,10,10,11,11,11,11, 0, 0, 0,10,10,10,10,10, + 10,11,11,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, + 12,12, 0, 0, 0,14,14,11,11,11,11,12,12,12,12, 0, + 0, 0, 0, 0,12,12,12,12,12,12,13,13, 0, 0, 0, 0, + 0,12,12,12,12,12,12,13,13, +}; + +static const static_codebook _44c5_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__44c5_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c5_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c5_s_p8_1[] = { + 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c5_s_p8_1 = { + 2, 25, + (long *)_vq_lengthlist__44c5_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c5_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c5_s_p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c5_s_p9_0[] = { + 1, 3, 3,13,13,13,13,13,13,13,13,13,13,13,13, 4, + 7, 7,13,13,13,13,13,13,13,13,13,13,13,13, 3, 8, + 6,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12, + 12, +}; + +static const static_codebook _44c5_s_p9_0 = { + 2, 225, + (long *)_vq_lengthlist__44c5_s_p9_0, + 1, -512522752, 1628852224, 4, 0, + (long *)_vq_quantlist__44c5_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c5_s_p9_1[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c5_s_p9_1[] = { + 1, 4, 4, 5, 5, 7, 7, 9, 8,10, 9,10,10,11,10,11, + 11, 6, 5, 5, 7, 7, 8, 9,10,10,11,10,12,11,12,11, + 13,12, 6, 5, 5, 7, 7, 9, 9,10,10,11,11,12,12,13, + 12,13,13,18, 8, 8, 8, 8, 9, 9,10,11,11,11,12,11, + 13,11,13,12,18, 8, 8, 8, 8,10,10,11,11,12,12,13, + 13,13,13,13,14,18,12,12, 9, 9,11,11,11,11,12,12, + 13,12,13,12,13,13,20,13,12, 9, 9,11,11,11,11,12, + 12,13,13,13,14,14,13,20,18,19,11,12,11,11,12,12, + 13,13,13,13,13,13,14,13,18,19,19,12,11,11,11,12, + 12,13,12,13,13,13,14,14,13,18,17,19,14,15,12,12, + 12,13,13,13,14,14,14,14,14,14,19,19,19,16,15,12, + 11,13,12,14,14,14,13,13,14,14,14,19,18,19,18,19, + 13,13,13,13,14,14,14,13,14,14,14,14,18,17,19,19, + 19,13,13,13,11,13,11,13,14,14,14,14,14,19,17,17, + 18,18,16,16,13,13,13,13,14,13,15,15,14,14,19,19, + 17,17,18,16,16,13,11,14,10,13,12,14,14,14,14,19, + 19,19,19,19,18,17,13,14,13,11,14,13,14,14,15,15, + 19,19,19,17,19,18,18,14,13,12,11,14,11,15,15,15, + 15, +}; + +static const static_codebook _44c5_s_p9_1 = { + 2, 289, + (long *)_vq_lengthlist__44c5_s_p9_1, + 1, -520814592, 1620377600, 5, 0, + (long *)_vq_quantlist__44c5_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c5_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44c5_s_p9_2[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 9,11, 5, 6, 7, 7, 8, 7, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, 5, 5, 7, 7, 7, + 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10, 9,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, + 9, 9, 9,10, 9,10,10,10,10,10,10,10,10,11,11,11, + 11,11, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10,10,10,10,10,10,11,11,11,11,11, 9, 9,10, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, + 11,11,11, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, + 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, + 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44c5_s_p9_2 = { + 2, 441, + (long *)_vq_lengthlist__44c5_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44c5_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c5_s_short[] = { + 5, 8,10,14,11,11,12,16,15,17, 5, 5, 7, 9, 7, 8, + 10,13,17,17, 7, 5, 5,10, 5, 7, 8,11,13,15,10, 8, + 10, 8, 8, 8,11,15,18,18, 8, 5, 5, 8, 3, 4, 6,10, + 14,16, 9, 7, 6, 7, 4, 3, 5, 9,14,18,10, 9, 8,10, + 6, 5, 6, 9,14,18,12,12,11,12, 8, 7, 8,11,14,18, + 14,13,12,10, 7, 5, 6, 9,14,18,14,14,13,10, 6, 5, + 6, 8,11,16, +}; + +static const static_codebook _huff_book__44c5_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c5_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c6_s_long[] = { + 3, 8,11,13,14,14,13,13,16,14, 6, 3, 4, 7, 9, 9, + 10,11,14,13,10, 4, 3, 5, 7, 7, 9,10,13,15,12, 7, + 4, 4, 6, 6, 8,10,13,15,12, 8, 6, 6, 6, 6, 8,10, + 13,14,11, 9, 7, 6, 6, 6, 7, 8,12,11,13,10, 9, 8, + 7, 6, 6, 7,11,11,13,11,10, 9, 9, 7, 7, 6,10,11, + 13,13,13,13,13,11, 9, 8,10,12,12,15,15,16,15,12, + 11,10,10,12, +}; + +static const static_codebook _huff_book__44c6_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c6_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c6_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c6_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 9, 0, + 9, 8, 5, 7, 8, 0, 9, 9, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, + 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 9, 0, 8, 8, 0, 8, 8, 5, 9, 9, 0, 8, 8, 0, 8, + 8, +}; +static const static_codebook _44c6_s_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44c6_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c6_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c6_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, + 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, + 8,10,10, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, + 11,11, 5, 7, 7, 9, 9, 0, 8, 8,10,10, 0, 7, 8, 9, + 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,11, + 0,11,11,12,12, 0,11,10,12,12, 0,13,14,14,14, 0, + 0, 0,14,13, 8, 9, 9,11,11, 0,11,11,12,12, 0,10, + 11,12,12, 0,14,13,14,14, 0, 0, 0,13,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, + 0, 7, 7,10,10, 0, 9, 9,11,10, 0, 0, 0,11,11, 5, + 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, + 9,10,11, 0, 0, 0,11,11, 8,10, 9,12,12, 0,10,10, + 12,12, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, + 13, 8, 9,10,12,12, 0,10,10,11,12, 0,10,10,12,12, + 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, 0, 7, 7, + 10,10, 0, 9, 9,10,11, 0, 0, 0,11,10, 5, 8, 8,11, + 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,11, + 0, 0, 0,10,11, 8,10,10,12,12, 0,10,10,12,12, 0, + 10,10,12,12, 0,12,13,13,13, 0, 0, 0,14,13, 8,10, + 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,13,12, + 13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10,10,14,13, 0, 9, 9,13,12, 0, 9, 9,12,12, 0, + 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,14, 0, 9, + 9,12,13, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, + 12,12, 9,11,11,14,13, 0,11,10,14,13, 0,11,11,13, + 13, 0,12,12,13,13, 0, 0, 0,13,13, 9,11,11,13,14, + 0,10,11,13,14, 0,11,11,13,13, 0,12,12,13,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 11,11,14,14, 0,11,11,13,13, 0,11,10,13,13, 0,12, + 12,13,13, 0, 0, 0,13,13, 9,11,11,14,14, 0,11,11, + 13,13, 0,10,11,13,13, 0,12,12,14,13, 0, 0, 0,13, + 13, +}; + +static const static_codebook _44c6_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c6_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c6_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c6_s_p3_0[] = { + 2, 3, 4, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9,10, 0, 4, 4, 6, 6, 7, 7,10, 9, 0, 5, 5, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 6, 8, 8,10,10, 0, 0, 0, + 7, 7, 9, 9,11,11, 0, 0, 0, 7, 7, 9, 9,11,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c6_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c6_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c6_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c6_s_p4_0[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,10, + 10, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, + 11,11,11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10, + 10,11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c6_s_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__44c6_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c6_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c6_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6, 9, 9,10,10, + 10, 9, 4, 6, 6, 9,10, 9,10, 9,10, 6, 9, 9,10,12, + 11,10,11,11, 7,10, 9,11,12,12,12,12,12, 7,10,10, + 11,12,12,12,12,12, 6,10,10,10,12,12,11,12,12, 7, + 9,10,11,12,12,12,12,12, 7,10, 9,12,12,12,12,12, + 12, +}; + +static const static_codebook _44c6_s_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__44c6_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c6_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c6_s_p5_1[] = { + 3, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, + 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, 7, 7, 8, 8, 8, + 8,11, 6, 6, 6, 6, 8, 8, 8, 8, 9, 9,11,11,11, 6, + 6, 7, 8, 8, 8, 8, 9,11,11,11, 7, 7, 8, 8, 8, 8, + 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 8, 8,11,11,11, + 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,10,10, 8, 8, 8, + 8, 8, 8,11,11,11,10,10, 8, 8, 8, 8, 8, 8,11,11, + 11,10,10, 7, 7, 8, 8, 8, 8, +}; + +static const static_codebook _44c6_s_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__44c6_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c6_s_p5_1, + 0 +}; + +static const long _vq_quantlist__44c6_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c6_s_p6_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8,10, 9,10,10, 6, 5, 5, + 7, 7, 9, 9, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 9, + 9,10, 9,11,10,11,11, 0, 6, 6, 7, 7, 9, 9,10,10, + 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12, 0,11,11, 8, 8,10,10,11,11,12,12,12,12, 0,11, + 12, 9, 8,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const static_codebook _44c6_s_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44c6_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c6_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c6_s_p6_1[] = { + 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c6_s_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44c6_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c6_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44c6_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c6_s_p7_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8,10,10,11,10, 6, 5, 5, + 7, 7, 8, 8, 9, 9,10,10,12,11, 6, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,12,11,21, 7, 7, 7, 7, 9, 9,10,10, + 11,11,12,12,21, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12,21,12,12, 9, 9,10,10,11,11,11,11,12,12,21,12, + 12, 9, 9,10,10,11,11,12,12,12,12,21,21,21,11,11, + 10,10,11,12,12,12,13,13,21,21,21,11,11,10,10,12, + 12,12,12,13,13,21,21,21,15,15,11,11,12,12,13,13, + 13,13,21,21,21,15,16,11,11,12,12,13,13,14,14,21, + 21,21,21,20,13,13,13,13,13,13,14,14,20,20,20,20, + 20,13,13,13,13,13,13,14,14, +}; + +static const static_codebook _44c6_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c6_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__44c6_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c6_s_p7_1[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 9, 5, 5, 6, 6, + 7, 7, 7, 7, 8, 7, 8, 5, 5, 6, 6, 7, 7, 7, 7, 7, + 7, 9, 6, 6, 7, 7, 7, 7, 8, 7, 7, 8, 9, 9, 9, 7, + 7, 7, 7, 7, 7, 7, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, + 8, 8, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 8, 7, + 7, 8, 8, 9, 9, 9, 8, 8, 8, 8, 7, 7, 8, 8, 9, 9, + 9, 8, 8, 7, 7, 7, 7, 8, 8, +}; + +static const static_codebook _44c6_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c6_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c6_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c6_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c6_s_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 7, 7, 8, 7, 9, 8,10, 9, 6, + 5, 5, 8, 8, 9, 9, 8, 8, 9, 9,11,10,11,10, 6, 5, + 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11,18, 8, 8, + 9, 8,10,10, 9, 9,10,10,10,10,11,10,18, 8, 8, 9, + 9,10,10, 9, 9,10,10,11,11,12,12,18,12,13, 9,10, + 10,10, 9,10,10,10,11,11,12,11,18,13,13, 9, 9,10, + 10,10,10,10,10,11,11,12,12,18,18,18,10,10, 9, 9, + 11,11,11,11,11,12,12,12,18,18,18,10, 9,10, 9,11, + 10,11,11,11,11,13,12,18,18,18,14,13,10,10,11,11, + 12,12,12,12,12,12,18,18,18,14,13,10,10,11,10,12, + 12,12,12,12,12,18,18,18,18,18,12,12,11,11,12,12, + 13,13,13,14,18,18,18,18,18,12,12,11,11,12,11,13, + 13,14,13,18,18,18,18,18,16,16,11,12,12,13,13,13, + 14,13,18,18,18,18,18,16,15,12,11,12,11,13,11,15, + 14, +}; + +static const static_codebook _44c6_s_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__44c6_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44c6_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44c6_s_p8_1[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9,10, + 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,11,11, 8, 7, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,11, + 11,11, 9, 9, 9, 9, 9, 9,10, 9, 9,10, 9,10, 9, 9, + 10, 9,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9,10,10, + 10,10, 9,10,10, 9,10,11,11,11,11,11, 9, 9, 9, 9, + 10,10,10, 9,10,10,10,10, 9,10,10, 9,11,11,11,11, + 11,11,11, 9, 9, 9, 9,10,10,10,10, 9,10,10,10,10, + 10,11,11,11,11,11,11,11,10, 9,10,10,10,10,10,10, + 10, 9,10, 9,10,10,11,11,11,11,11,11,11,10, 9,10, + 9,10,10, 9,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10, 9,10,10,10,10,10, 9, + 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, + 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10, 9,10,10,11, + 11,11,11,11,11,11,11,11,10,10,10, 9,10,10,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,10,11, 9, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44c6_s_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__44c6_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44c6_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c6_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c6_s_p9_0[] = { + 1, 3, 3,11,11,11,11,11,11,11,11,11,11, 4, 7, 7, + 11,11,11,11,11,11,11,11,11,11, 5, 8, 9,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44c6_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__44c6_s_p9_0, + 1, -511845376, 1630791680, 4, 0, + (long *)_vq_quantlist__44c6_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c6_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c6_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8, 8, 8, 6, 6, 6, + 8, 8, 8, 8, 8, 7, 9, 8,10,10, 5, 6, 6, 8, 8, 9, + 9, 8, 8,10,10,10,10,16, 9, 9, 9, 9, 9, 9, 9, 8, + 10, 9,11,11,16, 8, 9, 9, 9, 9, 9, 9, 9,10,10,11, + 11,16,13,13, 9, 9,10, 9, 9,10,11,11,11,12,16,13, + 14, 9, 8,10, 8, 9, 9,10,10,12,11,16,14,16, 9, 9, + 9, 9,11,11,12,11,12,11,16,16,16, 9, 7, 9, 6,11, + 11,11,10,11,11,16,16,16,11,12, 9,10,11,11,12,11, + 13,13,16,16,16,12,11,10, 7,12,10,12,12,12,12,16, + 16,15,16,16,10,11,10,11,13,13,14,12,16,16,16,15, + 15,12,10,11,11,13,11,12,13, +}; + +static const static_codebook _44c6_s_p9_1 = { + 2, 169, + (long *)_vq_lengthlist__44c6_s_p9_1, + 1, -518889472, 1622704128, 4, 0, + (long *)_vq_quantlist__44c6_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c6_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44c6_s_p9_2[] = { + 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _44c6_s_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44c6_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44c6_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c6_s_short[] = { + 3, 9,11,11,13,14,19,17,17,19, 5, 4, 5, 8,10,10, + 13,16,18,19, 7, 4, 4, 5, 8, 9,12,14,17,19, 8, 6, + 5, 5, 7, 7,10,13,16,18,10, 8, 7, 6, 5, 5, 8,11, + 17,19,11, 9, 7, 7, 5, 4, 5, 8,17,19,13,11, 8, 7, + 7, 5, 5, 7,16,18,14,13, 8, 6, 6, 5, 5, 7,16,18, + 18,16,10, 8, 8, 7, 7, 9,16,18,18,18,12,10,10, 9, + 9,10,17,18, +}; + +static const static_codebook _huff_book__44c6_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c6_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c7_s_long[] = { + 3, 8,11,13,15,14,14,13,15,14, 6, 4, 5, 7, 9,10, + 11,11,14,13,10, 4, 3, 5, 7, 8, 9,10,13,13,12, 7, + 4, 4, 5, 6, 8, 9,12,14,13, 9, 6, 5, 5, 6, 8, 9, + 12,14,12, 9, 7, 6, 5, 5, 6, 8,11,11,12,11, 9, 8, + 7, 6, 6, 7,10,11,13,11,10, 9, 8, 7, 6, 6, 9,11, + 13,13,12,12,12,10, 9, 8, 9,11,12,14,15,15,14,12, + 11,10,10,12, +}; + +static const static_codebook _huff_book__44c7_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c7_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c7_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c7_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 9, 0, + 9, 8, 5, 7, 8, 0, 9, 9, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 9, 9, 0, 8, 8, 0, 8, 8, 5, 8, 9, + 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 9, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, + 8, +}; + +static const static_codebook _44c7_s_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44c7_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c7_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c7_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, + 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, + 8,10,10, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, + 11,11, 5, 7, 7, 9, 9, 0, 8, 8,10,10, 0, 7, 8, 9, + 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, + 0,11,11,12,12, 0,11,10,12,12, 0,13,14,14,14, 0, + 0, 0,14,13, 8, 9, 9,10,11, 0,11,11,12,12, 0,10, + 11,12,12, 0,13,13,14,14, 0, 0, 0,13,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, + 0, 7, 7,10,10, 0, 9, 9,11,10, 0, 0, 0,11,11, 5, + 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, + 9,10,11, 0, 0, 0,11,11, 8,10, 9,12,12, 0,10,10, + 12,12, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, + 13, 8, 9,10,12,12, 0,10,10,12,12, 0,10,10,11,12, + 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, 0, 7, 7, + 10,10, 0, 9, 9,10,11, 0, 0, 0,11,10, 5, 8, 8,10, + 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,10, + 0, 0, 0,10,11, 9,10,10,12,12, 0,10,10,12,12, 0, + 10,10,12,12, 0,12,13,13,13, 0, 0, 0,13,12, 9,10, + 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,13,12, + 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10,10,14,13, 0, 9, 9,12,12, 0, 9, 9,12,12, 0, + 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,14, 0, 9, + 9,12,13, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, + 12,12, 9,11,11,14,13, 0,11,10,13,12, 0,11,11,13, + 13, 0,12,12,13,13, 0, 0, 0,13,13, 9,11,11,13,14, + 0,10,11,12,13, 0,11,11,13,13, 0,12,12,13,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 11,11,14,14, 0,10,11,13,13, 0,11,10,13,13, 0,12, + 12,13,13, 0, 0, 0,13,12, 9,11,11,14,14, 0,11,10, + 13,13, 0,10,11,13,13, 0,12,12,14,13, 0, 0, 0,13, + 13, +}; + +static const static_codebook _44c7_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c7_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c7_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c7_s_p3_0[] = { + 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, + 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, + 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c7_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c7_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c7_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c7_s_p4_0[] = { + 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11, + 12,12, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11,12,12, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10, + 11,12,12,12, 0, 0, 0, 6, 6, 8, 7, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,12,13,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, + 10,11,11,12,12,12,13, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c7_s_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__44c7_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c7_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c7_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 7,10,10,10,10, + 10, 9, 4, 6, 6,10,10,10,10, 9,10, 5,10,10, 9,11, + 12,10,11,12, 7,10,10,11,12,12,12,12,12, 7,10,10, + 11,12,12,12,12,12, 6,10,10,10,12,12,11,12,12, 7, + 10,10,12,12,12,12,11,12, 7,10,10,11,12,12,12,12, + 12, +}; + +static const static_codebook _44c7_s_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__44c7_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c7_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c7_s_p5_1[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, + 7, 7, 8, 8, 9, 9,11, 4, 4, 6, 6, 7, 7, 8, 8, 9, + 9,12, 5, 5, 6, 6, 7, 7, 9, 9, 9, 9,12,12,12, 6, + 6, 7, 7, 9, 9, 9, 9,11,11,11, 7, 7, 7, 7, 8, 8, + 9, 9,11,11,11, 7, 7, 7, 7, 8, 8, 9, 9,11,11,11, + 7, 7, 8, 8, 8, 8, 9, 9,11,11,11,11,11, 8, 8, 8, + 8, 8, 9,11,11,11,11,11, 8, 8, 8, 8, 8, 8,11,11, + 11,11,11, 7, 7, 8, 8, 8, 8, +}; + +static const static_codebook _44c7_s_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__44c7_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c7_s_p5_1, + 0 +}; + +static const long _vq_quantlist__44c7_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c7_s_p6_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 8,10,10, 6, 5, 5, + 7, 7, 8, 8, 9, 9, 9,10,11,11, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 8, 9, 9, + 10,10,11,11, 0, 8, 8, 7, 7, 8, 9, 9, 9,10,10,11, + 11, 0,11,11, 9, 9,10,10,11,10,11,11,12,12, 0,12, + 12, 9, 9,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const static_codebook _44c7_s_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44c7_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c7_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c7_s_p6_1[] = { + 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c7_s_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44c7_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c7_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44c7_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c7_s_p7_0[] = { + 1, 4, 4, 6, 6, 7, 8, 9, 9,10,10,12,11, 6, 5, 5, + 7, 7, 8, 8, 9,10,11,11,12,12, 7, 5, 5, 7, 7, 8, + 8,10,10,11,11,12,12,20, 7, 7, 7, 7, 8, 9,10,10, + 11,11,12,13,20, 7, 7, 7, 7, 9, 9,10,10,11,12,13, + 13,20,11,11, 8, 8, 9, 9,11,11,12,12,13,13,20,11, + 11, 8, 8, 9, 9,11,11,12,12,13,13,20,20,20,10,10, + 10,10,12,12,13,13,13,13,20,20,20,10,10,10,10,12, + 12,13,13,13,14,20,20,20,14,14,11,11,12,12,13,13, + 14,14,20,20,20,14,14,11,11,12,12,13,13,14,14,20, + 20,20,20,19,13,13,13,13,14,14,15,14,19,19,19,19, + 19,13,13,13,13,14,14,15,15, +}; + +static const static_codebook _44c7_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c7_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__44c7_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c7_s_p7_1[] = { + 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _44c7_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c7_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c7_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c7_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c7_s_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 7, 9, 8, 9, 9,10,10, 6, + 5, 5, 7, 7, 9, 9, 8, 8,10, 9,11,10,12,11, 6, 5, + 5, 8, 7, 9, 9, 8, 8,10,10,11,11,12,11,19, 8, 8, + 8, 8,10,10, 9, 9,10,10,11,11,12,11,19, 8, 8, 8, + 8,10,10, 9, 9,10,10,11,11,12,12,19,12,12, 9, 9, + 10,10, 9,10,10,10,11,11,12,12,19,12,12, 9, 9,10, + 10,10,10,10,10,12,12,12,12,19,19,19, 9, 9, 9, 9, + 11,10,11,11,12,11,13,13,19,19,19, 9, 9, 9, 9,11, + 10,11,11,11,12,13,13,19,19,19,13,13,10,10,11,11, + 12,12,12,12,13,12,19,19,19,14,13,10,10,11,11,12, + 12,12,13,13,13,19,19,19,19,19,12,12,12,11,12,13, + 14,13,13,13,19,19,19,19,19,12,12,12,11,12,12,13, + 14,13,14,19,19,19,19,19,16,16,12,13,12,13,13,14, + 15,14,19,18,18,18,18,16,15,12,11,12,11,14,12,14, + 14, +}; + +static const static_codebook _44c7_s_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__44c7_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44c7_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44c7_s_p8_1[] = { + 3, 5, 5, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,11,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10, 9, 9,10, 9, 9,10,11,10, + 11,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,10, 9, 9, + 9, 9,11,10,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, + 10, 9, 9,10, 9, 9,10,11,10,10,11,10, 9, 9, 9, 9, + 9,10,10, 9,10,10,10,10, 9,10,10,10,10,10,10,11, + 11,11,10, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, + 10,10,10,11,11,10,10,10,10,10,10,10,10,10,10,10, + 10, 9,10,10, 9,10,11,11,10,11,10,11,10, 9,10,10, + 9,10,10,10,10,10,10,10,10,10,10,11,11,11,11,10, + 11,11,10,10,10,10,10,10, 9,10, 9,10,10, 9,10, 9, + 10,10,10,11,10,11,10,11,11,10,10,10,10,10,10, 9, + 10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,11,10,11, + 11,10,10,10,10, 9, 9,10,10, 9, 9,10, 9,10,10,10, + 10,11,11,10,10,10,10,10,10,10, 9, 9,10,10,10, 9, + 9,10,10,10,10,10,11,10,11,10,10,10,10,10,10, 9, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44c7_s_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__44c7_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44c7_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c7_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c7_s_p9_0[] = { + 1, 3, 3,11,11,11,11,11,11,11,11,11,11, 4, 6, 6, + 11,11,11,11,11,11,11,11,11,11, 4, 7, 7,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11, +}; + +static const static_codebook _44c7_s_p9_0 = { + 2, 169, + (long *)_vq_lengthlist__44c7_s_p9_0, + 1, -511845376, 1630791680, 4, 0, + (long *)_vq_quantlist__44c7_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c7_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c7_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8, 8, 8, 6, 6, 6, + 8, 8, 9, 8, 8, 7, 9, 8,11,10, 5, 6, 6, 8, 8, 9, + 8, 8, 8,10, 9,11,11,16, 8, 8, 9, 8, 9, 9, 9, 8, + 10, 9,11,10,16, 8, 8, 9, 9,10,10, 9, 9,10,10,11, + 11,16,13,13, 9, 9,10,10, 9,10,11,11,12,11,16,13, + 13, 9, 8,10, 9,10,10,10,10,11,11,16,14,16, 8, 9, + 9, 9,11,10,11,11,12,11,16,16,16, 9, 7,10, 7,11, + 10,11,11,12,11,16,16,16,12,12, 9,10,11,11,12,11, + 12,12,16,16,16,12,10,10, 7,11, 8,12,11,12,12,16, + 16,15,16,16,11,12,10,10,12,11,12,12,16,16,16,15, + 15,11,11,10,10,12,12,12,12, +}; + +static const static_codebook _44c7_s_p9_1 = { + 2, 169, + (long *)_vq_lengthlist__44c7_s_p9_1, + 1, -518889472, 1622704128, 4, 0, + (long *)_vq_quantlist__44c7_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c7_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44c7_s_p9_2[] = { + 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _44c7_s_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44c7_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44c7_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c7_s_short[] = { + 4,11,12,14,15,15,17,17,18,18, 5, 6, 6, 8, 9,10, + 13,17,18,19, 7, 5, 4, 6, 8, 9,11,15,19,19, 8, 6, + 5, 5, 6, 7,11,14,16,17, 9, 7, 7, 6, 7, 7,10,13, + 15,19,10, 8, 7, 6, 7, 6, 7, 9,14,16,12,10, 9, 7, + 7, 6, 4, 5,10,15,14,13,11, 7, 6, 6, 4, 2, 7,13, + 16,16,15, 9, 8, 8, 8, 6, 9,13,19,19,17,12,11,10, + 10, 9,11,14, +}; + +static const static_codebook _huff_book__44c7_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c7_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c8_s_long[] = { + 3, 8,12,13,14,14,14,13,14,14, 6, 4, 5, 8,10,10, + 11,11,14,13, 9, 5, 4, 5, 7, 8, 9,10,13,13,12, 7, + 5, 4, 5, 6, 8, 9,12,13,13, 9, 6, 5, 5, 5, 7, 9, + 11,14,12,10, 7, 6, 5, 4, 6, 7,10,11,12,11, 9, 8, + 7, 5, 5, 6,10,10,13,12,10, 9, 8, 6, 6, 5, 8,10, + 14,13,12,12,11,10, 9, 7, 8,10,12,13,14,14,13,12, + 11, 9, 9,10, +}; + +static const static_codebook _huff_book__44c8_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c8_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c8_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c8_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 7, 7, 0, 9, 8, 0, + 9, 8, 6, 7, 7, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, + 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, + 8, +}; + +static const static_codebook _44c8_s_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44c8_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c8_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c8_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, + 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, + 7,10, 9, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, + 11,11, 5, 7, 7, 9, 9, 0, 7, 8, 9,10, 0, 7, 8, 9, + 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, + 0,11,10,12,11, 0,11,10,12,12, 0,13,13,14,14, 0, + 0, 0,14,13, 8, 9, 9,10,11, 0,10,11,12,12, 0,10, + 11,12,12, 0,13,13,14,14, 0, 0, 0,13,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, + 0, 7, 7,10,10, 0, 9, 9,10,10, 0, 0, 0,11,10, 5, + 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, + 9,10,10, 0, 0, 0,10,10, 8,10, 9,12,12, 0,10,10, + 12,11, 0,10,10,12,12, 0,12,12,13,12, 0, 0, 0,13, + 12, 8, 9,10,12,12, 0,10,10,11,12, 0,10,10,11,12, + 0,12,12,13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 7,11,10, 0, 7, 7,10,10, 0, 7, 7, + 10,10, 0, 9, 9,10,11, 0, 0, 0,10,10, 6, 7, 8,10, + 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,10,10, + 0, 0, 0,10,10, 9,10, 9,12,12, 0,10,10,12,12, 0, + 10,10,12,11, 0,12,12,13,13, 0, 0, 0,13,12, 8, 9, + 10,12,12, 0,10,10,12,12, 0,10,10,11,12, 0,12,12, + 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10,10,13,13, 0, 9, 9,12,12, 0, 9, 9,12,12, 0, + 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,13, 0, 9, + 9,12,12, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, + 12,12, 9,11,11,14,13, 0,10,10,13,12, 0,11,10,13, + 12, 0,12,12,13,12, 0, 0, 0,13,13, 9,11,11,13,14, + 0,10,11,12,13, 0,10,11,13,13, 0,12,12,12,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 11,11,14,14, 0,10,11,13,13, 0,11,10,13,13, 0,11, + 12,13,13, 0, 0, 0,13,12, 9,11,11,14,14, 0,11,10, + 13,13, 0,10,11,13,13, 0,12,12,13,13, 0, 0, 0,12, + 13, +}; + +static const static_codebook _44c8_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c8_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c8_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c8_s_p3_0[] = { + 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, + 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, + 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c8_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c8_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c8_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c8_s_p4_0[] = { + 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 8,10,10,11,11, + 11,11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11,11,11, 0, 6, 5, 6, 6, 7, 7, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 6, 6, 7, 7, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, + 11,11,11,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, + 10,11,11,11,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c8_s_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__44c8_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c8_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c8_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 7, 6,10,10,10,10, + 10,10, 4, 6, 6,10,10,10,10, 9,10, 5,10,10, 9,11, + 11,10,11,11, 7,10,10,11,12,12,12,12,12, 7,10,10, + 11,12,12,12,12,12, 6,10,10,10,12,12,10,12,12, 7, + 10,10,11,12,12,12,12,12, 7,10,10,11,12,12,12,12, + 12, +}; + +static const static_codebook _44c8_s_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__44c8_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c8_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c8_s_p5_1[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 5, 6, 6, + 7, 7, 8, 8, 8, 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 9,12, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,12,12,12, 6, + 6, 7, 7, 8, 8, 9, 9,11,11,11, 6, 6, 7, 7, 8, 8, + 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, + 7, 7, 7, 8, 8, 8, 8, 8,11,11,11,11,11, 7, 7, 8, + 8, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 8, 8,11,11, + 11,11,11, 7, 7, 7, 7, 8, 8, +}; + +static const static_codebook _44c8_s_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__44c8_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c8_s_p5_1, + 0 +}; + +static const long _vq_quantlist__44c8_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c8_s_p6_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10, + 10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10,10,10,11, + 11, 0,11,11, 9, 9,10,10,11,11,11,11,12,12, 0,12, + 12, 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const static_codebook _44c8_s_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44c8_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c8_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c8_s_p6_1[] = { + 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c8_s_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44c8_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c8_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44c8_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c8_s_p7_0[] = { + 1, 4, 4, 6, 6, 8, 7, 9, 9,10,10,12,12, 6, 5, 5, + 7, 7, 8, 8,10,10,11,11,12,12, 7, 5, 5, 7, 7, 8, + 8,10,10,11,11,12,12,21, 7, 7, 7, 7, 8, 9,10,10, + 11,11,12,12,21, 7, 7, 7, 7, 9, 9,10,10,12,12,13, + 13,21,11,11, 8, 8, 9, 9,11,11,12,12,13,13,21,11, + 11, 8, 8, 9, 9,11,11,12,12,13,13,21,21,21,10,10, + 10,10,11,11,12,13,13,13,21,21,21,10,10,10,10,11, + 11,13,13,14,13,21,21,21,13,13,11,11,12,12,13,13, + 14,14,21,21,21,14,14,11,11,12,12,13,13,14,14,21, + 21,21,21,20,13,13,13,12,14,14,16,15,20,20,20,20, + 20,13,13,13,13,14,13,15,15, +}; + +static const static_codebook _44c8_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c8_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__44c8_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c8_s_p7_1[] = { + 4, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, + 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _44c8_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c8_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c8_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c8_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c8_s_p8_0[] = { + 1, 4, 4, 7, 6, 8, 8, 8, 7, 9, 8,10,10,11,10, 6, + 5, 5, 7, 7, 9, 9, 8, 8,10,10,11,11,12,11, 6, 5, + 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,20, 8, 8, + 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,20, 8, 8, 8, + 8,10, 9, 9, 9,10,10,11,11,12,12,20,12,12, 9, 9, + 10,10,10,10,10,11,12,12,12,12,20,12,12, 9, 9,10, + 10,10,10,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9, + 11,10,11,11,12,12,12,13,20,19,19, 9, 9, 9, 9,11, + 11,11,12,12,12,13,13,19,19,19,13,13,10,10,11,11, + 12,12,13,13,13,13,19,19,19,14,13,11,10,11,11,12, + 12,12,13,13,13,19,19,19,19,19,12,12,12,12,13,13, + 13,13,14,13,19,19,19,19,19,12,12,12,11,12,12,13, + 14,14,14,19,19,19,19,19,16,15,13,12,13,13,13,14, + 14,14,19,19,19,19,19,17,17,13,12,13,11,14,13,15, + 15, +}; + +static const static_codebook _44c8_s_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__44c8_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44c8_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44c8_s_p8_1[] = { + 4, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, + 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,10, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10, 9,10,10, 9,10,10,10,10, + 9,10, 9,10,10, 9,10,10,10,10,10,10,10, 9,10,10, + 10,10,10,10, 9, 9,10,10, 9,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, 9, 9, 9,10, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, + 10, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10, 9, 9,10, 9, 9, 9,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10, 9, + 9,10, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10, 9, 9,10,10, 9,10, 9, 9, +}; + +static const static_codebook _44c8_s_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__44c8_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44c8_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c8_s_p9_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c8_s_p9_0[] = { + 1, 4, 3,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11, 4, 7, 7,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11, 4, 8,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _44c8_s_p9_0 = { + 2, 289, + (long *)_vq_lengthlist__44c8_s_p9_0, + 1, -509798400, 1631393792, 5, 0, + (long *)_vq_quantlist__44c8_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c8_s_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__44c8_s_p9_1[] = { + 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9,10,10,10, + 10,11,11, 6, 6, 6, 8, 8, 9, 8, 8, 7,10, 8,11,10, + 12,11,12,12,13,13, 5, 5, 6, 8, 8, 9, 9, 8, 8,10, + 9,11,11,12,12,13,13,13,13,17, 8, 8, 9, 9, 9, 9, + 9, 9,10, 9,12,10,12,12,13,12,13,13,17, 9, 8, 9, + 9, 9, 9, 9, 9,10,10,12,12,12,12,13,13,13,13,17, + 13,13, 9, 9,10,10,10,10,11,11,12,11,13,12,13,13, + 14,15,17,13,13, 9, 8,10, 9,10,10,11,11,12,12,14, + 13,15,13,14,15,17,17,17, 9,10, 9,10,11,11,12,12, + 12,12,13,13,14,14,15,15,17,17,17, 9, 8, 9, 8,11, + 11,12,12,12,12,14,13,14,14,14,15,17,17,17,12,14, + 9,10,11,11,12,12,14,13,13,14,15,13,15,15,17,17, + 17,13,11,10, 8,11, 9,13,12,13,13,13,13,13,14,14, + 14,17,17,17,17,17,11,12,11,11,13,13,14,13,15,14, + 13,15,16,15,17,17,17,17,17,11,11,12, 8,13,12,14, + 13,17,14,15,14,15,14,17,17,17,17,17,15,15,12,12, + 12,12,13,14,14,14,15,14,17,14,17,17,17,17,17,16, + 17,12,12,13,12,13,13,14,14,14,14,14,14,17,17,17, + 17,17,17,17,14,14,13,12,13,13,15,15,14,13,15,17, + 17,17,17,17,17,17,17,13,14,13,13,13,13,14,15,15, + 15,14,15,17,17,17,17,17,17,17,16,15,13,14,13,13, + 14,14,15,14,14,16,17,17,17,17,17,17,17,16,16,13, + 14,13,13,14,14,15,14,15,14, +}; + +static const static_codebook _44c8_s_p9_1 = { + 2, 361, + (long *)_vq_lengthlist__44c8_s_p9_1, + 1, -518287360, 1622704128, 5, 0, + (long *)_vq_quantlist__44c8_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c8_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44c8_s_p9_2[] = { + 2, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _44c8_s_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44c8_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44c8_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c8_s_short[] = { + 4,11,13,14,15,15,18,17,19,17, 5, 6, 8, 9,10,10, + 12,15,19,19, 6, 6, 6, 6, 8, 8,11,14,18,19, 8, 6, + 5, 4, 6, 7,10,13,16,17, 9, 7, 6, 5, 6, 7, 9,12, + 15,19,10, 8, 7, 6, 6, 6, 7, 9,13,15,12,10, 9, 8, + 7, 6, 4, 5,10,15,13,13,11, 8, 6, 6, 4, 2, 7,12, + 17,15,16,10, 8, 8, 7, 6, 9,12,19,18,17,13,11,10, + 10, 9,11,14, +}; + +static const static_codebook _huff_book__44c8_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c8_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c9_s_long[] = { + 3, 8,12,14,15,15,15,13,15,15, 6, 5, 8,10,12,12, + 13,12,14,13,10, 6, 5, 6, 8, 9,11,11,13,13,13, 8, + 5, 4, 5, 6, 8,10,11,13,14,10, 7, 5, 4, 5, 7, 9, + 11,12,13,11, 8, 6, 5, 4, 5, 7, 9,11,12,11,10, 8, + 7, 5, 4, 5, 9,10,13,13,11,10, 8, 6, 5, 4, 7, 9, + 15,14,13,12,10, 9, 8, 7, 8, 9,12,12,14,13,12,11, + 10, 9, 8, 9, +}; + +static const static_codebook _huff_book__44c9_s_long = { + 2, 100, + (long *)_huff_lengthlist__44c9_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c9_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c9_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 6, 8, 8, 0, 9, 8, 0, + 9, 8, 6, 8, 8, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 8, 8, 0, 7, 7, 0, 8, 8, 5, 8, 8, + 0, 7, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 8, 0, 8, 8, 0, 7, 7, 5, 8, 9, 0, 8, 8, 0, 7, + 7, +}; + +static const static_codebook _44c9_s_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44c9_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c9_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c9_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, + 7, 7, 9, 9, 0, 0, 0, 9, 9, 6, 7, 7, 9, 8, 0, 8, + 8, 9, 9, 0, 8, 7, 9, 9, 0, 9,10,10,10, 0, 0, 0, + 11,10, 6, 7, 7, 8, 9, 0, 8, 8, 9, 9, 0, 7, 8, 9, + 9, 0,10, 9,11,10, 0, 0, 0,10,10, 8, 9, 8,10,10, + 0,10,10,12,11, 0,10,10,11,11, 0,12,13,13,13, 0, + 0, 0,13,12, 8, 8, 9,10,10, 0,10,10,11,12, 0,10, + 10,11,11, 0,13,12,13,13, 0, 0, 0,13,13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 8, 7,10,10, 0, 7, 7,10, 9, + 0, 7, 7,10,10, 0, 9, 9,10,10, 0, 0, 0,10,10, 6, + 7, 8,10,10, 0, 7, 7, 9,10, 0, 7, 7,10,10, 0, 9, + 9,10,10, 0, 0, 0,10,10, 8, 9, 9,11,11, 0,10,10, + 11,11, 0,10,10,11,11, 0,12,12,12,12, 0, 0, 0,12, + 12, 8, 9,10,11,11, 0, 9,10,11,11, 0,10,10,11,11, + 0,12,12,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 7,10,10, 0, 7, 7,10,10, 0, 7, 7, + 10, 9, 0, 9, 9,10,10, 0, 0, 0,10,10, 6, 7, 8,10, + 10, 0, 7, 7,10,10, 0, 7, 7, 9,10, 0, 9, 9,10,10, + 0, 0, 0,10,10, 8,10, 9,12,11, 0,10,10,12,11, 0, + 10, 9,11,11, 0,11,12,12,12, 0, 0, 0,12,12, 8, 9, + 10,11,12, 0,10,10,11,11, 0, 9,10,11,11, 0,12,11, + 12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10, 9,12,12, 0, 9, 9,12,11, 0, 9, 9,11,11, 0, + 10,10,12,11, 0, 0, 0,11,12, 7, 9,10,12,12, 0, 9, + 9,11,12, 0, 9, 9,11,11, 0,10,10,11,12, 0, 0, 0, + 11,11, 9,11,10,13,12, 0,10,10,12,12, 0,10,10,12, + 12, 0,11,11,12,12, 0, 0, 0,13,12, 9,10,11,12,13, + 0,10,10,12,12, 0,10,10,12,12, 0,11,12,12,12, 0, + 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 11,10,13,13, 0,10,10,12,12, 0,10,10,12,12, 0,11, + 12,12,12, 0, 0, 0,12,12, 9,10,11,13,13, 0,10,10, + 12,12, 0,10,10,12,12, 0,12,11,13,12, 0, 0, 0,12, + 12, +}; + +static const static_codebook _44c9_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c9_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c9_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c9_s_p3_0[] = { + 3, 4, 4, 5, 5, 6, 6, 8, 8, 0, 4, 4, 5, 5, 6, 7, + 8, 8, 0, 4, 4, 5, 5, 7, 7, 8, 8, 0, 5, 5, 6, 6, + 7, 7, 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, + 7, 7, 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c9_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c9_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c9_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c9_s_p4_0[] = { + 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10, + 10, 0, 5, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10, + 11,11, 0, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, + 10,11,11, 0, 6, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10, + 11,11,11,12, 0, 0, 0, 6, 6, 7, 7, 8, 8, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 7, 7, 9, 9, 9, 9, + 10,10,11,11,12,12, 0, 0, 0, 7, 7, 7, 8, 9, 9, 9, + 9,10,10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c9_s_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__44c9_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c9_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c9_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 7, 6, 9,10,10,10, + 10, 9, 4, 6, 7, 9,10,10,10, 9,10, 5, 9, 9, 9,11, + 11,10,11,11, 7,10, 9,11,12,11,12,12,12, 7, 9,10, + 11,11,12,12,12,12, 6,10,10,10,12,12,10,12,11, 7, + 10,10,11,12,12,11,12,12, 7,10,10,11,12,12,12,12, + 12, +}; + +static const static_codebook _44c9_s_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__44c9_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c9_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c9_s_p5_1[] = { + 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7,11, 5, 5, 6, 6, + 7, 7, 7, 7, 8, 8,11, 5, 5, 6, 6, 7, 7, 7, 7, 8, + 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, + 6, 7, 7, 7, 8, 8, 8,11,11,11, 6, 6, 7, 7, 7, 8, + 8, 8,11,11,11, 6, 6, 7, 7, 7, 7, 8, 8,11,11,11, + 7, 7, 7, 7, 7, 7, 8, 8,11,11,11,10,10, 7, 7, 7, + 7, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 7, 7,11,11, + 11,11,11, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _44c9_s_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__44c9_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c9_s_p5_1, + 0 +}; + +static const long _vq_quantlist__44c9_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c9_s_p6_0[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 5, 4, 4, + 6, 6, 8, 8, 9, 9, 9, 9,10,10, 6, 4, 4, 6, 6, 8, + 8, 9, 9, 9, 9,10,10, 0, 6, 6, 7, 7, 8, 8, 9, 9, + 10,10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11, 0,10,10, 8, 8, 9, 9,10,10,11,11,12,12, 0,11, + 11, 8, 8, 9, 9,10,10,11,11,12,12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const static_codebook _44c9_s_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44c9_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c9_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c9_s_p6_1[] = { + 4, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44c9_s_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44c9_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c9_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44c9_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c9_s_p7_0[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8,10,10,11,11, 6, 4, 4, + 6, 6, 8, 8, 9, 9,10,10,12,12, 6, 4, 5, 6, 6, 8, + 8, 9, 9,10,10,12,12,20, 6, 6, 6, 6, 8, 8, 9,10, + 11,11,12,12,20, 6, 6, 6, 6, 8, 8,10,10,11,11,12, + 12,20,10,10, 7, 7, 9, 9,10,10,11,11,12,12,20,11, + 11, 7, 7, 9, 9,10,10,11,11,12,12,20,20,20, 9, 9, + 9, 9,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9,11, + 11,12,12,13,13,20,20,20,13,13,10,10,11,11,12,13, + 13,13,20,20,20,13,13,10,10,11,11,12,13,13,13,20, + 20,20,20,19,12,12,12,12,13,13,14,15,19,19,19,19, + 19,12,12,12,12,13,13,14,14, +}; + +static const static_codebook _44c9_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c9_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__44c9_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c9_s_p7_1[] = { + 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7, 7, + 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 6, + 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _44c9_s_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44c9_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c9_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c9_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44c9_s_p8_0[] = { + 1, 4, 4, 7, 6, 8, 8, 8, 8, 9, 9,10,10,11,10, 6, + 5, 5, 7, 7, 9, 9, 8, 9,10,10,11,11,12,12, 6, 5, + 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,21, 7, 8, + 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,21, 8, 8, 8, + 8, 9, 9, 9, 9,10,10,11,11,12,12,21,11,12, 9, 9, + 10,10,10,10,10,11,11,12,12,12,21,12,12, 9, 8,10, + 10,10,10,11,11,12,12,13,13,21,21,21, 9, 9, 9, 9, + 11,11,11,11,12,12,12,13,21,20,20, 9, 9, 9, 9,10, + 11,11,11,12,12,13,13,20,20,20,13,13,10,10,11,11, + 12,12,13,13,13,13,20,20,20,13,13,10,10,11,11,12, + 12,13,13,13,13,20,20,20,20,20,12,12,12,12,12,12, + 13,13,14,14,20,20,20,20,20,12,12,12,11,13,12,13, + 13,14,14,20,20,20,20,20,15,16,13,12,13,13,14,13, + 14,14,20,20,20,20,20,16,15,12,12,13,12,14,13,14, + 14, +}; + +static const static_codebook _44c9_s_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__44c9_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44c9_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44c9_s_p8_1[] = { + 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10,10,10,10, + 10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10, 9, 9, 9,10,10,10,10,10, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, 9, 9,10, + 9,10, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, + 10,10,10,10, 9, 9,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 9, 9,10, 9, 9, 9, 9, 9,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9,10,10, 9, 9,10, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9,10, 9, 9, 9, + 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9,10, 9, 9, 9, 9, 9, +}; + +static const static_codebook _44c9_s_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__44c9_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44c9_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c9_s_p9_0[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__44c9_s_p9_0[] = { + 1, 4, 3,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12, 4, 5, 6,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12, 4, 6, 6,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,11,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11, +}; + +static const static_codebook _44c9_s_p9_0 = { + 2, 361, + (long *)_vq_lengthlist__44c9_s_p9_0, + 1, -508535424, 1631393792, 5, 0, + (long *)_vq_quantlist__44c9_s_p9_0, + 0 +}; + +static const long _vq_quantlist__44c9_s_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__44c9_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 8, 7, 9, 8, 9, 9,10,10,11, + 11,11,11, 6, 5, 5, 8, 8, 9, 9, 9, 8,10, 9,11,10, + 12,12,13,12,13,13, 5, 5, 5, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12,13,12,13,13,17, 8, 8, 9, 9, 9, 9, + 9, 9,10,10,12,11,13,12,13,13,13,13,18, 8, 8, 9, + 9, 9, 9, 9, 9,11,11,12,12,13,13,13,13,13,13,17, + 13,12, 9, 9,10,10,10,10,11,11,12,12,12,13,13,13, + 14,14,18,13,12, 9, 9,10,10,10,10,11,11,12,12,13, + 13,13,14,14,14,17,18,18,10,10,10,10,11,11,11,12, + 12,12,14,13,14,13,13,14,18,18,18,10, 9,10, 9,11, + 11,12,12,12,12,13,13,15,14,14,14,18,18,16,13,14, + 10,11,11,11,12,13,13,13,13,14,13,13,14,14,18,18, + 18,14,12,11, 9,11,10,13,12,13,13,13,14,14,14,13, + 14,18,18,17,18,18,11,12,12,12,13,13,14,13,14,14, + 13,14,14,14,18,18,18,18,17,12,10,12, 9,13,11,13, + 14,14,14,14,14,15,14,18,18,17,17,18,14,15,12,13, + 13,13,14,13,14,14,15,14,15,14,18,17,18,18,18,15, + 15,12,10,14,10,14,14,13,13,14,14,14,14,18,16,18, + 18,18,18,17,14,14,13,14,14,13,13,14,14,14,15,15, + 18,18,18,18,17,17,17,14,14,14,12,14,13,14,14,15, + 14,15,14,18,18,18,18,18,18,18,17,16,13,13,13,14, + 14,14,14,15,16,15,18,18,18,18,18,18,18,17,17,13, + 13,13,13,14,13,14,15,15,15, +}; + +static const static_codebook _44c9_s_p9_1 = { + 2, 361, + (long *)_vq_lengthlist__44c9_s_p9_1, + 1, -518287360, 1622704128, 5, 0, + (long *)_vq_quantlist__44c9_s_p9_1, + 0 +}; + +static const long _vq_quantlist__44c9_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44c9_s_p9_2[] = { + 2, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _44c9_s_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44c9_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44c9_s_p9_2, + 0 +}; + +static const long _huff_lengthlist__44c9_s_short[] = { + 5,13,18,16,17,17,19,18,19,19, 5, 7,10,11,12,12, + 13,16,17,18, 6, 6, 7, 7, 9, 9,10,14,17,19, 8, 7, + 6, 5, 6, 7, 9,12,19,17, 8, 7, 7, 6, 5, 6, 8,11, + 15,19, 9, 8, 7, 6, 5, 5, 6, 8,13,15,11,10, 8, 8, + 7, 5, 4, 4,10,14,12,13,11, 9, 7, 6, 4, 2, 6,12, + 18,16,16,13, 8, 7, 7, 5, 8,13,16,17,18,15,11, 9, + 9, 8,10,13, +}; + +static const static_codebook _huff_book__44c9_s_short = { + 2, 100, + (long *)_huff_lengthlist__44c9_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c0_s_long[] = { + 5, 4, 8, 9, 8, 9,10,12,15, 4, 1, 5, 5, 6, 8,11, + 12,12, 8, 5, 8, 9, 9,11,13,12,12, 9, 5, 8, 5, 7, + 9,12,13,13, 8, 6, 8, 7, 7, 9,11,11,11, 9, 7, 9, + 7, 7, 7, 7,10,12,10,10,11, 9, 8, 7, 7, 9,11,11, + 12,13,12,11, 9, 8, 9,11,13,16,16,15,15,12,10,11, + 12, +}; + +static const static_codebook _huff_book__44c0_s_long = { + 2, 81, + (long *)_huff_lengthlist__44c0_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c0_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c0_s_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c0_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c0_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c0_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c0_s_p2_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c0_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c0_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c0_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c0_s_p3_0[] = { + 1, 3, 2, 8, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c0_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c0_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c0_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c0_s_p4_0[] = { + 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, + 7, 8, 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 8, 9, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, +}; + +static const static_codebook _44c0_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c0_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c0_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p5_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c0_s_p5_0[] = { + 1, 4, 3, 6, 6, 8, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9, 9,10,10,10, + 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11, 0, 0, 0, 8, 8, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, + 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9, + 10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,11,11,11,11,11,12,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,11,10,11,11,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,11,12,12,12,12,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,12,12,12,12,13,13,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,12,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, +}; + +static const static_codebook _44c0_s_p5_0 = { + 2, 289, + (long *)_vq_lengthlist__44c0_s_p5_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c0_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c0_s_p6_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 4, 6, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, + 11,12,10,11, 6, 9, 9,11,10,11,11,10,10, 6, 9, 9, + 11,10,11,11,10,10, 7,11,10,12,11,11,11,11,11, 7, + 9, 9,10,10,10,11,11,10, 6, 9, 9,11,10,10,11,10, + 10, +}; + +static const static_codebook _44c0_s_p6_0 = { + 4, 81, + (long *)_vq_lengthlist__44c0_s_p6_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c0_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p6_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c0_s_p6_1[] = { + 2, 3, 3, 6, 6, 7, 7, 7, 7, 7, 8,10,10,10, 6, 6, + 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c0_s_p6_1 = { + 2, 121, + (long *)_vq_lengthlist__44c0_s_p6_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c0_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44c0_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c0_s_p7_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0,10,10, + 10,10,11,11,11,11,12,12, 0, 0, 0,10,10, 9, 9,11, + 11,11,12,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,11,11,11,11,13,12,13,13, 0, 0, 0, 0, + 0,12,12,11,11,12,12,13,13, +}; + +static const static_codebook _44c0_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c0_s_p7_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c0_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c0_s_p7_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c0_s_p7_1 = { + 2, 25, + (long *)_vq_lengthlist__44c0_s_p7_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c0_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c0_s_p8_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c0_s_p8_0[] = { + 1, 5, 5,10,10, 6, 9, 8,10,10, 6,10, 9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 8,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11, +}; + +static const static_codebook _44c0_s_p8_0 = { + 4, 625, + (long *)_vq_lengthlist__44c0_s_p8_0, + 1, -518283264, 1627103232, 3, 0, + (long *)_vq_quantlist__44c0_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c0_s_p8_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c0_s_p8_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,11,12,13,12, 6, 5, 5, + 7, 7, 8, 8,10, 9,12,12,12,12, 6, 5, 5, 7, 7, 8, + 8,10, 9,12,11,11,13,16, 7, 7, 8, 8, 9, 9,10,10, + 12,12,13,12,16, 7, 7, 8, 7, 9, 9,10,10,11,12,12, + 13,16,10,10, 8, 8,10,10,11,12,12,12,13,13,16,11, + 10, 8, 7,11,10,11,11,12,11,13,13,16,16,16,10,10, + 10,10,11,11,13,12,13,13,16,16,16,11, 9,11, 9,15, + 13,12,13,13,13,16,16,16,15,13,11,11,12,13,12,12, + 14,13,16,16,16,14,13,11,11,13,12,14,13,13,13,16, + 16,16,16,16,13,13,13,12,14,13,14,14,16,16,16,16, + 16,13,13,12,12,14,14,15,13, +}; + +static const static_codebook _44c0_s_p8_1 = { + 2, 169, + (long *)_vq_lengthlist__44c0_s_p8_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44c0_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c0_s_p8_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c0_s_p8_2[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9,10, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, + 9,10, 9, 9,10,10,10,10, 8, 8, 8, 8, 9, 8, 9, 9, + 9, 9, 9,10, 9,10,10,10,10, 7, 7, 8, 8, 9, 9, 9, + 9, 9, 9,10, 9,10,10,10,10,10, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 9,11,10,10,10,10, 8, 8, 9, + 9, 9, 9, 9,10, 9, 9, 9,10,10,10,10,11,11, 9, 9, + 9, 9, 9, 9, 9, 9,10, 9, 9,10,11,10,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,11,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,10,10,11, + 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 11,11,11,11, 9,10, 9,10, 9, 9, 9, 9,10, 9,10,11, + 10,11,10,10,10,10,10, 9, 9, 9,10, 9, 9, 9,10,11, + 11,10,11,11,10,11,10,10,10, 9, 9, 9, 9,10, 9, 9, + 10,11,10,11,11,11,11,10,11,10,10, 9,10, 9, 9, 9, + 10, +}; + +static const static_codebook _44c0_s_p8_2 = { + 2, 289, + (long *)_vq_lengthlist__44c0_s_p8_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c0_s_p8_2, + 0 +}; + +static const long _huff_lengthlist__44c0_s_short[] = { + 9, 8,12,11,12,13,14,14,16, 6, 1, 5, 6, 6, 9,12, + 14,17, 9, 4, 5, 9, 7, 9,13,15,16, 8, 5, 8, 6, 8, + 10,13,17,17, 9, 6, 7, 7, 8, 9,13,15,17,11, 8, 9, + 9, 9,10,12,16,16,13, 7, 8, 7, 7, 9,12,14,15,13, + 6, 7, 5, 5, 7,10,13,13,14, 7, 8, 5, 6, 7, 9,10, + 12, +}; + +static const static_codebook _huff_book__44c0_s_short = { + 2, 81, + (long *)_huff_lengthlist__44c0_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c0_sm_long[] = { + 5, 4, 9,10, 9,10,11,12,13, 4, 1, 5, 7, 7, 9,11, + 12,14, 8, 5, 7, 9, 8,10,13,13,13,10, 7, 9, 4, 6, + 7,10,12,14, 9, 6, 7, 6, 6, 7,10,12,12, 9, 8, 9, + 7, 6, 7, 8,11,12,11,11,11, 9, 8, 7, 8,10,12,12, + 13,14,12,11, 9, 9, 9,12,12,17,17,15,16,12,10,11, + 13, +}; + +static const static_codebook _huff_book__44c0_sm_long = { + 2, 81, + (long *)_huff_lengthlist__44c0_sm_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c0_sm_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9,10,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,10,10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c0_sm_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c0_sm_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c0_sm_p1_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c0_sm_p2_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c0_sm_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c0_sm_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c0_sm_p2_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c0_sm_p3_0[] = { + 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 4, 7, 7, 0, 0, + 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 6, 7, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 9,10, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, + 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c0_sm_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c0_sm_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c0_sm_p3_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c0_sm_p4_0[] = { + 1, 4, 3, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 8, 7, + 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, + 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 9, 9, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, + 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, +}; + +static const static_codebook _44c0_sm_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c0_sm_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c0_sm_p4_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p5_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c0_sm_p5_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, + 11,11, 0, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 11,11,11, 0, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,11,12,12,13,13,13,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, +}; + +static const static_codebook _44c0_sm_p5_0 = { + 2, 289, + (long *)_vq_lengthlist__44c0_sm_p5_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c0_sm_p5_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c0_sm_p6_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, + 11,11,10,10, 6, 9, 9,11,11,10,11,10,10, 6, 9, 9, + 11,10,11,11,10,10, 7,11,10,11,11,11,11,11,11, 6, + 9, 9,11,10,10,11,11,10, 6, 9, 9,11,10,10,11,10, + 11, +}; + +static const static_codebook _44c0_sm_p6_0 = { + 4, 81, + (long *)_vq_lengthlist__44c0_sm_p6_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c0_sm_p6_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p6_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c0_sm_p6_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 8, 9, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8, 9, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, + 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c0_sm_p6_1 = { + 2, 121, + (long *)_vq_lengthlist__44c0_sm_p6_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c0_sm_p6_1, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c0_sm_p7_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 5, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0, 9,10, + 10,10,11,11,12,11,12,12, 0, 0, 0,10,10, 9, 9,11, + 11,12,12,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,11,12,11,11,13,12,13,13, 0, 0, 0, 0, + 0,12,12,11,11,13,12,14,14, +}; + +static const static_codebook _44c0_sm_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c0_sm_p7_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c0_sm_p7_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c0_sm_p7_1[] = { + 2, 4, 4, 4, 4, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c0_sm_p7_1 = { + 2, 25, + (long *)_vq_lengthlist__44c0_sm_p7_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c0_sm_p7_1, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p8_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c0_sm_p8_0[] = { + 1, 3, 3,11,11,11,11,11,11, 3, 7, 6,11,11,11,11, + 11,11, 4, 8, 7,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12, +}; + +static const static_codebook _44c0_sm_p8_0 = { + 2, 81, + (long *)_vq_lengthlist__44c0_sm_p8_0, + 1, -516186112, 1627103232, 4, 0, + (long *)_vq_quantlist__44c0_sm_p8_0, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p8_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c0_sm_p8_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,10,11,12,12, 6, 5, 5, + 7, 7, 8, 8,10,10,12,11,12,12, 6, 5, 5, 7, 7, 8, + 8,10,10,12,11,12,12,17, 7, 7, 8, 8, 9, 9,10,10, + 12,12,13,13,18, 7, 7, 8, 7, 9, 9,10,10,12,12,12, + 13,19,10,10, 8, 8,10,10,11,11,12,12,13,14,19,11, + 10, 8, 7,10,10,11,11,12,12,13,12,19,19,19,10,10, + 10,10,11,11,12,12,13,13,19,19,19,11, 9,11, 9,14, + 12,13,12,13,13,19,20,18,13,14,11,11,12,12,13,13, + 14,13,20,20,20,15,13,11,10,13,11,13,13,14,13,20, + 20,20,20,20,13,14,12,12,13,13,13,13,20,20,20,20, + 20,13,13,12,12,16,13,15,13, +}; + +static const static_codebook _44c0_sm_p8_1 = { + 2, 169, + (long *)_vq_lengthlist__44c0_sm_p8_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44c0_sm_p8_1, + 0 +}; + +static const long _vq_quantlist__44c0_sm_p8_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c0_sm_p8_2[] = { + 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, + 9,10, 9, 9,10,10,10,11, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9,10, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,11,10,10, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,11,11, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,11,11,11, 9, 9, + 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,11,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,10,11,11, + 11,11,11, 9, 9,10, 9, 9, 9, 9, 9, 9, 9,10,11,10, + 11,11,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9,10,11, + 11,11,11,11,11, 9,10, 9, 9, 9, 9, 9, 9, 9, 9,11, + 11,10,11,11,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,11,10,11,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, + 9, +}; + +static const static_codebook _44c0_sm_p8_2 = { + 2, 289, + (long *)_vq_lengthlist__44c0_sm_p8_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c0_sm_p8_2, + 0 +}; + +static const long _huff_lengthlist__44c0_sm_short[] = { + 6, 6,12,13,13,14,16,17,17, 4, 2, 5, 8, 7, 9,12, + 15,15, 9, 4, 5, 9, 7, 9,12,16,18,11, 6, 7, 4, 6, + 8,11,14,18,10, 5, 6, 5, 5, 7,10,14,17,10, 5, 7, + 7, 6, 7,10,13,16,11, 5, 7, 7, 7, 8,10,12,15,13, + 6, 7, 5, 5, 7, 9,12,13,16, 8, 9, 6, 6, 7, 9,10, + 12, +}; + +static const static_codebook _huff_book__44c0_sm_short = { + 2, 81, + (long *)_huff_lengthlist__44c0_sm_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c1_s_long[] = { + 5, 5, 9,10, 9, 9,10,11,12, 5, 1, 5, 6, 6, 7,10, + 12,14, 9, 5, 6, 8, 8,10,12,14,14,10, 5, 8, 5, 6, + 8,11,13,14, 9, 5, 7, 6, 6, 8,10,12,11, 9, 7, 9, + 7, 6, 6, 7,10,10,10, 9,12, 9, 8, 7, 7,10,12,11, + 11,13,12,10, 9, 8, 9,11,11,14,15,15,13,11, 9, 9, + 11, +}; + +static const static_codebook _huff_book__44c1_s_long = { + 2, 81, + (long *)_huff_lengthlist__44c1_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c1_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c1_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, + 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c1_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c1_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c1_s_p2_0[] = { + 2, 3, 4, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c1_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c1_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c1_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c1_s_p3_0[] = { + 1, 3, 2, 7, 7, 0, 0, 0, 0, 0,13,13, 6, 6, 0, 0, + 0, 0, 0,12, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0,11,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c1_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c1_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c1_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c1_s_p4_0[] = { + 1, 3, 3, 6, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, +}; + +static const static_codebook _44c1_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c1_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p5_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c1_s_p5_0[] = { + 1, 4, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,11, 0, 0, 0, 8, 8, 9, 9, 9,10,10,10, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10, 9,10, + 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, + 10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,12,12,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, +}; + +static const static_codebook _44c1_s_p5_0 = { + 2, 289, + (long *)_vq_lengthlist__44c1_s_p5_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c1_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c1_s_p6_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 6,10,10,11,11, + 11,11,10,10, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, + 11,10,11,11,10,10, 7,11,10,11,11,11,12,11,11, 7, + 9, 9,11,10,10,11,11,10, 6, 9, 9,10,10,10,12,10, + 11, +}; + +static const static_codebook _44c1_s_p6_0 = { + 4, 81, + (long *)_vq_lengthlist__44c1_s_p6_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c1_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p6_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c1_s_p6_1[] = { + 2, 3, 3, 6, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, + 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c1_s_p6_1 = { + 2, 121, + (long *)_vq_lengthlist__44c1_s_p6_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c1_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44c1_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c1_s_p7_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 9, 7, 5, 6, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9,10,10,10,11,11,11,11, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0,10,10, + 10,10,11,11,12,11,12,12, 0, 0, 0,10,10,10, 9,11, + 11,12,11,13,12, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,11,12,11,11,12,12,14,13, 0, 0, 0, 0, + 0,12,11,11,11,13,10,14,13, +}; + +static const static_codebook _44c1_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c1_s_p7_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c1_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c1_s_p7_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c1_s_p7_1 = { + 2, 25, + (long *)_vq_lengthlist__44c1_s_p7_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c1_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44c1_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c1_s_p8_0[] = { + 1, 4, 3,10,10,10,10,10,10,10,10,10,10, 4, 8, 6, + 10,10,10,10,10,10,10,10,10,10, 4, 8, 7,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44c1_s_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__44c1_s_p8_0, + 1, -514541568, 1627103232, 4, 0, + (long *)_vq_quantlist__44c1_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44c1_s_p8_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c1_s_p8_1[] = { + 1, 4, 4, 6, 5, 7, 7, 9, 9,10,10,12,12, 6, 5, 5, + 7, 7, 8, 8,10,10,12,11,12,12, 6, 5, 5, 7, 7, 8, + 8,10,10,11,11,12,12,15, 7, 7, 8, 8, 9, 9,11,11, + 12,12,13,12,15, 8, 8, 8, 7, 9, 9,10,10,12,12,13, + 13,16,11,10, 8, 8,10,10,11,11,12,12,13,13,16,11, + 11, 9, 8,11,10,11,11,12,12,13,12,16,16,16,10,11, + 10,11,12,12,12,12,13,13,16,16,16,11, 9,11, 9,14, + 12,12,12,13,13,16,16,16,12,14,11,12,12,12,13,13, + 14,13,16,16,16,15,13,12,10,13,10,13,14,13,13,16, + 16,16,16,16,13,14,12,13,13,12,13,13,16,16,16,16, + 16,13,12,12,11,14,12,15,13, +}; + +static const static_codebook _44c1_s_p8_1 = { + 2, 169, + (long *)_vq_lengthlist__44c1_s_p8_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44c1_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44c1_s_p8_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c1_s_p8_2[] = { + 2, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9,10, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, + 9,10, 9, 9,10,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 9, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,11,11,11, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10,11,11,11, 8, 8, 9, + 9, 9, 9,10, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10,10,11,11, + 11,11,11, 9, 9, 9,10, 9, 9, 9, 9, 9, 9,10,11,11, + 11,11,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9,10,11, + 11,11,11,11,11, 9,10, 9, 9, 9, 9,10, 9, 9, 9,11, + 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, + 11,11,10,11,11,11,11,10,11, 9, 9, 9, 9, 9, 9, 9, + 9, +}; + +static const static_codebook _44c1_s_p8_2 = { + 2, 289, + (long *)_vq_lengthlist__44c1_s_p8_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c1_s_p8_2, + 0 +}; + +static const long _huff_lengthlist__44c1_s_short[] = { + 6, 8,13,12,13,14,15,16,16, 4, 2, 4, 7, 6, 8,11, + 13,15,10, 4, 4, 8, 6, 8,11,14,17,11, 5, 6, 5, 6, + 8,12,14,17,11, 5, 5, 6, 5, 7,10,13,16,12, 6, 7, + 8, 7, 8,10,13,15,13, 8, 8, 7, 7, 8,10,12,15,15, + 7, 7, 5, 5, 7, 9,12,14,15, 8, 8, 6, 6, 7, 8,10, + 11, +}; + +static const static_codebook _huff_book__44c1_s_short = { + 2, 81, + (long *)_huff_lengthlist__44c1_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44c1_sm_long[] = { + 5, 4, 8,10, 9, 9,10,11,12, 4, 2, 5, 6, 6, 8,10, + 11,13, 8, 4, 6, 8, 7, 9,12,12,14,10, 6, 8, 4, 5, + 6, 9,11,12, 9, 5, 6, 5, 5, 6, 9,11,11, 9, 7, 9, + 6, 5, 5, 7,10,10,10, 9,11, 8, 7, 6, 7, 9,11,11, + 12,13,10,10, 9, 8, 9,11,11,15,15,12,13,11, 9,10, + 11, +}; + +static const static_codebook _huff_book__44c1_sm_long = { + 2, 81, + (long *)_huff_lengthlist__44c1_sm_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c1_sm_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c1_sm_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44c1_sm_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44c1_sm_p1_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c1_sm_p2_0[] = { + 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c1_sm_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44c1_sm_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c1_sm_p2_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c1_sm_p3_0[] = { + 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, + 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44c1_sm_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44c1_sm_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c1_sm_p3_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44c1_sm_p4_0[] = { + 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, 8, 8, + 9, 9, 0, 6, 6, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, + 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 8, 8, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, + 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, +}; + +static const static_codebook _44c1_sm_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44c1_sm_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44c1_sm_p4_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p5_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c1_sm_p5_0[] = { + 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10,10, + 10,11,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, + 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 9, 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, +}; + +static const static_codebook _44c1_sm_p5_0 = { + 2, 289, + (long *)_vq_lengthlist__44c1_sm_p5_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c1_sm_p5_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44c1_sm_p6_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, + 11,11,10,10, 6, 9, 9,11,11,10,11,10,10, 6, 9, 9, + 11,10,11,11,10,10, 7,11,11,11,11,11,11,11,11, 6, + 9, 9,11,10,10,11,11,10, 6, 9, 9,10,10,10,11,10, + 11, +}; + +static const static_codebook _44c1_sm_p6_0 = { + 4, 81, + (long *)_vq_lengthlist__44c1_sm_p6_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44c1_sm_p6_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p6_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44c1_sm_p6_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 9, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44c1_sm_p6_1 = { + 2, 121, + (long *)_vq_lengthlist__44c1_sm_p6_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44c1_sm_p6_1, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c1_sm_p7_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, + 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0, 9,10, + 9,10,11,11,12,11,13,12, 0, 0, 0,10,10, 9, 9,11, + 11,12,12,13,12, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,11,12,11,11,12,13,14,13, 0, 0, 0, 0, + 0,12,12,11,11,13,12,14,13, +}; + +static const static_codebook _44c1_sm_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44c1_sm_p7_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44c1_sm_p7_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44c1_sm_p7_1[] = { + 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44c1_sm_p7_1 = { + 2, 25, + (long *)_vq_lengthlist__44c1_sm_p7_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44c1_sm_p7_1, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c1_sm_p8_0[] = { + 1, 3, 3,13,13,13,13,13,13,13,13,13,13, 3, 6, 6, + 13,13,13,13,13,13,13,13,13,13, 4, 8, 7,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13, +}; + +static const static_codebook _44c1_sm_p8_0 = { + 2, 169, + (long *)_vq_lengthlist__44c1_sm_p8_0, + 1, -514541568, 1627103232, 4, 0, + (long *)_vq_quantlist__44c1_sm_p8_0, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p8_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44c1_sm_p8_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,10,11,12,12, 6, 5, 5, + 7, 7, 8, 7,10,10,11,11,12,12, 6, 5, 5, 7, 7, 8, + 8,10,10,11,11,12,12,16, 7, 7, 8, 8, 9, 9,11,11, + 12,12,13,13,17, 7, 7, 8, 7, 9, 9,11,10,12,12,13, + 13,19,11,10, 8, 8,10,10,11,11,12,12,13,13,19,11, + 11, 9, 7,11,10,11,11,12,12,13,12,19,19,19,10,10, + 10,10,11,12,12,12,13,14,18,19,19,11, 9,11, 9,13, + 12,12,12,13,13,19,20,19,13,15,11,11,12,12,13,13, + 14,13,18,19,20,15,13,12,10,13,10,13,13,13,14,20, + 20,20,20,20,13,14,12,12,13,12,13,13,20,20,20,20, + 20,13,12,12,12,14,12,14,13, +}; + +static const static_codebook _44c1_sm_p8_1 = { + 2, 169, + (long *)_vq_lengthlist__44c1_sm_p8_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44c1_sm_p8_1, + 0 +}; + +static const long _vq_quantlist__44c1_sm_p8_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44c1_sm_p8_2[] = { + 2, 5, 5, 6, 6, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10,10, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,11,10,10, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, + 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,11,11,11, 9, + 8, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,11,11, + 11,11,11, 9, 9,10, 9, 9, 9, 9,10, 9,10,10,11,10, + 11,11,11,11, 9,10,10,10, 9, 9, 9, 9, 9, 9,10,11, + 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11, + 11,10,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, + 10,11,10,11,11,11,11,11,11, 9, 9,10, 9, 9, 9, 9, + 9, +}; + +static const static_codebook _44c1_sm_p8_2 = { + 2, 289, + (long *)_vq_lengthlist__44c1_sm_p8_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44c1_sm_p8_2, + 0 +}; + +static const long _huff_lengthlist__44c1_sm_short[] = { + 4, 7,13,14,14,15,16,18,18, 4, 2, 5, 8, 7, 9,12, + 15,15,10, 4, 5,10, 6, 8,11,15,17,12, 5, 7, 5, 6, + 8,11,14,17,11, 5, 6, 6, 5, 6, 9,13,17,12, 6, 7, + 6, 5, 6, 8,12,14,14, 7, 8, 6, 6, 7, 9,11,14,14, + 8, 9, 6, 5, 6, 9,11,13,16,10,10, 7, 6, 7, 8,10, + 11, +}; + +static const static_codebook _huff_book__44c1_sm_short = { + 2, 81, + (long *)_huff_lengthlist__44c1_sm_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44cn1_s_long[] = { + 4, 4, 7, 8, 7, 8,10,12,17, 3, 1, 6, 6, 7, 8,10, + 12,15, 7, 6, 9, 9, 9,11,12,14,17, 8, 6, 9, 6, 7, + 9,11,13,17, 7, 6, 9, 7, 7, 8, 9,12,15, 8, 8,10, + 8, 7, 7, 7,10,14, 9,10,12,10, 8, 8, 8,10,14,11, + 13,15,13,12,11,11,12,16,17,18,18,19,20,18,16,16, + 20, +}; + +static const static_codebook _huff_book__44cn1_s_long = { + 2, 81, + (long *)_huff_lengthlist__44cn1_s_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44cn1_s_p1_0[] = { + 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, + 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0,10,11,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, + 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0,10,11,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, + 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,11, 0, + 0, 0, 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,11, + 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44cn1_s_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44cn1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44cn1_s_p1_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44cn1_s_p2_0[] = { + 1, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44cn1_s_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44cn1_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44cn1_s_p2_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44cn1_s_p3_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 9, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44cn1_s_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44cn1_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44cn1_s_p3_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44cn1_s_p4_0[] = { + 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 6, 6, 7, 7, + 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, + 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, + 11, +}; + +static const static_codebook _44cn1_s_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44cn1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44cn1_s_p4_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p5_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44cn1_s_p5_0[] = { + 1, 4, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, + 10, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11, 0, 0, 0, 8, 8, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, + 10,10,11,11,11,12,12, 0, 0, 0, 9, 9,10, 9,10,10, + 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, + 10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,11,10,11,11,11,12,13,12,13,13, 0, 0, 0, 0, + 0, 0, 0,11,10,11,11,12,12,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,13,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,12,13,13,14, + 14, +}; + +static const static_codebook _44cn1_s_p5_0 = { + 2, 289, + (long *)_vq_lengthlist__44cn1_s_p5_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44cn1_s_p5_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44cn1_s_p6_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 6, 6,10, 9, 9,11, + 9, 9, 4, 6, 6,10, 9, 9,10, 9, 9, 7,10,10,11,11, + 11,12,11,11, 7, 9, 9,11,11,10,11,10,10, 7, 9, 9, + 11,10,11,11,10,10, 7,10,10,11,11,11,12,11,11, 7, + 9, 9,11,10,10,11,10,10, 7, 9, 9,11,10,10,11,10, + 10, +}; + +static const static_codebook _44cn1_s_p6_0 = { + 4, 81, + (long *)_vq_lengthlist__44cn1_s_p6_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44cn1_s_p6_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p6_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44cn1_s_p6_1[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 6, + 8, 8, 8, 8, 8, 8,10,10,10, 7, 6, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 9, 9, + 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, + 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10, + 10,10,10, 9, 9, 9, 9, 9, 9, +}; + +static const static_codebook _44cn1_s_p6_1 = { + 2, 121, + (long *)_vq_lengthlist__44cn1_s_p6_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44cn1_s_p6_1, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44cn1_s_p7_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,11,11, 7, 5, 5, 7, 7, 8, + 8, 8, 8, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9,10,10,10,11,11,11,12, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0,10,10, + 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, + 11,12,12,13,12, 0, 0, 0,14,14,11,10,11,12,12,13, + 13,14, 0, 0, 0,15,15,11,11,12,11,12,12,14,13, 0, + 0, 0, 0, 0,12,12,12,12,13,13,14,14, 0, 0, 0, 0, + 0,13,13,12,12,13,13,13,14, +}; + +static const static_codebook _44cn1_s_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44cn1_s_p7_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44cn1_s_p7_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44cn1_s_p7_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44cn1_s_p7_1 = { + 2, 25, + (long *)_vq_lengthlist__44cn1_s_p7_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44cn1_s_p7_1, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p8_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44cn1_s_p8_0[] = { + 1, 7, 7,11,11, 8,11,11,11,11, 4,11, 3,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11, 7,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11, 8,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12, +}; + +static const static_codebook _44cn1_s_p8_0 = { + 4, 625, + (long *)_vq_lengthlist__44cn1_s_p8_0, + 1, -518283264, 1627103232, 3, 0, + (long *)_vq_quantlist__44cn1_s_p8_0, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p8_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44cn1_s_p8_1[] = { + 1, 4, 4, 6, 6, 8, 8, 9,10,10,11,11,11, 6, 5, 5, + 7, 7, 8, 8, 9,10, 9,11,11,12, 5, 5, 5, 7, 7, 8, + 9,10,10,12,12,14,13,15, 7, 7, 8, 8, 9,10,11,11, + 10,12,10,11,15, 7, 8, 8, 8, 9, 9,11,11,13,12,12, + 13,15,10,10, 8, 8,10,10,12,12,11,14,10,10,15,11, + 11, 8, 8,10,10,12,13,13,14,15,13,15,15,15,10,10, + 10,10,12,12,13,12,13,10,15,15,15,10,10,11,10,13, + 11,13,13,15,13,15,15,15,13,13,10,11,11,11,12,10, + 14,11,15,15,14,14,13,10,10,12,11,13,13,14,14,15, + 15,15,15,15,11,11,11,11,12,11,15,12,15,15,15,15, + 15,12,12,11,11,14,12,13,14, +}; + +static const static_codebook _44cn1_s_p8_1 = { + 2, 169, + (long *)_vq_lengthlist__44cn1_s_p8_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44cn1_s_p8_1, + 0 +}; + +static const long _vq_quantlist__44cn1_s_p8_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44cn1_s_p8_2[] = { + 3, 4, 3, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9,10,11,11, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 9,10,11,10, 7, 6, 7, 7, 8, 8, 9, 9, 9, + 9, 9, 9, 9,10,10,10,11, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9,10,11,11,11, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, 8, 8, 8, + 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,11,11, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11, + 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, + 10,11,11,11, 9,10,10, 9, 9, 9, 9, 9, 9, 9,10,11, + 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 11,11,11,10,11,11,11,11,11, 9, 9, 9,10, 9, 9, 9, + 9, +}; + +static const static_codebook _44cn1_s_p8_2 = { + 2, 289, + (long *)_vq_lengthlist__44cn1_s_p8_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44cn1_s_p8_2, + 0 +}; + +static const long _huff_lengthlist__44cn1_s_short[] = { + 10, 9,12,15,12,13,16,14,16, 7, 1, 5,14, 7,10,13, + 16,16, 9, 4, 6,16, 8,11,16,16,16,14, 4, 7,16, 9, + 12,14,16,16,10, 5, 7,14, 9,12,14,15,15,13, 8, 9, + 14,10,12,13,14,15,13, 9, 9, 7, 6, 8,11,12,12,14, + 8, 8, 5, 4, 5, 8,11,12,16,10,10, 6, 5, 6, 8, 9, + 10, +}; + +static const static_codebook _huff_book__44cn1_s_short = { + 2, 81, + (long *)_huff_lengthlist__44cn1_s_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44cn1_sm_long[] = { + 3, 3, 8, 8, 8, 8,10,12,14, 3, 2, 6, 7, 7, 8,10, + 12,16, 7, 6, 7, 9, 8,10,12,14,16, 8, 6, 8, 4, 5, + 7, 9,11,13, 7, 6, 8, 5, 6, 7, 9,11,14, 8, 8,10, + 7, 7, 6, 8,10,13, 9,11,12, 9, 9, 7, 8,10,12,10, + 13,15,11,11,10, 9,10,13,13,16,17,14,15,14,13,14, + 17, +}; + +static const static_codebook _huff_book__44cn1_sm_long = { + 2, 81, + (long *)_huff_lengthlist__44cn1_sm_long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44cn1_sm_p1_0[] = { + 1, 4, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, + 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44cn1_sm_p1_0 = { + 8, 6561, + (long *)_vq_lengthlist__44cn1_sm_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44cn1_sm_p1_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44cn1_sm_p2_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44cn1_sm_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44cn1_sm_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44cn1_sm_p2_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44cn1_sm_p3_0[] = { + 1, 3, 4, 7, 7, 0, 0, 0, 0, 0, 4, 4, 7, 7, 0, 0, + 0, 0, 0, 4, 5, 7, 7, 0, 0, 0, 0, 0, 6, 7, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0,10, 9, 0, 0, 0, 0, 0, + 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +}; + +static const static_codebook _44cn1_sm_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44cn1_sm_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44cn1_sm_p3_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44cn1_sm_p4_0[] = { + 1, 4, 3, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 8, 7, + 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, + 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, + 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, + 11, +}; + +static const static_codebook _44cn1_sm_p4_0 = { + 2, 81, + (long *)_vq_lengthlist__44cn1_sm_p4_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44cn1_sm_p4_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p5_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44cn1_sm_p5_0[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11, + 11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 6, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10,11, + 11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, 0, + 10,10,11,11,11,11,12,12,13,13,14,14, 0, 0, 0, 0, + 0, 0, 0,11,11,11,11,12,12,13,13,14,14, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,13,13,13,14,14,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,14,14, + 14, +}; + +static const static_codebook _44cn1_sm_p5_0 = { + 2, 289, + (long *)_vq_lengthlist__44cn1_sm_p5_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44cn1_sm_p5_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p6_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44cn1_sm_p6_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 6,10, 9, 9,11, + 9, 9, 4, 6, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, + 11,11,11,10, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, + 11,10,11,11,10,10, 7,11,11,11,11,11,12,11,11, 7, + 9, 9,11,10,10,12,10,10, 7, 9, 9,11,10,10,11,10, + 10, +}; + +static const static_codebook _44cn1_sm_p6_0 = { + 4, 81, + (long *)_vq_lengthlist__44cn1_sm_p6_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44cn1_sm_p6_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p6_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44cn1_sm_p6_1[] = { + 2, 4, 4, 5, 5, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, + 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, + 8, 9, 9,10,10,10,10,10, 9, 9, 9, 9, 8, 9,10,10, + 10,10,10, 8, 9, 8, 8, 9, 8, +}; + +static const static_codebook _44cn1_sm_p6_1 = { + 2, 121, + (long *)_vq_lengthlist__44cn1_sm_p6_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44cn1_sm_p6_1, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44cn1_sm_p7_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 9, 9,10,10, 7, 5, 5, + 7, 7, 8, 8, 8, 8,10, 9,11,10, 7, 5, 5, 7, 7, 8, + 8, 8, 8, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9,10,10,10,11,11,12,12, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, + 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, + 11,12,12,12,12, 0, 0, 0,14,14,11,11,11,11,12,13, + 13,13, 0, 0, 0,14,14,11,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,12,12,12,12,13,13,13,14, 0, 0, 0, 0, + 0,13,12,12,12,13,13,13,14, +}; + +static const static_codebook _44cn1_sm_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44cn1_sm_p7_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44cn1_sm_p7_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p7_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44cn1_sm_p7_1[] = { + 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, +}; + +static const static_codebook _44cn1_sm_p7_1 = { + 2, 25, + (long *)_vq_lengthlist__44cn1_sm_p7_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44cn1_sm_p7_1, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p8_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44cn1_sm_p8_0[] = { + 1, 4, 4,12,11,13,13,14,14, 4, 7, 7,11,13,14,14, + 14,14, 3, 8, 3,14,14,14,14,14,14,14,10,12,14,14, + 14,14,14,14,14,14, 5,14, 8,14,14,14,14,14,12,14, + 13,14,14,14,14,14,14,14,13,14,10,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14, +}; + +static const static_codebook _44cn1_sm_p8_0 = { + 2, 81, + (long *)_vq_lengthlist__44cn1_sm_p8_0, + 1, -516186112, 1627103232, 4, 0, + (long *)_vq_quantlist__44cn1_sm_p8_0, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p8_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44cn1_sm_p8_1[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9,10,11,11,11, 6, 5, 5, + 7, 7, 8, 8,10,10,10,11,11,11, 6, 5, 5, 7, 7, 8, + 8,10,10,11,12,12,12,14, 7, 7, 7, 8, 9, 9,11,11, + 11,12,11,12,17, 7, 7, 8, 7, 9, 9,11,11,12,12,12, + 12,14,11,11, 8, 8,10,10,11,12,12,13,11,12,14,11, + 11, 8, 8,10,10,11,12,12,13,13,12,14,15,14,10,10, + 10,10,11,12,12,12,12,11,14,13,16,10,10,10, 9,12, + 11,12,12,13,14,14,15,14,14,13,10,10,11,11,12,11, + 13,11,14,12,15,13,14,11,10,12,10,12,12,13,13,13, + 13,14,15,15,12,12,11,11,12,11,13,12,14,14,14,14, + 17,12,12,11,10,13,11,13,13, +}; + +static const static_codebook _44cn1_sm_p8_1 = { + 2, 169, + (long *)_vq_lengthlist__44cn1_sm_p8_1, + 1, -522616832, 1620115456, 4, 0, + (long *)_vq_quantlist__44cn1_sm_p8_1, + 0 +}; + +static const long _vq_quantlist__44cn1_sm_p8_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44cn1_sm_p8_2[] = { + 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9,10, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9,10, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9,11,10,11, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, 8, 8, 8, + 8, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11,11, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11, + 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,11, + 11,11,11,11, 9,10,10,10, 9, 9, 9, 9, 9, 9,11,10, + 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,11,11,11,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, + 9, +}; + +static const static_codebook _44cn1_sm_p8_2 = { + 2, 289, + (long *)_vq_lengthlist__44cn1_sm_p8_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44cn1_sm_p8_2, + 0 +}; + +static const long _huff_lengthlist__44cn1_sm_short[] = { + 5, 6,12,14,12,14,16,17,18, 4, 2, 5,11, 7,10,12, + 14,15, 9, 4, 5,11, 7,10,13,15,18,15, 6, 7, 5, 6, + 8,11,13,16,11, 5, 6, 5, 5, 6, 9,13,15,12, 5, 7, + 6, 5, 6, 9,12,14,12, 6, 7, 8, 6, 7, 9,12,13,14, + 8, 8, 7, 5, 5, 8,10,12,16, 9, 9, 8, 6, 6, 7, 9, + 9, +}; + +static const static_codebook _huff_book__44cn1_sm_short = { + 2, 81, + (long *)_huff_lengthlist__44cn1_sm_short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h new file mode 100644 index 0000000000..609b97be7d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h @@ -0,0 +1,1546 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: static codebooks autogenerated by huff/huffbuld + last modified: $Id: floor_books.h 16939 2010-03-01 08:38:14Z xiphmont $ + + ********************************************************************/ + +#include "../../codebook.h" + +static const long _huff_lengthlist_line_256x7_0sub1[] = { + 0, 2, 3, 3, 3, 3, 4, 3, 4, +}; + +static const static_codebook _huff_book_line_256x7_0sub1 = { + 1, 9, + (long *)_huff_lengthlist_line_256x7_0sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 5, 3, + 6, 3, 6, 4, 6, 4, 7, 5, 7, +}; + +static const static_codebook _huff_book_line_256x7_0sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_256x7_0sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 5, 3, 5, 3, + 6, 3, 6, 4, 7, 6, 7, 8, 7, 9, 8, 9, 9, 9,10, 9, + 11,13,11,13,10,10,13,13,13,13,13,13,12,12,12,12, +}; + +static const static_codebook _huff_book_line_256x7_0sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_256x7_0sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_1sub1[] = { + 0, 3, 3, 3, 3, 2, 4, 3, 4, +}; + +static const static_codebook _huff_book_line_256x7_1sub1 = { + 1, 9, + (long *)_huff_lengthlist_line_256x7_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_1sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 4, 3, 4, 4, + 5, 4, 6, 5, 6, 7, 6, 8, 8, +}; + +static const static_codebook _huff_book_line_256x7_1sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_256x7_1sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_1sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 4, 3, 6, 3, 7, + 3, 8, 5, 8, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, +}; + +static const static_codebook _huff_book_line_256x7_1sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_256x7_1sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_class0[] = { + 7, 5, 5, 9, 9, 6, 6, 9,12, 8, 7, 8,11, 8, 9,15, + 6, 3, 3, 7, 7, 4, 3, 6, 9, 6, 5, 6, 8, 6, 8,15, + 8, 5, 5, 9, 8, 5, 4, 6,10, 7, 5, 5,11, 8, 7,15, + 14,15,13,13,13,13, 8,11,15,10, 7, 6,11, 9,10,15, +}; + +static const static_codebook _huff_book_line_256x7_class0 = { + 1, 64, + (long *)_huff_lengthlist_line_256x7_class0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x7_class1[] = { + 5, 6, 8,15, 6, 9,10,15,10,11,12,15,15,15,15,15, + 4, 6, 7,15, 6, 7, 8,15, 9, 8, 9,15,15,15,15,15, + 6, 8, 9,15, 7, 7, 8,15,10, 9,10,15,15,15,15,15, + 15,13,15,15,15,10,11,15,15,13,13,15,15,15,15,15, + 4, 6, 7,15, 6, 8, 9,15,10,10,12,15,15,15,15,15, + 2, 5, 6,15, 5, 6, 7,15, 8, 6, 7,15,15,15,15,15, + 5, 6, 8,15, 5, 6, 7,15, 9, 6, 7,15,15,15,15,15, + 14,12,13,15,12,10,11,15,15,15,15,15,15,15,15,15, + 7, 8, 9,15, 9,10,10,15,15,14,14,15,15,15,15,15, + 5, 6, 7,15, 7, 8, 9,15,12, 9,10,15,15,15,15,15, + 7, 7, 9,15, 7, 7, 8,15,12, 8, 9,15,15,15,15,15, + 13,13,14,15,12,11,12,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,12,13,15,15,12,13,15,15,14,15,15,15,15,15,15, + 15,15,15,15,15,15,13,15,15,15,15,15,15,15,15,15, +}; + +static const static_codebook _huff_book_line_256x7_class1 = { + 1, 256, + (long *)_huff_lengthlist_line_256x7_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_0sub0[] = { + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 6, 5, 6, 6, 6, 6, 5, 6, 6, 7, 6, 7, 6, 7, 6, + 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 9, 7, 9, 7, + 9, 7, 9, 8, 9, 8,10, 8,10, 8,10, 7,10, 6,10, 8, + 10, 8,11, 7,10, 7,11, 8,11,11,12,12,11,11,12,11, + 13,11,13,11,13,12,15,12,13,13,14,14,14,14,14,15, + 15,15,16,14,17,19,19,18,18,18,18,18,18,18,18,18, + 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, +}; + +static const static_codebook _huff_book_line_512x17_0sub0 = { + 1, 128, + (long *)_huff_lengthlist_line_512x17_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_1sub0[] = { + 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, +}; + +static const static_codebook _huff_book_line_512x17_1sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_512x17_1sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 3, 5, 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 6, 5, + 6, 5, 7, 5, 8, 6, 8, 6, 8, 6, 8, 6, 8, 7, 9, 7, + 9, 7,11, 9,11,11,12,11,14,12,14,16,14,16,13,16, + 14,16,12,15,13,16,14,16,13,14,12,15,13,15,13,13, + 13,15,12,14,14,15,13,15,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +}; + +static const static_codebook _huff_book_line_512x17_1sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_512x17_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_2sub1[] = { + 0, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 5, 4, 5, 3, + 5, 3, +}; + +static const static_codebook _huff_book_line_512x17_2sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_512x17_2sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_2sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 6, 4, 6, 5, + 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 7, 8, 7, 9, 7, + 9, 8, +}; + +static const static_codebook _huff_book_line_512x17_2sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_512x17_2sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_2sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 4, 3, 4, 4, 5, 5, 6, 6, 7, 7, + 7, 8, 8,11, 8, 9, 9, 9,10,11,11,11, 9,10,10,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _huff_book_line_512x17_2sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_512x17_2sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_3sub1[] = { + 0, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 5, 4, 5, + 5, 5, +}; + +static const static_codebook _huff_book_line_512x17_3sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_512x17_3sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 3, 4, 3, 5, 4, 6, 4, 6, 5, 7, 6, 7, + 6, 8, 6, 8, 7, 9, 8,10, 8,12, 9,13,10,15,10,15, + 11,14, +}; + +static const static_codebook _huff_book_line_512x17_3sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_512x17_3sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 8, 4, 8, 4, 8, 4, 8, 5, 8, 5, 8, 6, 8, + 4, 8, 4, 8, 5, 8, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _huff_book_line_512x17_3sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_512x17_3sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_class1[] = { + 1, 2, 3, 6, 5, 4, 7, 7, +}; + +static const static_codebook _huff_book_line_512x17_class1 = { + 1, 8, + (long *)_huff_lengthlist_line_512x17_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_class2[] = { + 3, 3, 3,14, 5, 4, 4,11, 8, 6, 6,10,17,12,11,17, + 6, 5, 5,15, 5, 3, 4,11, 8, 5, 5, 8,16, 9,10,14, + 10, 8, 9,17, 8, 6, 6,13,10, 7, 7,10,16,11,13,14, + 17,17,17,17,17,16,16,16,16,15,16,16,16,16,16,16, +}; + +static const static_codebook _huff_book_line_512x17_class2 = { + 1, 64, + (long *)_huff_lengthlist_line_512x17_class2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_512x17_class3[] = { + 2, 4, 6,17, 4, 5, 7,17, 8, 7,10,17,17,17,17,17, + 3, 4, 6,15, 3, 3, 6,15, 7, 6, 9,17,17,17,17,17, + 6, 8,10,17, 6, 6, 8,16, 9, 8,10,17,17,15,16,17, + 17,17,17,17,12,15,15,16,12,15,15,16,16,16,16,16, +}; + +static const static_codebook _huff_book_line_512x17_class3 = { + 1, 64, + (long *)_huff_lengthlist_line_512x17_class3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x4_class0[] = { + 7, 7, 7,11, 6, 6, 7,11, 7, 6, 6,10,12,10,10,13, + 7, 7, 8,11, 7, 7, 7,11, 7, 6, 7,10,11,10,10,13, + 10,10, 9,12, 9, 9, 9,11, 8, 8, 8,11,13,11,10,14, + 15,15,14,15,15,14,13,14,15,12,12,17,17,17,17,17, + 7, 7, 6, 9, 6, 6, 6, 9, 7, 6, 6, 8,11,11,10,12, + 7, 7, 7, 9, 7, 6, 6, 9, 7, 6, 6, 9,13,10,10,11, + 10, 9, 8,10, 9, 8, 8,10, 8, 8, 7, 9,13,12,10,11, + 17,14,14,13,15,14,12,13,17,13,12,15,17,17,14,17, + 7, 6, 6, 7, 6, 6, 5, 7, 6, 6, 6, 6,11, 9, 9, 9, + 7, 7, 6, 7, 7, 6, 6, 7, 6, 6, 6, 6,10, 9, 8, 9, + 10, 9, 8, 8, 9, 8, 7, 8, 8, 7, 6, 8,11,10, 9,10, + 17,17,12,15,15,15,12,14,14,14,10,12,15,13,12,13, + 11,10, 8,10,11,10, 8, 8,10, 9, 7, 7,10, 9, 9,11, + 11,11, 9,10,11,10, 8, 9,10, 8, 6, 8,10, 9, 9,11, + 14,13,10,12,12,11,10,10, 8, 7, 8,10,10,11,11,12, + 17,17,15,17,17,17,17,17,17,13,12,17,17,17,14,17, +}; + +static const static_codebook _huff_book_line_128x4_class0 = { + 1, 256, + (long *)_huff_lengthlist_line_128x4_class0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x4_0sub0[] = { + 2, 2, 2, 2, +}; + +static const static_codebook _huff_book_line_128x4_0sub0 = { + 1, 4, + (long *)_huff_lengthlist_line_128x4_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x4_0sub1[] = { + 0, 0, 0, 0, 3, 2, 3, 2, 3, 3, +}; + +static const static_codebook _huff_book_line_128x4_0sub1 = { + 1, 10, + (long *)_huff_lengthlist_line_128x4_0sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x4_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 3, 4, 3, + 4, 4, 5, 4, 5, 4, 6, 5, 6, +}; + +static const static_codebook _huff_book_line_128x4_0sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_128x4_0sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x4_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 5, 3, 5, 3, + 5, 4, 6, 5, 6, 5, 7, 6, 6, 7, 7, 9, 9,11,11,16, + 11,14,10,11,11,13,16,15,15,15,15,15,15,15,15,15, +}; + +static const static_codebook _huff_book_line_128x4_0sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_128x4_0sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4_class0[] = { + 6, 7, 7,12, 6, 6, 7,12, 7, 6, 6,10,15,12,11,13, + 7, 7, 8,13, 7, 7, 8,12, 7, 7, 7,11,12,12,11,13, + 10, 9, 9,11, 9, 9, 9,10,10, 8, 8,12,14,12,12,14, + 11,11,12,14,11,12,11,15,15,12,13,15,15,15,15,15, + 6, 6, 7,10, 6, 6, 6,11, 7, 6, 6, 9,14,12,11,13, + 7, 7, 7,10, 6, 6, 7, 9, 7, 7, 6,10,13,12,10,12, + 9, 9, 9,11, 9, 9, 8, 9, 9, 8, 8,10,13,12,10,12, + 12,12,11,13,12,12,11,12,15,13,12,15,15,15,14,14, + 6, 6, 6, 8, 6, 6, 5, 6, 7, 7, 6, 5,11,10, 9, 8, + 7, 6, 6, 7, 6, 6, 5, 6, 7, 7, 6, 6,11,10, 9, 8, + 8, 8, 8, 9, 8, 8, 7, 8, 8, 8, 6, 7,11,10, 9, 9, + 14,11,10,14,14,11,10,15,13,11, 9,11,15,12,12,11, + 11, 9, 8, 8,10, 9, 8, 9,11,10, 9, 8,12,11,12,11, + 13,10, 8, 9,11,10, 8, 9,10, 9, 8, 9,10, 8,12,12, + 15,11,10,10,13,11,10,10, 8, 8, 7,12,10, 9,11,12, + 15,12,11,15,13,11,11,15,12,14,11,13,15,15,13,13, +}; + +static const static_codebook _huff_book_line_256x4_class0 = { + 1, 256, + (long *)_huff_lengthlist_line_256x4_class0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4_0sub0[] = { + 2, 2, 2, 2, +}; + +static const static_codebook _huff_book_line_256x4_0sub0 = { + 1, 4, + (long *)_huff_lengthlist_line_256x4_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4_0sub1[] = { + 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, +}; + +static const static_codebook _huff_book_line_256x4_0sub1 = { + 1, 10, + (long *)_huff_lengthlist_line_256x4_0sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 4, 3, 4, 3, + 5, 3, 5, 4, 5, 4, 6, 4, 6, +}; + +static const static_codebook _huff_book_line_256x4_0sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_256x4_0sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 5, 3, 5, 3, + 6, 4, 7, 4, 7, 5, 7, 6, 7, 6, 7, 8,10,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12, +}; + +static const static_codebook _huff_book_line_256x4_0sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_256x4_0sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_class0[] = { + 10, 7, 8,13, 9, 6, 7,11,10, 8, 8,12,17,17,17,17, + 7, 5, 5, 9, 6, 4, 4, 8, 8, 5, 5, 8,16,14,13,16, + 7, 5, 5, 7, 6, 3, 3, 5, 8, 5, 4, 7,14,12,12,15, + 10, 7, 8, 9, 7, 5, 5, 6, 9, 6, 5, 5,15,12, 9,10, +}; + +static const static_codebook _huff_book_line_128x7_class0 = { + 1, 64, + (long *)_huff_lengthlist_line_128x7_class0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_class1[] = { + 8,13,17,17, 8,11,17,17,11,13,17,17,17,17,17,17, + 6,10,16,17, 6,10,15,17, 8,10,16,17,17,17,17,17, + 9,13,15,17, 8,11,17,17,10,12,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 6,11,15,17, 7,10,15,17, 8,10,17,17,17,15,17,17, + 4, 8,13,17, 4, 7,13,17, 6, 8,15,17,16,15,17,17, + 6,11,15,17, 6, 9,13,17, 8,10,17,17,15,17,17,17, + 16,17,17,17,12,14,15,17,13,14,15,17,17,17,17,17, + 5,10,14,17, 5, 9,14,17, 7, 9,15,17,15,15,17,17, + 3, 7,12,17, 3, 6,11,17, 5, 7,13,17,12,12,17,17, + 5, 9,14,17, 3, 7,11,17, 5, 8,13,17,13,11,16,17, + 12,17,17,17, 9,14,15,17,10,11,14,17,16,14,17,17, + 8,12,17,17, 8,12,17,17,10,12,17,17,17,17,17,17, + 5,10,17,17, 5, 9,15,17, 7, 9,17,17,13,13,17,17, + 7,11,17,17, 6,10,15,17, 7, 9,15,17,12,11,17,17, + 12,15,17,17,11,14,17,17,11,10,15,17,17,16,17,17, +}; + +static const static_codebook _huff_book_line_128x7_class1 = { + 1, 256, + (long *)_huff_lengthlist_line_128x7_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_0sub1[] = { + 0, 3, 3, 3, 3, 3, 3, 3, 3, +}; + +static const static_codebook _huff_book_line_128x7_0sub1 = { + 1, 9, + (long *)_huff_lengthlist_line_128x7_0sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, + 5, 4, 5, 4, 5, 4, 6, 4, 6, +}; + +static const static_codebook _huff_book_line_128x7_0sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_128x7_0sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 3, 5, 3, 5, 4, + 5, 4, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 7, 8, 9,11,13,13,13,13,13,13,13,13,13,13,13,13, +}; + +static const static_codebook _huff_book_line_128x7_0sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_128x7_0sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_1sub1[] = { + 0, 3, 3, 2, 3, 3, 4, 3, 4, +}; + +static const static_codebook _huff_book_line_128x7_1sub1 = { + 1, 9, + (long *)_huff_lengthlist_line_128x7_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_1sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 6, 3, 6, 3, + 6, 3, 7, 3, 8, 4, 9, 4, 9, +}; + +static const static_codebook _huff_book_line_128x7_1sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_128x7_1sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x7_1sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 2, 7, 3, 8, 4, + 9, 5, 9, 8,10,11,11,12,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,13,13,13,13, +}; + +static const static_codebook _huff_book_line_128x7_1sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_128x7_1sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_class1[] = { + 1, 6, 3, 7, 2, 4, 5, 7, +}; + +static const static_codebook _huff_book_line_128x11_class1 = { + 1, 8, + (long *)_huff_lengthlist_line_128x11_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_class2[] = { + 1, 6,12,16, 4,12,15,16, 9,15,16,16,16,16,16,16, + 2, 5,11,16, 5,11,13,16, 9,13,16,16,16,16,16,16, + 4, 8,12,16, 5, 9,12,16, 9,13,15,16,16,16,16,16, + 15,16,16,16,11,14,13,16,12,15,16,16,16,16,16,15, +}; + +static const static_codebook _huff_book_line_128x11_class2 = { + 1, 64, + (long *)_huff_lengthlist_line_128x11_class2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_class3[] = { + 7, 6, 9,17, 7, 6, 8,17,12, 9,11,16,16,16,16,16, + 5, 4, 7,16, 5, 3, 6,14, 9, 6, 8,15,16,16,16,16, + 5, 4, 6,13, 3, 2, 4,11, 7, 4, 6,13,16,11,10,14, + 12,12,12,16, 9, 7,10,15,12, 9,11,16,16,15,15,16, +}; + +static const static_codebook _huff_book_line_128x11_class3 = { + 1, 64, + (long *)_huff_lengthlist_line_128x11_class3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_0sub0[] = { + 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 6, 6, 7, 6, + 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, 8, 7, + 8, 7, 8, 7, 8, 7, 9, 7, 9, 8, 9, 8, 9, 8,10, 8, + 10, 9,10, 9,10, 9,11, 9,11, 9,10,10,11,10,11,10, + 11,11,11,11,11,11,12,13,14,14,14,15,15,16,16,16, + 17,15,16,15,16,16,17,17,16,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, +}; + +static const static_codebook _huff_book_line_128x11_0sub0 = { + 1, 128, + (long *)_huff_lengthlist_line_128x11_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_1sub0[] = { + 2, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, +}; + +static const static_codebook _huff_book_line_128x11_1sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_128x11_1sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 3, 5, 3, 6, 4, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, + 8, 4, 9, 5, 9, 5, 9, 5, 9, 6,10, 6,10, 6,11, 7, + 10, 7,10, 8,11, 9,11, 9,11,10,11,11,12,11,11,12, + 15,15,12,14,11,14,12,14,11,14,13,14,12,14,11,14, + 11,14,12,14,11,14,11,14,13,13,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, +}; + +static const static_codebook _huff_book_line_128x11_1sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_128x11_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_2sub1[] = { + 0, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, + 5, 5, +}; + +static const static_codebook _huff_book_line_128x11_2sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_128x11_2sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_2sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 4, 4, 4, 4, 5, 4, 5, 4, 6, 5, 7, + 5, 7, 6, 8, 6, 8, 6, 9, 7, 9, 7,10, 7, 9, 8,11, + 8,11, +}; + +static const static_codebook _huff_book_line_128x11_2sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_128x11_2sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_2sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 8, 3, 8, 4, 8, 4, 8, 6, 8, 5, 8, 4, 8, + 4, 8, 6, 8, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _huff_book_line_128x11_2sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_128x11_2sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_3sub1[] = { + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, + 5, 4, +}; + +static const static_codebook _huff_book_line_128x11_3sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_128x11_3sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 3, 5, 4, 6, 4, 6, 4, 7, 4, 7, 4, 8, 4, + 8, 4, 9, 4, 9, 4,10, 4,10, 5,10, 5,11, 5,12, 6, + 12, 6, +}; + +static const static_codebook _huff_book_line_128x11_3sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_128x11_3sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x11_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 6, 3, 7, 3, 8, 4, 8, 5, 8, 8, 8, 9, + 7, 8, 8, 7, 7, 7, 8, 9,10, 9, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, +}; + +static const static_codebook _huff_book_line_128x11_3sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_128x11_3sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_class1[] = { + 1, 3, 4, 7, 2, 5, 6, 7, +}; + +static const static_codebook _huff_book_line_128x17_class1 = { + 1, 8, + (long *)_huff_lengthlist_line_128x17_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_class2[] = { + 1, 4,10,19, 3, 8,13,19, 7,12,19,19,19,19,19,19, + 2, 6,11,19, 8,13,19,19, 9,11,19,19,19,19,19,19, + 6, 7,13,19, 9,13,19,19,10,13,18,18,18,18,18,18, + 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, +}; + +static const static_codebook _huff_book_line_128x17_class2 = { + 1, 64, + (long *)_huff_lengthlist_line_128x17_class2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_class3[] = { + 3, 6,10,17, 4, 8,11,20, 8,10,11,20,20,20,20,20, + 2, 4, 8,18, 4, 6, 8,17, 7, 8,10,20,20,17,20,20, + 3, 5, 8,17, 3, 4, 6,17, 8, 8,10,17,17,12,16,20, + 13,13,15,20,10,10,12,20,15,14,15,20,20,20,19,19, +}; + +static const static_codebook _huff_book_line_128x17_class3 = { + 1, 64, + (long *)_huff_lengthlist_line_128x17_class3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_0sub0[] = { + 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 7, 5, 7, 5, 7, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 5, + 8, 5, 8, 5, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, 9, 6, + 9, 6, 9, 7, 9, 7, 9, 7, 9, 7,10, 7,10, 8,10, 8, + 10, 8,10, 8,10, 8,11, 8,11, 8,11, 8,11, 8,11, 9, + 12, 9,12, 9,12, 9,12, 9,12,10,12,10,13,11,13,11, + 14,12,14,13,15,14,16,14,17,15,18,16,20,20,20,20, + 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +}; + +static const static_codebook _huff_book_line_128x17_0sub0 = { + 1, 128, + (long *)_huff_lengthlist_line_128x17_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_1sub0[] = { + 2, 5, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, + 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 9, 7, 9, 7, +}; + +static const static_codebook _huff_book_line_128x17_1sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_128x17_1sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 3, 5, 3, 5, 3, 6, 3, 6, 4, 6, 4, 7, 4, 7, 5, + 8, 5, 8, 6, 9, 7, 9, 7, 9, 8,10, 9,10, 9,11,10, + 11,11,11,11,11,11,12,12,12,13,12,13,12,14,12,15, + 12,14,12,16,13,17,13,17,14,17,14,16,13,17,14,17, + 14,17,15,17,15,15,16,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16, +}; + +static const static_codebook _huff_book_line_128x17_1sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_128x17_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_2sub1[] = { + 0, 4, 5, 4, 6, 4, 8, 3, 9, 3, 9, 2, 9, 3, 8, 4, + 9, 4, +}; + +static const static_codebook _huff_book_line_128x17_2sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_128x17_2sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_2sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 1, 5, 3, 5, 3, 5, 4, 7, 5,10, 7,10, 7, + 12,10,14,10,14, 9,14,11,14,14,14,13,13,13,13,13, + 13,13, +}; + +static const static_codebook _huff_book_line_128x17_2sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_128x17_2sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_2sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +}; + +static const static_codebook _huff_book_line_128x17_2sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_128x17_2sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_3sub1[] = { + 0, 4, 4, 4, 4, 4, 4, 4, 5, 3, 5, 3, 5, 4, 6, 4, + 6, 4, +}; + +static const static_codebook _huff_book_line_128x17_3sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_128x17_3sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 3, 6, 3, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, + 8, 4, 8, 4, 8, 4, 9, 4, 9, 5,10, 5,10, 7,10, 8, + 10, 8, +}; + +static const static_codebook _huff_book_line_128x17_3sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_128x17_3sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_128x17_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 2, 4, 3, 4, 4, 4, 5, 4, 7, 5, 8, 5,11, + 6,10, 6,12, 7,12, 7,12, 8,12, 8,12,10,12,12,12, + 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, +}; + +static const static_codebook _huff_book_line_128x17_3sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_128x17_3sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_class1[] = { + 2,10, 8,14, 7,12,11,14, 1, 5, 3, 7, 4, 9, 7,13, +}; + +static const static_codebook _huff_book_line_1024x27_class1 = { + 1, 16, + (long *)_huff_lengthlist_line_1024x27_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_class2[] = { + 1, 4, 2, 6, 3, 7, 5, 7, +}; + +static const static_codebook _huff_book_line_1024x27_class2 = { + 1, 8, + (long *)_huff_lengthlist_line_1024x27_class2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_class3[] = { + 1, 5, 7,21, 5, 8, 9,21,10, 9,12,20,20,16,20,20, + 4, 8, 9,20, 6, 8, 9,20,11,11,13,20,20,15,17,20, + 9,11,14,20, 8,10,15,20,11,13,15,20,20,20,20,20, + 20,20,20,20,13,20,20,20,18,18,20,20,20,20,20,20, + 3, 6, 8,20, 6, 7, 9,20,10, 9,12,20,20,20,20,20, + 5, 7, 9,20, 6, 6, 9,20,10, 9,12,20,20,20,20,20, + 8,10,13,20, 8, 9,12,20,11,10,12,20,20,20,20,20, + 18,20,20,20,15,17,18,20,18,17,18,20,20,20,20,20, + 7,10,12,20, 8, 9,11,20,14,13,14,20,20,20,20,20, + 6, 9,12,20, 7, 8,11,20,12,11,13,20,20,20,20,20, + 9,11,15,20, 8,10,14,20,12,11,14,20,20,20,20,20, + 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, + 11,16,18,20,15,15,17,20,20,17,20,20,20,20,20,20, + 9,14,16,20,12,12,15,20,17,15,18,20,20,20,20,20, + 16,19,18,20,15,16,20,20,17,17,20,20,20,20,20,20, + 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +}; + +static const static_codebook _huff_book_line_1024x27_class3 = { + 1, 256, + (long *)_huff_lengthlist_line_1024x27_class3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_class4[] = { + 2, 3, 7,13, 4, 4, 7,15, 8, 6, 9,17,21,16,15,21, + 2, 5, 7,11, 5, 5, 7,14, 9, 7,10,16,17,15,16,21, + 4, 7,10,17, 7, 7, 9,15,11, 9,11,16,21,18,15,21, + 18,21,21,21,15,17,17,19,21,19,18,20,21,21,21,20, +}; + +static const static_codebook _huff_book_line_1024x27_class4 = { + 1, 64, + (long *)_huff_lengthlist_line_1024x27_class4, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_0sub0[] = { + 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 6, 5, 7, 5, 7, 5, 7, 5, 7, 5, + 8, 6, 8, 6, 8, 6, 9, 6, 9, 6,10, 6,10, 6,11, 6, + 11, 7,11, 7,12, 7,12, 7,12, 7,12, 7,12, 7,12, 7, + 12, 7,12, 8,13, 8,12, 8,12, 8,13, 8,13, 9,13, 9, + 13, 9,13, 9,12,10,12,10,13,10,14,11,14,12,14,13, + 14,13,14,14,15,16,15,15,15,14,15,17,21,22,22,21, + 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21, +}; + +static const static_codebook _huff_book_line_1024x27_0sub0 = { + 1, 128, + (long *)_huff_lengthlist_line_1024x27_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_1sub0[] = { + 2, 5, 5, 4, 5, 4, 5, 4, 5, 4, 6, 5, 6, 5, 6, 5, + 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, +}; + +static const static_codebook _huff_book_line_1024x27_1sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_1024x27_1sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 5, 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, + 9, 4, 9, 4, 9, 4, 8, 4, 8, 4, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 6,10, 6,10, 7,10, 8,11, 9,11,11,12,13, + 12,14,13,15,13,15,14,16,14,17,15,17,15,15,16,16, + 15,16,16,16,15,18,16,15,17,17,19,19,19,19,19,19, + 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, +}; + +static const static_codebook _huff_book_line_1024x27_1sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_1024x27_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_2sub0[] = { + 1, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 9, 8,10, 9,10, 9, +}; + +static const static_codebook _huff_book_line_1024x27_2sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_1024x27_2sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_2sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 5, 5, 6, 5, 6, 5, + 7, 5, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 9, 8, 9, 9, + 9, 9,10,10,10,11, 9,12, 9,12, 9,15,10,14, 9,13, + 10,13,10,12,10,12,10,13,10,12,11,13,11,14,12,13, + 13,14,14,13,14,15,14,16,13,13,14,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,15, +}; + +static const static_codebook _huff_book_line_1024x27_2sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_1024x27_2sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_3sub1[] = { + 0, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, 4, 5, + 5, 5, +}; + +static const static_codebook _huff_book_line_1024x27_3sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_1024x27_3sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 4, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, + 5, 7, 5, 8, 6, 8, 6, 9, 7,10, 7,10, 8,10, 8,11, + 9,11, +}; + +static const static_codebook _huff_book_line_1024x27_3sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_1024x27_3sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 7, 3, 8, 3,10, 3, 8, 3, 9, 3, 8, 4, 9, + 4, 9, 5, 9, 6,10, 6, 9, 7,11, 7,12, 9,13,10,13, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, +}; + +static const static_codebook _huff_book_line_1024x27_3sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_1024x27_3sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_4sub1[] = { + 0, 4, 5, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, + 5, 4, +}; + +static const static_codebook _huff_book_line_1024x27_4sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_1024x27_4sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_4sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 2, 4, 2, 5, 3, 5, 4, 6, 6, 6, 7, 7, 8, + 7, 8, 7, 8, 7, 9, 8, 9, 8, 9, 8,10, 8,11, 9,12, + 9,12, +}; + +static const static_codebook _huff_book_line_1024x27_4sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_1024x27_4sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_1024x27_4sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 5, 2, 6, 3, 6, 4, 7, 4, 7, 5, 9, 5,11, + 6,11, 6,11, 7,11, 6,11, 6,11, 9,11, 8,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10, +}; + +static const static_codebook _huff_book_line_1024x27_4sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_1024x27_4sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_class1[] = { + 2, 6, 8, 9, 7,11,13,13, 1, 3, 5, 5, 6, 6,12,10, +}; + +static const static_codebook _huff_book_line_2048x27_class1 = { + 1, 16, + (long *)_huff_lengthlist_line_2048x27_class1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_class2[] = { + 1, 2, 3, 6, 4, 7, 5, 7, +}; + +static const static_codebook _huff_book_line_2048x27_class2 = { + 1, 8, + (long *)_huff_lengthlist_line_2048x27_class2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_class3[] = { + 3, 3, 6,16, 5, 5, 7,16, 9, 8,11,16,16,16,16,16, + 5, 5, 8,16, 5, 5, 7,16, 8, 7, 9,16,16,16,16,16, + 9, 9,12,16, 6, 8,11,16, 9,10,11,16,16,16,16,16, + 16,16,16,16,13,16,16,16,15,16,16,16,16,16,16,16, + 5, 4, 7,16, 6, 5, 8,16, 9, 8,10,16,16,16,16,16, + 5, 5, 7,15, 5, 4, 6,15, 7, 6, 8,16,16,16,16,16, + 9, 9,11,15, 7, 7, 9,16, 8, 8, 9,16,16,16,16,16, + 16,16,16,16,15,15,15,16,15,15,14,16,16,16,16,16, + 8, 8,11,16, 8, 9,10,16,11,10,14,16,16,16,16,16, + 6, 8,10,16, 6, 7,10,16, 8, 8,11,16,14,16,16,16, + 10,11,14,16, 9, 9,11,16,10,10,11,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16, + 12,16,15,16,12,14,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +}; + +static const static_codebook _huff_book_line_2048x27_class3 = { + 1, 256, + (long *)_huff_lengthlist_line_2048x27_class3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_class4[] = { + 2, 4, 7,13, 4, 5, 7,15, 8, 7,10,16,16,14,16,16, + 2, 4, 7,16, 3, 4, 7,14, 8, 8,10,16,16,16,15,16, + 6, 8,11,16, 7, 7, 9,16,11, 9,13,16,16,16,15,16, + 16,16,16,16,14,16,16,16,16,16,16,16,16,16,16,16, +}; + +static const static_codebook _huff_book_line_2048x27_class4 = { + 1, 64, + (long *)_huff_lengthlist_line_2048x27_class4, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_0sub0[] = { + 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 5, 8, 5, 9, 5, + 9, 6,10, 6,10, 6,11, 6,11, 6,11, 6,11, 6,11, 6, + 11, 6,11, 6,12, 7,11, 7,11, 7,11, 7,11, 7,10, 7, + 11, 7,11, 7,12, 7,11, 8,11, 8,11, 8,11, 8,13, 8, + 12, 9,11, 9,11, 9,11,10,12,10,12, 9,12,10,12,11, + 14,12,16,12,12,11,14,16,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,16,16,16,16, +}; + +static const static_codebook _huff_book_line_2048x27_0sub0 = { + 1, 128, + (long *)_huff_lengthlist_line_2048x27_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_1sub0[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 7, 6, 7, 6, 7, 6, 7, 6, +}; + +static const static_codebook _huff_book_line_2048x27_1sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_2048x27_1sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 5, 7, 5, 7, 4, 7, 4, 8, 4, 8, 4, 8, 4, 8, 3, + 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 5, 9, 5, 9, 6, + 9, 7, 9, 8, 9, 9, 9,10, 9,11, 9,14, 9,15,10,15, + 10,15,10,15,10,15,11,15,10,14,12,14,11,14,13,14, + 13,15,15,15,12,15,15,15,13,15,13,15,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +}; + +static const static_codebook _huff_book_line_2048x27_1sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_2048x27_1sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_2sub0[] = { + 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, +}; + +static const static_codebook _huff_book_line_2048x27_2sub0 = { + 1, 32, + (long *)_huff_lengthlist_line_2048x27_2sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_2sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 4, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 6, 6, 6, 7, + 6, 8, 6, 8, 6, 9, 7,10, 7,10, 7,10, 7,12, 7,12, + 7,12, 9,12,11,12,10,12,10,12,11,12,12,12,10,12, + 10,12,10,12, 9,12,11,12,12,12,12,12,11,12,11,12, + 12,12,12,12,12,12,12,12,10,10,12,12,12,12,12,10, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, +}; + +static const static_codebook _huff_book_line_2048x27_2sub1 = { + 1, 128, + (long *)_huff_lengthlist_line_2048x27_2sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_3sub1[] = { + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, +}; + +static const static_codebook _huff_book_line_2048x27_3sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_2048x27_3sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, + 6, 7, 6, 7, 6, 8, 6, 9, 7, 9, 7, 9, 9,11, 9,12, + 10,12, +}; + +static const static_codebook _huff_book_line_2048x27_3sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_2048x27_3sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 6, 3, 7, 3, 7, 5, 7, 7, 7, 7, 7, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +}; + +static const static_codebook _huff_book_line_2048x27_3sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_2048x27_3sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_4sub1[] = { + 0, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, + 4, 5, +}; + +static const static_codebook _huff_book_line_2048x27_4sub1 = { + 1, 18, + (long *)_huff_lengthlist_line_2048x27_4sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_4sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 2, 4, 3, 4, 4, 4, 5, 5, 6, 5, 6, 5, 7, + 6, 6, 6, 7, 7, 7, 8, 9, 9, 9,12,10,11,10,10,12, + 10,10, +}; + +static const static_codebook _huff_book_line_2048x27_4sub2 = { + 1, 50, + (long *)_huff_lengthlist_line_2048x27_4sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_2048x27_4sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 6, 5, 7, 5, 7, 7, 7, 7, 7, 5, 7, 5, 7, + 5, 7, 5, 7, 7, 7, 7, 7, 4, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, +}; + +static const static_codebook _huff_book_line_2048x27_4sub3 = { + 1, 128, + (long *)_huff_lengthlist_line_2048x27_4sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4low_class0[] = { + 4, 5, 6,11, 5, 5, 6,10, 7, 7, 6, 6,14,13, 9, 9, + 6, 6, 6,10, 6, 6, 6, 9, 8, 7, 7, 9,14,12, 8,11, + 8, 7, 7,11, 8, 8, 7,11, 9, 9, 7, 9,13,11, 9,13, + 19,19,18,19,15,16,16,19,11,11,10,13,10,10, 9,15, + 5, 5, 6,13, 6, 6, 6,11, 8, 7, 6, 7,14,11,10,11, + 6, 6, 6,12, 7, 6, 6,11, 8, 7, 7,11,13,11, 9,11, + 9, 7, 6,12, 8, 7, 6,12, 9, 8, 8,11,13,10, 7,13, + 19,19,17,19,17,14,14,19,12,10, 8,12,13,10, 9,16, + 7, 8, 7,12, 7, 7, 7,11, 8, 7, 7, 8,12,12,11,11, + 8, 8, 7,12, 8, 7, 6,11, 8, 7, 7,10,10,11,10,11, + 9, 8, 8,13, 9, 8, 7,12,10, 9, 7,11, 9, 8, 7,11, + 18,18,15,18,18,16,17,18,15,11,10,18,11, 9, 9,18, + 16,16,13,16,12,11,10,16,12,11, 9, 6,15,12,11,13, + 16,16,14,14,13,11,12,16,12, 9, 9,13,13,10,10,12, + 17,18,17,17,14,15,14,16,14,12,14,15,12,10,11,12, + 18,18,18,18,18,18,18,18,18,12,13,18,16,11, 9,18, +}; + +static const static_codebook _huff_book_line_256x4low_class0 = { + 1, 256, + (long *)_huff_lengthlist_line_256x4low_class0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4low_0sub0[] = { + 1, 3, 2, 3, +}; + +static const static_codebook _huff_book_line_256x4low_0sub0 = { + 1, 4, + (long *)_huff_lengthlist_line_256x4low_0sub0, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4low_0sub1[] = { + 0, 0, 0, 0, 2, 3, 2, 3, 3, 3, +}; + +static const static_codebook _huff_book_line_256x4low_0sub1 = { + 1, 10, + (long *)_huff_lengthlist_line_256x4low_0sub1, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4low_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 3, 4, + 4, 4, 4, 4, 5, 5, 5, 6, 6, +}; + +static const static_codebook _huff_book_line_256x4low_0sub2 = { + 1, 25, + (long *)_huff_lengthlist_line_256x4low_0sub2, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist_line_256x4low_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 2, 4, 3, 5, 4, + 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 6, 9, + 7,12,11,16,13,16,12,15,13,15,12,14,12,15,15,15, +}; + +static const static_codebook _huff_book_line_256x4low_0sub3 = { + 1, 64, + (long *)_huff_lengthlist_line_256x4low_0sub3, + 0, 0, 0, 0, 0, + NULL, + 0 +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h new file mode 100644 index 0000000000..7d7d7bb802 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h @@ -0,0 +1,7757 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: static codebooks autogenerated by huff/huffbuld + last modified: $Id: res_books_uncoupled.h 17022 2010-03-25 03:45:42Z xiphmont $ + + ********************************************************************/ + +#include "../../codebook.h" + +static const long _vq_quantlist__16u0__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u0__p1_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 8, 5, 8, 8, 8,10,10, 8, + 10,11, 5, 8, 8, 8,10,10, 8,10,10, 4, 9, 9, 9,12, + 11, 8,11,11, 8,12,11,10,12,14,10,13,13, 7,11,11, + 10,14,12,11,14,14, 4, 9, 9, 8,11,11, 9,11,12, 7, + 11,11,10,13,14,10,12,14, 8,11,12,10,14,14,10,13, + 12, +}; + +static const static_codebook _16u0__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__16u0__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16u0__p1_0, + 0 +}; + +static const long _vq_quantlist__16u0__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u0__p2_0[] = { + 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 9, 7, + 8, 9, 5, 7, 7, 7, 9, 8, 7, 9, 7, 4, 7, 7, 7, 9, + 9, 7, 8, 8, 6, 9, 8, 7, 8,11, 9,11,10, 6, 8, 9, + 8,11, 8, 9,10,11, 4, 7, 7, 7, 8, 8, 7, 9, 9, 6, + 9, 8, 9,11,10, 8, 8,11, 6, 8, 9, 9,10,11, 8,11, + 8, +}; + +static const static_codebook _16u0__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__16u0__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16u0__p2_0, + 0 +}; + +static const long _vq_quantlist__16u0__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u0__p3_0[] = { + 1, 5, 5, 7, 7, 6, 7, 7, 8, 8, 6, 7, 8, 8, 8, 8, + 9, 9,11,11, 8, 9, 9,11,11, 6, 9, 8,10,10, 8,10, + 10,11,11, 8,10,10,11,11,10,11,10,13,12, 9,11,10, + 13,13, 6, 8, 9,10,10, 8,10,10,11,11, 8,10,10,11, + 11, 9,10,11,13,12,10,10,11,12,12, 8,11,11,14,13, + 10,12,11,15,13, 9,12,11,15,14,12,14,13,16,14,12, + 13,13,17,14, 8,11,11,13,14, 9,11,12,14,15,10,11, + 12,13,15,11,13,13,14,16,12,13,14,14,16, 5, 9, 9, + 11,11, 9,11,11,12,12, 8,11,11,12,12,11,12,12,15, + 14,10,12,12,15,15, 8,11,11,13,12,10,12,12,13,13, + 10,12,12,14,13,12,12,13,14,15,11,13,13,17,16, 7, + 11,11,13,13,10,12,12,14,13,10,12,12,13,14,12,13, + 12,15,14,11,13,13,15,14, 9,12,12,16,15,11,13,13, + 17,16,10,13,13,16,16,13,14,15,15,16,13,15,14,19, + 17, 9,12,12,14,16,11,13,13,15,16,10,13,13,17,16, + 13,14,13,17,15,12,15,15,16,17, 5, 9, 9,11,11, 8, + 11,11,13,12, 9,11,11,12,12,10,12,12,14,15,11,12, + 12,14,14, 7,11,10,13,12,10,12,12,14,13,10,11,12, + 13,13,11,13,13,15,16,12,12,13,15,15, 7,11,11,13, + 13,10,13,13,14,14,10,12,12,13,13,11,13,13,16,15, + 12,13,13,15,14, 9,12,12,15,15,10,13,13,17,16,11, + 12,13,15,15,12,15,14,18,18,13,14,14,16,17, 9,12, + 12,15,16,10,13,13,15,16,11,13,13,15,16,13,15,15, + 17,17,13,15,14,16,15, 7,11,11,15,16,10,13,12,16, + 17,10,12,13,15,17,15,16,16,18,17,13,15,15,17,18, + 8,12,12,16,16,11,13,14,17,18,11,13,13,18,16,15, + 17,16,17,19,14,15,15,17,16, 8,12,12,16,15,11,14, + 13,18,17,11,13,14,18,17,15,16,16,18,17,13,16,16, + 18,18,11,15,14,18,17,13,14,15,18, 0,12,15,15, 0, + 17,17,16,17,17,18,14,16,18,18, 0,11,14,14,17, 0, + 12,15,14,17,19,12,15,14,18, 0,15,18,16, 0,17,14, + 18,16,18, 0, 7,11,11,16,15,10,12,12,18,16,10,13, + 13,16,15,13,15,14,17,17,14,16,16,19,18, 8,12,12, + 16,16,11,13,13,18,16,11,13,14,17,16,14,15,15,19, + 18,15,16,16, 0,19, 8,12,12,16,17,11,13,13,17,17, + 11,14,13,17,17,13,15,15,17,19,15,17,17,19, 0,11, + 14,15,19,17,12,15,16,18,18,12,14,15,19,17,14,16, + 17, 0,18,16,16,19,17, 0,11,14,14,18,19,12,15,14, + 17,17,13,16,14,17,16,14,17,16,18,18,15,18,15, 0, + 18, +}; + +static const static_codebook _16u0__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__16u0__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u0__p3_0, + 0 +}; + +static const long _vq_quantlist__16u0__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u0__p4_0[] = { + 3, 5, 5, 8, 8, 6, 6, 6, 9, 9, 6, 6, 6, 9, 9, 9, + 10, 9,11,11, 9, 9, 9,11,11, 6, 7, 7,10,10, 7, 7, + 8,10,10, 7, 7, 8,10,10,10,10,10,11,12, 9,10,10, + 11,12, 6, 7, 7,10,10, 7, 8, 7,10,10, 7, 8, 7,10, + 10,10,11,10,12,11,10,10,10,13,10, 9,10,10,12,12, + 10,11,10,14,12, 9,11,11,13,13,11,12,13,13,13,11, + 12,12,15,13, 9,10,10,12,13, 9,11,10,12,13,10,10, + 11,12,13,11,12,12,12,13,11,12,12,13,13, 5, 7, 7, + 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,12, + 13,10,10,11,12,12, 6, 8, 8,11,10, 7, 8, 9,10,12, + 8, 9, 9,11,11,11,10,11,11,12,10,11,11,13,12, 7, + 8, 8,10,11, 8, 9, 8,11,10, 8, 9, 9,11,11,10,12, + 10,13,11,10,11,11,13,13,10,11,10,14,13,10,10,11, + 13,13,10,12,11,14,13,12,11,13,12,13,13,12,13,14, + 14,10,11,11,13,13,10,11,10,12,13,10,12,12,12,14, + 12,12,12,14,12,12,13,12,17,15, 5, 7, 7,10,10, 7, + 8, 8,10,10, 7, 8, 8,11,10,10,10,11,12,12,10,11, + 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,11,11,11,12,12,10,10,11,12,13, 6, 8, 8,10, + 11, 8, 9, 9,11,11, 7, 9, 7,11,10,10,12,12,13,13, + 11,11,10,13,11, 9,11,10,14,13,11,11,11,15,13,10, + 10,11,13,13,12,13,13,14,14,12,11,12,12,13,10,11, + 11,12,13,10,11,12,13,13,10,11,10,13,12,12,12,13, + 14, 0,12,13,11,13,11, 8,10,10,13,13,10,11,11,14, + 13,10,11,11,13,12,13,14,14,14,15,12,12,12,15,14, + 9,11,10,13,12,10,10,11,13,14,11,11,11,15,12,13, + 12,14,15,16,13,13,13,14,13, 9,11,11,12,12,10,12, + 11,13,13,10,11,11,13,14,13,13,13,15,15,13,13,14, + 17,15,11,12,12,14,14,10,11,12,13,15,12,13,13, 0, + 15,13,11,14,12,16,14,16,14, 0,15,11,12,12,14,16, + 11,13,12,16,15,12,13,13,14,15,12,14,12,15,13,15, + 14,14,16,16, 8,10,10,13,13,10,11,10,13,14,10,11, + 11,13,13,13,13,12,14,14,14,13,13,16,17, 9,10,10, + 12,14,10,12,11,14,13,10,11,12,13,14,12,12,12,15, + 15,13,13,13,14,14, 9,10,10,13,13,10,11,12,12,14, + 10,11,10,13,13,13,13,13,14,16,13,13,13,14,14,11, + 12,13,15,13,12,14,13,14,16,12,12,13,13,14,13,14, + 14,17,15,13,12,17,13,16,11,12,13,14,15,12,13,14, + 14,17,11,12,11,14,14,13,16,14,16, 0,14,15,11,15, + 11, +}; + +static const static_codebook _16u0__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__16u0__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u0__p4_0, + 0 +}; + +static const long _vq_quantlist__16u0__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16u0__p5_0[] = { + 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, + 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, + 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,11, 7, 8, 8, + 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, + 9, 9,10,10,11,11,12,12, 9, 9, 9,10,10,11,11,12, + 12, +}; + +static const static_codebook _16u0__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__16u0__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16u0__p5_0, + 0 +}; + +static const long _vq_quantlist__16u0__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16u0__p6_0[] = { + 1, 4, 4, 7, 7,10,10,12,12,13,13,18,17, 3, 6, 6, + 9, 9,11,11,13,13,14,14,18,17, 3, 6, 6, 9, 9,11, + 11,13,13,14,14,17,18, 7, 9, 9,11,11,13,13,14,14, + 15,15, 0, 0, 7, 9, 9,11,11,13,13,14,14,15,16,19, + 18,10,11,11,13,13,14,14,16,15,17,18, 0, 0,10,11, + 11,13,13,14,14,15,15,16,18, 0, 0,11,13,13,14,14, + 15,15,17,17, 0,19, 0, 0,11,13,13,14,14,14,15,16, + 18, 0,19, 0, 0,13,14,14,15,15,18,17,18,18, 0,19, + 0, 0,13,14,14,15,16,16,16,18,18,19, 0, 0, 0,16, + 17,17, 0,17,19,19, 0,19, 0, 0, 0, 0,16,19,16,17, + 18, 0,19, 0, 0, 0, 0, 0, 0, +}; + +static const static_codebook _16u0__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__16u0__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__16u0__p6_0, + 0 +}; + +static const long _vq_quantlist__16u0__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u0__p6_1[] = { + 1, 4, 5, 6, 6, 4, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, + 6, 6, 7, 7, 6, 6, 6, 7, 7, +}; + +static const static_codebook _16u0__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__16u0__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u0__p6_1, + 0 +}; + +static const long _vq_quantlist__16u0__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u0__p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _16u0__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__16u0__p7_0, + 1, -518803456, 1628680192, 2, 0, + (long *)_vq_quantlist__16u0__p7_0, + 0 +}; + +static const long _vq_quantlist__16u0__p7_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16u0__p7_1[] = { + 1, 5, 5, 6, 5, 9,10,11,11,10,10,10,10,10,10, 5, + 8, 8, 8,10,10,10,10,10,10,10,10,10,10,10, 5, 8, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10, 5,10, 8, + 10,10,10,10,10,10,10,10,10,10,10,10, 4, 8, 9,10, + 10,10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _16u0__p7_1 = { + 2, 225, + (long *)_vq_lengthlist__16u0__p7_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__16u0__p7_1, + 0 +}; + +static const long _vq_quantlist__16u0__p7_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__16u0__p7_2[] = { + 1, 6, 6, 7, 8, 7, 7,10, 9,10, 9,11,10, 9,11,10, + 9, 9, 9, 9,10, 6, 8, 7, 9, 9, 8, 8,10,10, 9,11, + 11,12,12,10, 9,11, 9,12,10, 9, 6, 9, 8, 9,12, 8, + 8,11, 9,11,11,12,11,12,12,10,11,11,10,10,11, 7, + 10, 9, 9, 9, 9, 9,10, 9,10, 9,10,10,12,10,10,10, + 11,12,10,10, 7, 9, 9, 9,10, 9, 9,10,10, 9, 9, 9, + 11,11,10,10,10,10, 9, 9,12, 7, 9,10, 9,11, 9,10, + 9,10,11,11,11,10,11,12, 9,12,11,10,10,10, 7, 9, + 9, 9, 9,10,12,10, 9,11,12,10,11,12,12,11, 9,10, + 11,10,11, 7, 9,10,10,11,10, 9,10,11,11,11,10,12, + 12,12,11,11,10,11,11,12, 8, 9,10,12,11,10,10,12, + 12,12,12,12,10,11,11, 9,11,10,12,11,11, 8, 9,10, + 10,11,12,11,11,10,10,10,12,12,12, 9,10,12,12,12, + 12,12, 8,10,11,10,10,12, 9,11,12,12,11,12,12,12, + 12,10,12,10,10,10,10, 8,12,11,11,11,10,10,11,12, + 12,12,12,11,12,12,12,11,11,11,12,10, 9,10,10,12, + 10,12,10,12,12,10,10,10,11,12,12,12,11,12,12,12, + 11,10,11,12,12,12,11,12,12,11,12,12,11,12,12,12, + 12,11,12,12,10,10,10,10,11,11,12,11,12,12,12,12, + 12,12,12,11,12,11,10,11,11,12,11,11, 9,10,10,10, + 12,10,10,11, 9,11,12,11,12,11,12,12,10,11,10,12, + 9, 9, 9,12,11,10,11,10,12,10,12,10,12,12,12,11, + 11,11,11,11,10, 9,10,10,11,10,11,11,12,11,10,11, + 12,12,12,11,11, 9,12,10,12, 9,10,12,10,10,11,10, + 11,11,12,11,10,11,10,11,11,11,11,12,11,11,10, 9, + 10,10,10, 9,11,11,10, 9,12,10,11,12,11,12,12,11, + 12,11,12,11,10,11,10,12,11,12,11,12,11,12,10,11, + 10,10,12,11,10,11,11,11,10, +}; + +static const static_codebook _16u0__p7_2 = { + 2, 441, + (long *)_vq_lengthlist__16u0__p7_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__16u0__p7_2, + 0 +}; + +static const long _huff_lengthlist__16u0__single[] = { + 3, 5, 8, 7,14, 8, 9,19, 5, 2, 5, 5, 9, 6, 9,19, + 8, 4, 5, 7, 8, 9,13,19, 7, 4, 6, 5, 9, 6, 9,19, + 12, 8, 7, 9,10,11,13,19, 8, 5, 8, 6, 9, 6, 7,19, + 8, 8,10, 7, 7, 4, 5,19,12,17,19,15,18,13,11,18, +}; + +static const static_codebook _huff_book__16u0__single = { + 2, 64, + (long *)_huff_lengthlist__16u0__single, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__16u1__long[] = { + 3, 6,10, 8,12, 8,14, 8,14,19, 5, 3, 5, 5, 7, 6, + 11, 7,16,19, 7, 5, 6, 7, 7, 9,11,12,19,19, 6, 4, + 7, 5, 7, 6,10, 7,18,18, 8, 6, 7, 7, 7, 7, 8, 9, + 18,18, 7, 5, 8, 5, 7, 5, 8, 6,18,18,12, 9,10, 9, + 9, 9, 8, 9,18,18, 8, 7,10, 6, 8, 5, 6, 4,11,18, + 11,15,16,12,11, 8, 8, 6, 9,18,14,18,18,18,16,16, + 16,13,16,18, +}; + +static const static_codebook _huff_book__16u1__long = { + 2, 100, + (long *)_huff_lengthlist__16u1__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__16u1__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u1__p1_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 7, 7,10,10, 7, + 9,10, 5, 7, 8, 7,10, 9, 7,10,10, 5, 8, 8, 8,10, + 10, 8,10,10, 7,10,10,10,11,12,10,12,13, 7,10,10, + 9,13,11,10,12,13, 5, 8, 8, 8,10,10, 8,10,10, 7, + 10,10,10,12,12, 9,11,12, 7,10,11,10,12,12,10,13, + 11, +}; + +static const static_codebook _16u1__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__16u1__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16u1__p1_0, + 0 +}; + +static const long _vq_quantlist__16u1__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u1__p2_0[] = { + 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 7, 8, 6, + 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 7, 5, 6, 6, 6, 8, + 8, 6, 8, 8, 6, 8, 8, 7, 7,10, 8, 9, 9, 6, 8, 8, + 7, 9, 8, 8, 9,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, + 8, 8, 8,10, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 7,10, + 8, +}; + +static const static_codebook _16u1__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__16u1__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16u1__p2_0, + 0 +}; + +static const long _vq_quantlist__16u1__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u1__p3_0[] = { + 1, 5, 5, 8, 8, 6, 7, 7, 9, 9, 5, 7, 7, 9, 9, 9, + 10, 9,11,11, 9, 9,10,11,11, 6, 8, 8,10,10, 8, 9, + 10,11,11, 8, 9,10,11,11,10,11,11,12,13,10,11,11, + 13,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10, 9,11, + 11,10,11,11,13,13,10,11,11,13,12, 9,11,11,14,13, + 10,12,12,15,14,10,12,11,14,13,12,13,13,15,15,12, + 13,13,16,14, 9,11,11,13,14,10,11,12,14,14,10,12, + 12,14,15,12,13,13,14,15,12,13,14,15,16, 5, 8, 8, + 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, + 14,11,12,12,14,14, 8,10,10,12,12, 9,11,12,12,13, + 10,12,12,13,13,12,12,13,14,15,11,13,13,15,15, 7, + 10,10,12,12, 9,12,11,13,12,10,11,12,13,13,12,13, + 12,15,14,11,12,13,15,15,10,12,12,15,14,11,13,13, + 16,15,11,13,13,16,15,14,13,14,15,16,13,15,15,17, + 17,10,12,12,14,15,11,12,12,15,15,11,13,13,15,16, + 13,15,13,16,15,13,15,15,16,17, 5, 8, 8,11,11, 8, + 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, + 12,14,14, 7,10,10,12,12,10,12,12,14,13, 9,11,12, + 12,13,12,13,13,15,15,12,12,13,13,15, 7,10,10,12, + 13,10,11,12,13,13,10,12,11,13,13,11,13,13,15,15, + 12,13,12,15,14, 9,12,12,15,14,11,13,13,15,15,11, + 12,13,15,15,13,14,14,17,19,13,13,14,16,16,10,12, + 12,14,15,11,13,13,15,16,11,13,12,16,15,13,15,15, + 17,18,14,15,13,16,15, 8,11,11,15,14,10,12,12,16, + 15,10,12,12,16,16,14,15,15,18,17,13,14,15,16,18, + 9,12,12,15,15,11,12,14,16,17,11,13,13,16,15,15, + 15,15,17,18,14,15,16,17,17, 9,12,12,15,15,11,14, + 13,16,16,11,13,13,16,16,15,16,15,17,18,14,16,15, + 17,16,12,14,14,17,16,12,14,15,18,17,13,15,15,17, + 17,15,15,18,16,20,15,16,17,18,18,11,14,14,16,17, + 13,15,14,18,17,13,15,15,17,17,15,17,15,18,17,15, + 17,16,19,18, 8,11,11,14,15,10,12,12,15,15,10,12, + 12,16,16,13,14,14,17,16,14,15,15,17,17, 9,12,12, + 15,16,11,13,13,16,16,11,12,13,16,16,14,16,15,20, + 17,14,16,16,17,17, 9,12,12,15,16,11,13,13,16,17, + 11,13,13,17,16,14,15,15,17,18,15,15,15,18,18,11, + 14,14,17,16,13,15,15,17,17,13,14,14,18,17,15,16, + 16,18,19,15,15,17,17,19,11,14,14,16,17,13,15,14, + 17,19,13,15,14,18,17,15,17,16,18,18,15,17,15,18, + 16, +}; + +static const static_codebook _16u1__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__16u1__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u1__p3_0, + 0 +}; + +static const long _vq_quantlist__16u1__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u1__p4_0[] = { + 4, 5, 5, 8, 8, 6, 6, 7, 9, 9, 6, 6, 6, 9, 9, 9, + 10, 9,11,11, 9, 9,10,11,11, 6, 7, 7,10, 9, 7, 7, + 8, 9,10, 7, 7, 8,10,10,10,10,10,10,12, 9, 9,10, + 11,12, 6, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 7,10, + 10, 9,10, 9,12,11,10,10, 9,12,10, 9,10,10,12,11, + 10,10,10,12,12, 9,10,10,12,12,12,11,12,13,13,11, + 11,12,12,13, 9,10,10,11,12, 9,10,10,12,12,10,10, + 10,12,12,11,12,11,14,13,11,12,12,14,13, 5, 7, 7, + 10,10, 7, 8, 8,10,10, 7, 8, 7,10,10,10,10,10,12, + 12,10,10,10,12,12, 6, 8, 7,10,10, 7, 7, 9,10,11, + 8, 9, 9,11,10,10,10,11,11,13,10,10,11,12,13, 6, + 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,10,11,10,11, + 10,13,11,10,11,10,12,12,10,11,10,12,11,10,10,10, + 12,13,10,11,11,13,12,11,11,13,11,14,12,12,13,14, + 14, 9,10,10,12,13,10,11,10,13,12,10,11,11,12,13, + 11,12,11,14,12,12,13,13,15,14, 5, 7, 7,10,10, 7, + 7, 8,10,10, 7, 8, 8,10,10,10,10,10,11,12,10,10, + 10,12,12, 7, 8, 8,10,10, 8, 9, 8,11,10, 7, 8, 9, + 10,11,10,11,11,12,12,10,10,11,11,13, 7, 7, 8,10, + 10, 8, 8, 9,10,11, 7, 9, 7,11,10,10,11,11,13,12, + 11,11,10,13,11, 9,10,10,12,12,10,11,11,13,12,10, + 10,11,12,12,12,13,13,14,14,11,11,12,12,14,10,10, + 11,12,12,10,11,11,12,13,10,10,10,13,12,12,13,13, + 15,14,12,13,10,14,11, 8,10,10,12,12,10,11,10,13, + 13, 9,10,10,12,12,12,13,13,15,14,11,12,12,13,13, + 9,10,10,13,12,10,10,11,13,13,10,11,10,13,12,12, + 12,13,14,15,12,13,12,15,13, 9,10,10,12,13,10,11, + 10,13,12,10,10,11,12,13,12,14,12,15,13,12,12,13, + 14,15,11,12,11,14,13,11,11,12,14,15,12,13,12,15, + 14,13,11,15,11,16,13,14,14,16,15,11,12,12,14,14, + 11,12,11,14,13,12,12,13,14,15,13,14,12,16,12,14, + 14,14,15,15, 8,10,10,12,12, 9,10,10,12,12,10,10, + 11,13,13,11,12,12,13,13,12,13,13,14,15, 9,10,10, + 13,12,10,11,11,13,12,10,10,11,13,13,12,13,12,15, + 14,12,12,13,13,16, 9, 9,10,12,13,10,10,11,12,13, + 10,11,10,13,13,12,12,13,13,15,13,13,12,15,13,11, + 12,12,14,14,12,13,12,15,14,11,11,12,13,14,14,14, + 14,16,15,13,12,15,12,16,11,11,12,13,14,12,13,13, + 14,15,10,12,11,14,13,14,15,14,16,16,13,14,11,15, + 11, +}; + +static const static_codebook _16u1__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__16u1__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u1__p4_0, + 0 +}; + +static const long _vq_quantlist__16u1__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16u1__p5_0[] = { + 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, + 10,10, 4, 5, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, + 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 7, 8, 8, + 10, 9,11,11,12,11, 7, 8, 8, 9, 9,11,11,12,12, 9, + 10,10,11,11,12,12,13,12, 9,10,10,11,11,12,12,12, + 13, +}; + +static const static_codebook _16u1__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__16u1__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16u1__p5_0, + 0 +}; + +static const long _vq_quantlist__16u1__p6_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16u1__p6_0[] = { + 3, 4, 4, 6, 6, 7, 7, 9, 9, 4, 4, 4, 6, 6, 8, 8, + 9, 9, 4, 4, 4, 6, 6, 7, 7, 9, 9, 6, 6, 6, 7, 7, + 8, 8,10, 9, 6, 6, 6, 7, 7, 8, 8, 9,10, 7, 8, 7, + 8, 8, 9, 9,10,10, 7, 8, 8, 8, 8, 9, 9,10,10, 9, + 9, 9,10,10,10,10,11,11, 9, 9, 9,10,10,10,10,11, + 11, +}; + +static const static_codebook _16u1__p6_0 = { + 2, 81, + (long *)_vq_lengthlist__16u1__p6_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16u1__p6_0, + 0 +}; + +static const long _vq_quantlist__16u1__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u1__p7_0[] = { + 1, 4, 4, 4, 8, 8, 4, 8, 8, 5,11, 9, 8,12,11, 8, + 12,11, 5,10,11, 8,11,12, 8,11,12, 4,11,11,11,14, + 13,10,13,13, 8,14,13,12,14,16,12,16,15, 8,14,14, + 13,16,14,12,15,16, 4,11,11,10,14,13,11,14,14, 8, + 15,14,12,15,15,12,14,16, 8,14,14,11,16,15,12,15, + 13, +}; + +static const static_codebook _16u1__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__16u1__p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__16u1__p7_0, + 0 +}; + +static const long _vq_quantlist__16u1__p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16u1__p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 6, 5, 7, 7, + 8, 8, 8, 8, 8, 8, 4, 5, 6, 7, 7, 8, 8, 8, 8, 8, + 8, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 7, 8, 8, 8, 8, 9, 9, 9,10, + 9,10, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, 9, 8, 8, 8, + 9, 9,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9,10, + 10,10,10, 8, 8, 8, 9, 9, 9,10,10,10,10,10, 8, 8, + 8, 9, 9,10,10,10,10,10,10, +}; + +static const static_codebook _16u1__p7_1 = { + 2, 121, + (long *)_vq_lengthlist__16u1__p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16u1__p7_1, + 0 +}; + +static const long _vq_quantlist__16u1__p8_0[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16u1__p8_0[] = { + 1, 4, 4, 5, 5, 8, 8,10,10,12,12, 4, 7, 7, 8, 8, + 9, 9,12,11,14,13, 4, 7, 7, 7, 8, 9,10,11,11,13, + 12, 5, 8, 8, 9, 9,11,11,12,13,15,14, 5, 7, 8, 9, + 9,11,11,13,13,17,15, 8, 9,10,11,11,12,13,17,14, + 17,16, 8,10, 9,11,11,12,12,13,15,15,17,10,11,11, + 12,13,14,15,15,16,16,17, 9,11,11,12,12,14,15,17, + 15,15,16,11,14,12,14,15,16,15,16,16,16,15,11,13, + 13,14,14,15,15,16,16,15,16, +}; + +static const static_codebook _16u1__p8_0 = { + 2, 121, + (long *)_vq_lengthlist__16u1__p8_0, + 1, -524582912, 1618345984, 4, 0, + (long *)_vq_quantlist__16u1__p8_0, + 0 +}; + +static const long _vq_quantlist__16u1__p8_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16u1__p8_1[] = { + 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 4, 6, 6, 7, 7, + 8, 7, 8, 8, 8, 8, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, + 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 6, 7, 7, 7, + 7, 8, 8, 8, 8, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, + 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 8, + 8, 9, 9, 9, 9, 9, 9, 9, 9, +}; + +static const static_codebook _16u1__p8_1 = { + 2, 121, + (long *)_vq_lengthlist__16u1__p8_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16u1__p8_1, + 0 +}; + +static const long _vq_quantlist__16u1__p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16u1__p9_0[] = { + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, +}; + +static const static_codebook _16u1__p9_0 = { + 2, 225, + (long *)_vq_lengthlist__16u1__p9_0, + 1, -514071552, 1627381760, 4, 0, + (long *)_vq_quantlist__16u1__p9_0, + 0 +}; + +static const long _vq_quantlist__16u1__p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16u1__p9_1[] = { + 1, 6, 5, 9, 9,10,10, 6, 7, 9, 9,10,10,10,10, 5, + 10, 8,10, 8,10,10, 8, 8,10, 9,10,10,10,10, 5, 8, + 9,10,10,10,10, 8,10,10,10,10,10,10,10, 9,10,10, + 10,10,10,10, 9, 9,10,10,10,10,10,10, 9, 9, 8, 9, + 10,10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10, 8,10,10,10,10, + 10,10,10,10,10,10,10,10,10, 6, 8, 8,10,10,10, 8, + 10,10,10,10,10,10,10,10, 5, 8, 8,10,10,10, 9, 9, + 10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, +}; + +static const static_codebook _16u1__p9_1 = { + 2, 225, + (long *)_vq_lengthlist__16u1__p9_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__16u1__p9_1, + 0 +}; + +static const long _vq_quantlist__16u1__p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__16u1__p9_2[] = { + 1, 6, 6, 7, 8, 8,11,10, 9, 9,11, 9,10, 9,11,11, + 9, 6, 7, 6,11, 8,11, 9,10,10,11, 9,11,10,10,10, + 11, 9, 5, 7, 7, 8, 8,10,11, 8, 8,11, 9, 9,10,11, + 9,10,11, 8, 9, 6, 8, 8, 9, 9,10,10,11,11,11, 9, + 11,10, 9,11, 8, 8, 8, 9, 8, 9,10,11, 9, 9,11,11, + 10, 9, 9,11,10, 8,11, 8, 9, 8,11, 9,10, 9,10,11, + 11,10,10, 9,10,10, 8, 8, 9,10,10,10, 9,11, 9,10, + 11,11,11,11,10, 9,11, 9, 9,11,11,10, 8,11,11,11, + 9,10,10,11,10,11,11, 9,11,10, 9,11,10,10,10,10, + 9,11,10,11,10, 9, 9,10,11, 9, 8,10,11,11,10,10, + 11, 9,11,10,11,11,10,11, 9, 9, 8,10, 8, 9,11, 9, + 8,10,10, 9,11,10,11,10,11, 9,11, 8,10,11,11,11, + 11,10,10,11,11,11,11,10,11,11,10, 9, 8,10,10, 9, + 11,10,11,11,11, 9, 9, 9,11,11,11,10,10, 9, 9,10, + 9,11,11,11,11, 8,10,11,10,11,11,10,11,11, 9, 9, + 9,10, 9,11, 9,11,11,11,11,11,10,11,11,10,11,10, + 11,11, 9,11,10,11,10, 9,10, 9,10,10,11,11,11,11, + 9,10, 9,10,11,11,10,11,11,11,11,11,11,10,11,11, + 10, +}; + +static const static_codebook _16u1__p9_2 = { + 2, 289, + (long *)_vq_lengthlist__16u1__p9_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__16u1__p9_2, + 0 +}; + +static const long _huff_lengthlist__16u1__short[] = { + 5, 7,10, 9,11,10,15,11,13,16, 6, 4, 6, 6, 7, 7, + 10, 9,12,16,10, 6, 5, 6, 6, 7,10,11,16,16, 9, 6, + 7, 6, 7, 7,10, 8,14,16,11, 6, 5, 4, 5, 6, 8, 9, + 15,16, 9, 6, 6, 5, 6, 6, 9, 8,14,16,12, 7, 6, 6, + 5, 6, 6, 7,13,16, 8, 6, 7, 6, 5, 5, 4, 4,11,16, + 9, 8, 9, 9, 7, 7, 6, 5,13,16,14,14,16,15,16,15, + 16,16,16,16, +}; + +static const static_codebook _huff_book__16u1__short = { + 2, 100, + (long *)_huff_lengthlist__16u1__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__16u2__long[] = { + 5, 8,10,10,10,11,11,12,14,18, 7, 5, 5, 6, 8, 9, + 10,12,14,17, 9, 5, 4, 5, 6, 8,10,11,13,19, 9, 5, + 4, 4, 5, 6, 9,10,12,17, 8, 6, 5, 4, 4, 5, 7,10, + 11,15, 8, 7, 7, 6, 5, 5, 6, 9,11,14, 8, 9, 8, 7, + 6, 5, 6, 7,11,14, 9,11,11, 9, 7, 6, 6, 6, 9,14, + 11,14,15,13, 9, 8, 7, 7, 9,14,13,15,19,17,12,11, + 10, 9,10,14, +}; + +static const static_codebook _huff_book__16u2__long = { + 2, 100, + (long *)_huff_lengthlist__16u2__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__16u2_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u2_p1_0[] = { + 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 9, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 8, 9, 9, 5, 7, 7, 8, 9, + 9, 7, 9, 9, 7, 9, 9, 9,10,11, 9,10,10, 7, 9, 9, + 9,10, 9, 9,10,11, 5, 8, 7, 7, 9, 9, 8, 9, 9, 7, + 9, 9, 9,11,10, 9, 9,10, 7, 9, 9, 9,10,10, 9,11, + 10, +}; + +static const static_codebook _16u2_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__16u2_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__16u2_p1_0, + 0 +}; + +static const long _vq_quantlist__16u2_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u2_p2_0[] = { + 3, 5, 5, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 9, + 10, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 8, 8,10,10,10,10,10,12,12, 9,10,10, + 11,12, 5, 7, 7, 9, 9, 7, 8, 8,10,10, 7, 8, 8,10, + 10, 9,10,10,12,11,10,10,10,12,12, 9,10,10,12,12, + 10,10,10,12,12, 9,10,10,12,12,12,12,12,14,14,11, + 12,12,13,14, 9,10,10,12,12, 9,10,10,12,12,10,10, + 10,12,12,11,12,12,14,13,12,12,12,14,13, 5, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, + 12,10,10,10,12,12, 7, 8, 8,11,10, 8, 9, 9,11,11, + 8, 9, 9,11,11,10,11,11,12,13,10,11,11,12,13, 7, + 8, 8,10,10, 8, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,13,12,10,11,11,13,13,10,11,10,13,12,10,11,11, + 13,13,10,11,11,13,13,12,12,13,13,14,12,13,13,14, + 14, 9,10,10,12,12,10,11,10,13,12,10,11,11,13,13, + 12,13,12,14,13,12,13,13,14,15, 5, 7, 7, 9,10, 7, + 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12,12,10,10, + 11,12,12, 7, 8, 8,10,10, 8, 9, 9,11,11, 8, 8, 9, + 10,11,10,11,11,13,13,10,10,11,12,13, 7, 8, 8,10, + 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,12, + 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,13,10, + 10,11,12,13,12,13,13,15,14,12,12,13,12,14, 9,10, + 11,12,13,10,11,11,13,13,10,11,11,13,13,12,13,13, + 14,14,12,13,12,14,13, 8,10,10,12,12, 9,11,10,13, + 12, 9,10,10,12,13,12,13,13,14,14,12,12,12,14,14, + 9,10,10,13,13,10,11,11,13,13,10,11,11,13,13,13, + 13,13,14,15,12,13,13,14,15, 9,10,10,12,13,10,11, + 10,13,13,10,11,11,12,13,12,13,12,15,14,12,13,13, + 14,15,11,12,12,15,14,12,12,13,14,15,12,13,13,15, + 14,13,13,15,14,16,14,14,14,16,15,11,12,12,14,14, + 11,12,12,14,14,12,13,13,14,15,13,14,13,15,13,14, + 14,14,15,16, 8, 9,10,12,12, 9,10,10,13,12, 9,10, + 11,12,13,12,12,12,14,14,12,13,13,14,14, 9,10,10, + 13,12,10,11,11,13,13,10,10,11,13,13,12,13,13,15, + 14,12,12,13,14,15, 9,10,10,13,13,10,11,11,13,13, + 10,11,11,13,13,12,13,13,14,14,13,13,13,15,15,11, + 12,12,14,13,12,13,13,15,14,11,12,12,14,14,14,14, + 14,16,15,13,13,14,13,16,11,12,12,14,14,12,13,13, + 14,15,12,13,12,14,14,14,14,14,16,16,14,15,13,16, + 14, +}; + +static const static_codebook _16u2_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__16u2_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u2_p2_0, + 0 +}; + +static const long _vq_quantlist__16u2_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__16u2_p3_0[] = { + 2, 4, 4, 6, 6, 7, 7, 9, 9, 4, 5, 5, 6, 6, 8, 7, + 9, 9, 4, 5, 5, 6, 6, 7, 8, 9, 9, 6, 6, 6, 7, 7, + 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, + 8, 8, 9, 9,11,10, 7, 7, 8, 8, 8, 9, 9,10,11, 9, + 9, 9,10,10,11,10,11,11, 9, 9, 9,10,10,10,11,11, + 11, +}; + +static const static_codebook _16u2_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__16u2_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__16u2_p3_0, + 0 +}; + +static const long _vq_quantlist__16u2_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__16u2_p4_0[] = { + 2, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,11, + 11, 5, 5, 5, 7, 6, 8, 7, 9, 9, 9, 9,10,10,11,11, + 12,12, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,11, + 11,12,12, 6, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11,12,12, 7, 7, 8, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11,12,12, 8, 9, 9, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,12,12, 8, 9, 9, 9, 9, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 9, 9, 9, 9, 9,10,10, + 10,10,10,11,11,11,12,12,13,13, 9, 9, 9, 9, 9,10, + 10,10,10,11,10,11,11,12,12,13,13,10,10,10,10,10, + 11,11,11,11,11,11,11,12,12,12,13,13,10,10,10,10, + 10,11,11,11,11,11,11,12,11,12,12,13,13,11,11,11, + 11,11,11,11,12,12,12,12,12,12,13,13,13,13,11,11, + 11,11,11,11,11,12,12,12,12,13,12,13,13,13,13,11, + 12,12,12,12,12,12,12,12,13,13,13,13,13,13,14,14, + 11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14, + 14, +}; + +static const static_codebook _16u2_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__16u2_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__16u2_p4_0, + 0 +}; + +static const long _vq_quantlist__16u2_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__16u2_p5_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 7, 9, 9, 7, + 9,10, 5, 8, 8, 7,10, 9, 7,10, 9, 5, 8, 8, 8,11, + 10, 8,10,10, 7,10,10, 9, 9,12,10,12,12, 7,10,10, + 9,12,10,10,11,12, 5, 8, 8, 8,10,10, 8,11,11, 7, + 11,10,10,12,11, 9,10,12, 7,10,11,10,12,12, 9,12, + 9, +}; + +static const static_codebook _16u2_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__16u2_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__16u2_p5_0, + 0 +}; + +static const long _vq_quantlist__16u2_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16u2_p5_1[] = { + 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, + 7, 7, 8, 8, 8, 8, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, + 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, +}; + +static const static_codebook _16u2_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__16u2_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16u2_p5_1, + 0 +}; + +static const long _vq_quantlist__16u2_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16u2_p6_0[] = { + 1, 5, 4, 7, 7, 8, 8, 8, 8,10,10,11,11, 4, 6, 6, + 7, 7, 9, 9, 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, + 9, 9, 9,10,10,11,11, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 7, 7, 7, 9, 8,10, 9,10,10,11,11,12, + 12, 8, 9, 9, 9,10,10,10,11,11,12,12,13,13, 8, 9, + 9,10, 9,10,10,11,11,12,12,13,13, 8, 9, 9,10,10, + 11,11,11,11,12,12,13,13, 8, 9, 9,10,10,11,11,12, + 11,12,12,13,13,10,10,10,11,11,12,12,12,12,13,13, + 14,14,10,10,10,11,11,12,12,12,12,13,13,14,14,11, + 11,11,12,12,13,13,13,13,14,14,14,14,11,11,11,12, + 12,13,13,13,13,14,14,14,14, +}; + +static const static_codebook _16u2_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__16u2_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__16u2_p6_0, + 0 +}; + +static const long _vq_quantlist__16u2_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__16u2_p6_1[] = { + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _16u2_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__16u2_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__16u2_p6_1, + 0 +}; + +static const long _vq_quantlist__16u2_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__16u2_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 6, 6, + 8, 8, 9, 9, 9, 9,10,10,11,10, 4, 6, 6, 8, 8, 9, + 9, 9, 9,10,10,11,11, 7, 8, 8,10, 9,10,10,10,10, + 11,11,12,12, 7, 8, 8,10,10,10,10,10,10,11,11,12, + 12, 8, 9, 9,10,10,11,11,11,11,12,12,13,13, 8, 9, + 9,10,10,11,11,11,11,12,12,13,13, 8, 9, 9,11,10, + 11,11,12,12,13,13,14,13, 8, 9, 9,10,10,11,11,12, + 12,13,13,13,13, 9,10,10,11,11,12,12,13,13,13,13, + 14,14, 9,10,10,11,11,12,12,13,13,13,13,14,14,10, + 11,11,12,12,13,13,14,13,14,14,15,14,10,11,11,12, + 12,13,13,14,13,14,14,15,14, +}; + +static const static_codebook _16u2_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__16u2_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__16u2_p7_0, + 0 +}; + +static const long _vq_quantlist__16u2_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__16u2_p7_1[] = { + 2, 5, 5, 7, 7, 7, 7, 7, 7, 8, 8, 5, 6, 6, 7, 7, + 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _16u2_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__16u2_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__16u2_p7_1, + 0 +}; + +static const long _vq_quantlist__16u2_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16u2_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 7, 7, 9, 8,10, 9,11,11, 4, + 7, 6, 9, 8, 9, 9, 9, 9,10, 9,11, 9,12, 9, 4, 6, + 7, 8, 8, 9, 9, 9, 9,10,10,10,11,11,12, 7, 9, 8, + 10,10,11,11,10,10,11,11,12,12,13,12, 7, 8, 8,10, + 10,10,11,10,10,11,11,11,12,12,13, 8, 9, 9,11,11, + 11,11,11,11,12,12,13,13,13,13, 8, 9, 9,11,11,11, + 11,11,11,12,12,13,13,13,14, 8, 9, 9,10,10,11,11, + 12,11,13,13,14,13,14,14, 8, 9, 9,10,10,11,11,12, + 12,12,12,13,13,14,14, 9,10,10,11,11,12,12,13,12, + 13,13,14,14,15,15, 9,10,10,11,11,12,12,12,13,13, + 13,14,14,14,15,10,11,11,12,12,13,13,14,13,14,14, + 15,14,15,15,10,11,11,12,12,13,12,13,14,14,14,14, + 14,15,15,11,12,12,13,13,13,13,14,14,15,14,15,15, + 16,16,11,12,12,13,13,13,13,14,14,14,15,15,15,16, + 16, +}; + +static const static_codebook _16u2_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__16u2_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__16u2_p8_0, + 0 +}; + +static const long _vq_quantlist__16u2_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__16u2_p8_1[] = { + 3, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,10,10, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9,10, 9,10,10,10, 9,10, 9, 8, 8, 8, 9, 8, 9, 9, + 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10, 8, 8, + 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, + 10,10,10, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,10,10,10,10,10,10, 8, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10, 9, 9, 9,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10, 9, 9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10, 9,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _16u2_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__16u2_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__16u2_p8_1, + 0 +}; + +static const long _vq_quantlist__16u2_p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__16u2_p9_0[] = { + 1, 5, 3, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, + 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 7, + 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _16u2_p9_0 = { + 2, 225, + (long *)_vq_lengthlist__16u2_p9_0, + 1, -510036736, 1631393792, 4, 0, + (long *)_vq_quantlist__16u2_p9_0, + 0 +}; + +static const long _vq_quantlist__16u2_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__16u2_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 6, 9, 7,10, 8,12,12,13, + 13,14,14, 4, 7, 7, 9, 9, 9, 8, 9, 8,10, 9,11, 9, + 14, 9,14,10,13,11, 4, 7, 7, 9, 9, 9, 9, 8, 9,10, + 10,11,11,12,13,12,13,14,15, 7, 9, 9,10,11,10,10, + 10,10,11,12,13,13,13,14,17,14,15,16, 7, 9, 9,10, + 10,10,10,10,10,11,12,13,13,14,14,15,15,18,18, 8, + 9, 9,11,10,11,11,11,12,13,12,14,14,16,15,15,17, + 18,15, 8, 9, 9,10,10,11,11,11,11,13,13,14,14,15, + 15,15,16,16,18, 7, 9, 8,10,10,11,11,12,12,14,14, + 15,15,16,16,15,17,16,18, 8, 9, 9,10,10,11,12,12, + 12,13,13,16,15,17,16,17,18,17,18, 9,10,10,12,11, + 13,13,14,13,14,14,15,17,16,18,17,18,17,18, 9,10, + 10,12,11,12,13,13,14,15,16,14,15,16,18,18,18,18, + 17,11,11,11,13,13,14,14,16,15,15,15,16,15,15,18, + 18,18,17,16,11,11,12,13,13,15,14,15,16,16,16,17, + 16,15,18,17,18,16,18,12,13,13,15,15,15,16,18,16, + 17,16,17,16,17,17,17,18,18,17,13,13,13,15,13,16, + 15,17,16,16,16,18,18,18,18,16,17,17,18,13,15,14, + 15,15,18,17,18,18,18,16,18,17,18,17,18,16,17,17, + 14,14,14,15,16,17,16,18,18,18,17,18,17,18,18,18, + 16,16,16,14,17,16,17,15,16,18,18,17,18,17,18,17, + 18,18,18,17,18,17,15,16,15,18,15,18,17,16,18,18, + 18,18,18,18,17,18,16,18,17, +}; + +static const static_codebook _16u2_p9_1 = { + 2, 361, + (long *)_vq_lengthlist__16u2_p9_1, + 1, -518287360, 1622704128, 5, 0, + (long *)_vq_quantlist__16u2_p9_1, + 0 +}; + +static const long _vq_quantlist__16u2_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__16u2_p9_2[] = { + 2, 3, 4, 4, 4, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 7, 8, 8, 8, 8, 8, + 8, +}; + +static const static_codebook _16u2_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__16u2_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__16u2_p9_2, + 0 +}; + +static const long _huff_lengthlist__16u2__short[] = { + 8,11,13,13,15,16,19,19,19,19,11, 8, 8, 9, 9,11, + 13,15,19,20,14, 8, 7, 7, 8, 9,12,13,15,20,15, 9, + 6, 5, 5, 7,10,12,14,18,14, 9, 7, 5, 3, 4, 7,10, + 12,16,13,10, 8, 6, 3, 3, 5, 8,11,14,11,10, 9, 7, + 5, 4, 4, 6,11,14,10,10,10, 8, 6, 5, 5, 6,10,14, + 10,10,10, 9, 8, 7, 7, 7,10,14,11,12,12,12,11,10, + 10,10,12,16, +}; + +static const static_codebook _huff_book__16u2__short = { + 2, 100, + (long *)_huff_lengthlist__16u2__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__8u0__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8u0__p1_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, + 10,10, 5, 8, 8, 7,10,10, 8,10,10, 4, 9, 8, 8,11, + 11, 8,11,11, 7,11,11,10,11,13,10,13,13, 7,11,11, + 10,13,12,10,13,13, 5, 9, 8, 8,11,11, 8,11,11, 7, + 11,11, 9,13,13,10,12,13, 7,11,11,10,13,13,10,13, + 11, +}; + +static const static_codebook _8u0__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__8u0__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__8u0__p1_0, + 0 +}; + +static const long _vq_quantlist__8u0__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8u0__p2_0[] = { + 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 6, 7, 8, 6, + 7, 8, 5, 7, 7, 6, 8, 8, 7, 9, 7, 5, 7, 7, 7, 9, + 9, 7, 8, 8, 6, 9, 8, 7, 7,10, 8,10,10, 6, 8, 8, + 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 9, 6, + 8, 8, 8,10,10, 8, 8,10, 6, 8, 9, 8,10,10, 7,10, + 8, +}; + +static const static_codebook _8u0__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__8u0__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__8u0__p2_0, + 0 +}; + +static const long _vq_quantlist__8u0__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8u0__p3_0[] = { + 1, 5, 5, 7, 7, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, + 10, 9,11,11, 8, 9, 9,11,11, 6, 8, 8,10,10, 8,10, + 10,11,11, 8,10,10,11,11,10,11,11,12,12,10,11,11, + 12,13, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, + 11, 9,10,11,12,12,10,11,11,12,12, 8,11,11,14,13, + 10,12,11,15,13,10,12,11,14,14,12,13,12,16,14,12, + 14,12,16,15, 8,11,11,13,14,10,11,12,13,15,10,11, + 12,13,15,11,12,13,14,15,12,12,14,14,16, 5, 8, 8, + 11,11, 9,11,11,12,12, 8,10,11,12,12,11,12,12,15, + 14,11,12,12,14,14, 7,11,10,13,12,10,11,12,13,14, + 10,12,12,14,13,12,13,13,14,15,12,13,13,15,15, 7, + 10,11,12,13,10,12,11,14,13,10,12,13,13,15,12,13, + 12,14,14,11,13,13,15,16, 9,12,12,15,14,11,13,13, + 15,16,11,13,13,16,16,13,14,15,15,15,12,14,15,17, + 16, 9,12,12,14,15,11,13,13,15,16,11,13,13,16,18, + 13,14,14,17,16,13,15,15,17,18, 5, 8, 9,11,11, 8, + 11,11,12,12, 8,10,11,12,12,11,12,12,14,14,11,12, + 12,14,15, 7,11,10,12,13,10,12,12,14,13,10,11,12, + 13,14,11,13,13,15,14,12,13,13,14,15, 7,10,11,13, + 13,10,12,12,13,14,10,12,12,13,13,11,13,13,16,16, + 12,13,13,15,14, 9,12,12,16,15,10,13,13,15,15,11, + 13,13,17,15,12,15,15,18,17,13,14,14,15,16, 9,12, + 12,15,15,11,13,13,15,16,11,13,13,15,15,12,15,15, + 16,16,13,15,14,17,15, 7,11,11,15,15,10,13,13,16, + 15,10,13,13,15,16,14,15,15,17,19,13,15,14,15,18, + 9,12,12,16,16,11,13,14,17,16,11,13,13,17,16,15, + 15,16,17,19,13,15,16, 0,18, 9,12,12,16,15,11,14, + 13,17,17,11,13,14,16,16,15,16,16,19,18,13,15,15, + 17,19,11,14,14,19,16,12,14,15, 0,18,12,16,15,18, + 17,15,15,18,16,19,14,15,17,19,19,11,14,14,18,19, + 13,15,14,19,19,12,16,15,18,17,15,17,15, 0,16,14, + 17,16,19, 0, 7,11,11,14,14,10,12,12,15,15,10,13, + 13,16,15,13,15,15,17, 0,14,15,15,16,19, 9,12,12, + 16,16,11,14,14,16,16,11,13,13,16,16,14,17,16,19, + 0,14,18,17,17,19, 9,12,12,15,16,11,13,13,15,17, + 12,14,13,19,16,13,15,15,17,19,15,17,16,17,19,11, + 14,14,19,16,12,15,15,19,17,13,14,15,17,19,14,16, + 17,19,19,16,15,16,17,19,11,15,14,16,16,12,15,15, + 19, 0,12,14,15,19,19,14,16,16, 0,18,15,19,14,18, + 16, +}; + +static const static_codebook _8u0__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__8u0__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8u0__p3_0, + 0 +}; + +static const long _vq_quantlist__8u0__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8u0__p4_0[] = { + 3, 5, 5, 8, 8, 5, 6, 7, 9, 9, 6, 7, 6, 9, 9, 9, + 9, 9,10,11, 9, 9, 9,11,10, 6, 7, 7,10,10, 7, 7, + 8,10,10, 7, 8, 8,10,10,10,10,10,10,11, 9,10,10, + 11,12, 6, 7, 7,10,10, 7, 8, 8,10,10, 7, 8, 7,10, + 10, 9,10,10,12,11,10,10,10,11,10, 9,10,10,12,11, + 10,10,10,13,11, 9,10,10,12,12,11,11,12,12,13,11, + 11,11,12,13, 9,10,10,12,12,10,10,11,12,12,10,10, + 11,12,12,11,11,11,13,13,11,12,12,13,13, 5, 7, 7, + 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,11,12, + 12,10,11,10,12,12, 7, 8, 8,11,11, 7, 8, 9,10,11, + 8, 9, 9,11,11,11,10,11,10,12,10,11,11,12,13, 7, + 8, 8,10,11, 8, 9, 8,12,10, 8, 9, 9,11,12,10,11, + 10,13,11,10,11,11,13,12, 9,11,10,13,12,10,10,11, + 12,12,10,11,11,13,13,12,10,13,11,14,11,12,12,15, + 13, 9,11,11,13,13,10,11,11,13,12,10,11,11,12,14, + 12,13,11,14,12,12,12,12,14,14, 5, 7, 7,10,10, 7, + 8, 8,10,10, 7, 8, 8,11,10,10,11,11,12,12,10,11, + 10,12,12, 7, 8, 8,10,11, 8, 9, 9,12,11, 8, 8, 9, + 10,11,10,11,11,12,13,11,10,11,11,13, 6, 8, 8,10, + 11, 8, 9, 9,11,11, 7, 9, 7,11,10,10,11,11,12,12, + 10,11,10,13,10, 9,11,10,13,12,10,12,11,13,13,10, + 10,11,12,13,11,12,13,15,14,11,11,13,12,13, 9,10, + 11,12,13,10,11,11,12,13,10,11,10,13,12,12,13,13, + 13,14,12,12,11,14,11, 8,10,10,12,13,10,11,11,13, + 13,10,11,10,13,13,12,13,14,15,14,12,12,12,14,13, + 9,10,10,13,12,10,10,12,13,13,10,11,11,15,12,12, + 12,13,15,14,12,13,13,15,13, 9,10,11,12,13,10,12, + 10,13,12,10,11,11,12,13,12,14,12,15,13,12,12,12, + 15,14,11,12,11,14,13,11,11,12,14,14,12,13,13,14, + 13,13,11,15,11,15,14,14,14,16,15,11,12,12,13,14, + 11,13,11,14,14,12,12,13,14,15,12,14,12,15,12,13, + 15,14,16,15, 8,10,10,12,12,10,10,10,12,13,10,11, + 11,13,13,12,12,12,13,14,13,13,13,15,15, 9,10,10, + 12,12,10,11,11,13,12,10,10,11,13,13,12,12,12,14, + 14,12,12,13,15,14, 9,10,10,13,12,10,10,12,12,13, + 10,11,10,13,13,12,13,13,14,14,12,13,12,14,13,11, + 12,12,14,13,12,13,12,14,14,10,12,12,14,14,14,14, + 14,16,14,13,12,14,12,15,10,12,12,14,15,12,13,13, + 14,16,11,12,11,15,14,13,14,14,14,15,13,14,11,14, + 12, +}; + +static const static_codebook _8u0__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__8u0__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8u0__p4_0, + 0 +}; + +static const long _vq_quantlist__8u0__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8u0__p5_0[] = { + 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 7, 8, 8, + 10,10, 4, 6, 6, 8, 8, 8, 8,10,10, 6, 8, 8, 9, 9, + 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 7, 8, 8, + 9, 9,10,10,12,11, 7, 8, 8, 9, 9,10,10,11,11, 9, + 10,10,11,11,11,12,12,12, 9,10,10,11,11,12,12,12, + 12, +}; + +static const static_codebook _8u0__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__8u0__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8u0__p5_0, + 0 +}; + +static const long _vq_quantlist__8u0__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__8u0__p6_0[] = { + 1, 4, 4, 7, 7, 9, 9,11,11,12,12,16,16, 3, 6, 6, + 9, 9,11,11,12,12,13,14,18,16, 3, 6, 7, 9, 9,11, + 11,13,12,14,14,17,16, 7, 9, 9,11,11,12,12,14,14, + 14,14,17,16, 7, 9, 9,11,11,13,12,13,13,14,14,17, + 0, 9,11,11,12,13,14,14,14,13,15,14,17,17, 9,11, + 11,12,12,14,14,13,14,14,15, 0, 0,11,12,12,15,14, + 15,14,15,14,15,16,17, 0,11,12,13,13,13,14,14,15, + 14,15,15, 0, 0,12,14,14,15,15,14,16,15,15,17,16, + 0,18,13,14,14,15,14,15,14,15,16,17,16, 0, 0,17, + 17,18, 0,16,18,16, 0, 0, 0,17, 0, 0,16, 0, 0,16, + 16, 0,15, 0,17, 0, 0, 0, 0, +}; + +static const static_codebook _8u0__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__8u0__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__8u0__p6_0, + 0 +}; + +static const long _vq_quantlist__8u0__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8u0__p6_1[] = { + 1, 4, 4, 6, 6, 4, 6, 5, 7, 7, 4, 5, 6, 7, 7, 6, + 7, 7, 7, 7, 6, 7, 7, 7, 7, +}; + +static const static_codebook _8u0__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__8u0__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8u0__p6_1, + 0 +}; + +static const long _vq_quantlist__8u0__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8u0__p7_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _8u0__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__8u0__p7_0, + 1, -518803456, 1628680192, 2, 0, + (long *)_vq_quantlist__8u0__p7_0, + 0 +}; + +static const long _vq_quantlist__8u0__p7_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__8u0__p7_1[] = { + 1, 5, 5, 5, 5,10,10,11,11,11,11,11,11,11,11, 5, + 7, 6, 8, 8, 9,10,11,11,11,11,11,11,11,11, 6, 6, + 7, 9, 7,11,10,11,11,11,11,11,11,11,11, 5, 6, 6, + 11, 8,11,11,11,11,11,11,11,11,11,11, 5, 6, 6, 9, + 10,11,10,11,11,11,11,11,11,11,11, 7,10,10,11,11, + 11,11,11,11,11,11,11,11,11,11, 7,11, 8,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _8u0__p7_1 = { + 2, 225, + (long *)_vq_lengthlist__8u0__p7_1, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__8u0__p7_1, + 0 +}; + +static const long _vq_quantlist__8u0__p7_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__8u0__p7_2[] = { + 1, 6, 5, 7, 7, 9, 9, 9, 9,10,12,12,10,11,11,10, + 11,11,11,10,11, 6, 8, 8, 9, 9,10,10, 9,10,11,11, + 10,11,11,11,11,10,11,11,11,11, 6, 7, 8, 9, 9, 9, + 10,11,10,11,12,11,10,11,11,11,11,11,11,12,10, 8, + 9, 9,10, 9,10,10, 9,10,10,10,10,10, 9,10,10,10, + 10, 9,10,10, 9, 9, 9, 9,10,10, 9, 9,10,10,11,10, + 9,12,10,11,10, 9,10,10,10, 8, 9, 9,10, 9,10, 9, + 9,10,10, 9,10, 9,11,10,10,10,10,10, 9,10, 8, 8, + 9, 9,10, 9,11, 9, 8, 9, 9,10,11,10,10,10,11,12, + 9, 9,11, 8, 9, 8,11,10,11,10,10, 9,11,10,10,10, + 10,10,10,10,11,11,11,11, 8, 9, 9, 9,10,10,10,11, + 11,12,11,12,11,10,10,10,12,11,11,11,10, 8,10, 9, + 11,10,10,11,12,10,11,12,11,11,12,11,12,12,10,11, + 11,10, 9, 9,10,11,12,10,10,10,11,10,11,11,10,12, + 12,10,11,10,11,12,10, 9,10,10,11,10,11,11,11,11, + 11,12,11,11,11, 9,11,10,11,10,11,10, 9, 9,10,11, + 11,11,10,10,11,12,12,11,12,11,11,11,12,12,12,12, + 11, 9,11,11,12,10,11,11,11,11,11,11,12,11,11,12, + 11,11,11,10,11,11, 9,11,10,11,11,11,10,10,10,11, + 11,11,12,10,11,10,11,11,11,11,12, 9,11,10,11,11, + 10,10,11,11, 9,11,11,12,10,10,10,10,10,11,11,10, + 9,10,11,11,12,11,10,10,12,11,11,12,11,12,11,11, + 10,10,11,11,10,12,11,10,11,10,11,10,10,10,11,11, + 10,10,11,11,11,11,10,10,10,12,11,11,11,11,10, 9, + 10,11,11,11,12,11,11,11,12,10,11,11,11, 9,10,11, + 11,11,11,11,11,10,10,11,11,12,11,10,11,12,11,10, + 10,11, 9,10,11,11,11,11,11,10,11,11,10,12,11,11, + 11,12,11,11,11,10,10,11,11, +}; + +static const static_codebook _8u0__p7_2 = { + 2, 441, + (long *)_vq_lengthlist__8u0__p7_2, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__8u0__p7_2, + 0 +}; + +static const long _huff_lengthlist__8u0__single[] = { + 4, 7,11, 9,12, 8, 7,10, 6, 4, 5, 5, 7, 5, 6,16, + 9, 5, 5, 6, 7, 7, 9,16, 7, 4, 6, 5, 7, 5, 7,17, + 10, 7, 7, 8, 7, 7, 8,18, 7, 5, 6, 4, 5, 4, 5,15, + 7, 6, 7, 5, 6, 4, 5,15,12,13,18,12,17,11, 9,17, +}; + +static const static_codebook _huff_book__8u0__single = { + 2, 64, + (long *)_huff_lengthlist__8u0__single, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__8u1__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8u1__p1_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 7, 9,10, 7, + 9, 9, 5, 8, 8, 7,10, 9, 7, 9, 9, 5, 8, 8, 8,10, + 10, 8,10,10, 7,10,10, 9,10,12,10,12,12, 7,10,10, + 9,12,11,10,12,12, 5, 8, 8, 8,10,10, 8,10,10, 7, + 10,10,10,12,12, 9,11,12, 7,10,10,10,12,12, 9,12, + 10, +}; + +static const static_codebook _8u1__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__8u1__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__8u1__p1_0, + 0 +}; + +static const long _vq_quantlist__8u1__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8u1__p2_0[] = { + 3, 4, 5, 5, 6, 6, 5, 6, 6, 5, 7, 6, 6, 7, 8, 6, + 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 7, 5, 6, 6, 7, 8, + 8, 6, 7, 7, 6, 8, 7, 7, 7, 9, 8, 9, 9, 6, 7, 8, + 7, 9, 7, 8, 9, 9, 5, 6, 6, 6, 7, 7, 7, 8, 8, 6, + 8, 7, 8, 9, 9, 7, 7, 9, 6, 7, 8, 8, 9, 9, 7, 9, + 7, +}; + +static const static_codebook _8u1__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__8u1__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__8u1__p2_0, + 0 +}; + +static const long _vq_quantlist__8u1__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8u1__p3_0[] = { + 1, 5, 5, 7, 7, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, + 10, 9,11,11, 9, 9, 9,11,11, 6, 8, 8,10,10, 8,10, + 10,11,11, 8, 9,10,11,11,10,11,11,12,12,10,11,11, + 12,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10, 9,11, + 11,10,11,11,12,12,10,11,11,12,12, 9,11,11,14,13, + 10,12,11,14,14,10,12,11,14,13,12,13,13,15,14,12, + 13,13,15,14, 8,11,11,13,14,10,11,12,13,15,10,11, + 12,14,14,12,13,13,14,15,12,13,13,14,15, 5, 8, 8, + 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, + 13,11,12,12,13,14, 8,10,10,12,12, 9,11,12,13,14, + 10,12,12,13,13,12,12,13,14,14,11,13,13,15,15, 7, + 10,10,12,12, 9,12,11,14,12,10,11,12,13,14,12,13, + 12,14,14,12,13,13,15,16,10,12,12,15,14,11,12,13, + 15,15,11,13,13,15,16,14,14,15,15,16,13,14,15,17, + 15, 9,12,12,14,15,11,13,12,15,15,11,13,13,15,15, + 13,14,13,15,14,13,14,14,17, 0, 5, 8, 8,11,11, 8, + 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, + 12,14,14, 7,10,10,12,12,10,12,12,13,13, 9,11,12, + 12,13,11,12,13,15,15,11,12,13,14,15, 8,10,10,12, + 12,10,12,11,13,13,10,12,11,13,13,11,13,13,15,14, + 12,13,12,15,13, 9,12,12,14,14,11,13,13,16,15,11, + 12,13,16,15,13,14,15,16,16,13,13,15,15,16,10,12, + 12,15,14,11,13,13,14,16,11,13,13,15,16,13,15,15, + 16,17,13,15,14,16,15, 8,11,11,14,15,10,12,12,15, + 15,10,12,12,15,16,14,15,15,16,17,13,14,14,16,16, + 9,12,12,15,15,11,13,14,15,17,11,13,13,15,16,14, + 15,16,19,17,13,15,15, 0,17, 9,12,12,15,15,11,14, + 13,16,15,11,13,13,15,16,15,15,15,18,17,13,15,15, + 17,17,11,15,14,18,16,12,14,15,17,17,12,15,15,18, + 18,15,15,16,15,19,14,16,16, 0, 0,11,14,14,16,17, + 12,15,14,18,17,12,15,15,18,18,15,17,15,18,16,14, + 16,16,18,18, 7,11,11,14,14,10,12,12,15,15,10,12, + 13,15,15,13,14,15,16,16,14,15,15,18,18, 9,12,12, + 15,15,11,13,13,16,15,11,12,13,16,16,14,15,15,17, + 16,15,16,16,17,17, 9,12,12,15,15,11,13,13,15,17, + 11,14,13,16,15,13,15,15,17,17,15,15,15,18,17,11, + 14,14,17,15,12,14,15,17,18,13,13,15,17,17,14,16, + 16,19,18,16,15,17,17, 0,11,14,14,17,17,12,15,15, + 18, 0,12,15,14,18,16,14,17,17,19, 0,16,18,15, 0, + 16, +}; + +static const static_codebook _8u1__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__8u1__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8u1__p3_0, + 0 +}; + +static const long _vq_quantlist__8u1__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__8u1__p4_0[] = { + 4, 5, 5, 9, 9, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 9, + 9, 9,11,11, 9, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 7, + 8, 9,10, 7, 7, 8, 9,10, 9, 9,10,10,11, 9, 9,10, + 10,12, 6, 7, 7, 9, 9, 7, 8, 7,10, 9, 7, 8, 7,10, + 9, 9,10, 9,12,11,10,10, 9,12,10, 9,10,10,12,11, + 9,10,10,12,11, 9,10,10,12,12,11,11,12,12,13,11, + 11,12,12,13, 9, 9,10,12,11, 9,10,10,12,12,10,10, + 10,12,12,11,12,11,13,12,11,12,11,13,12, 6, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 7,10, 9,10,10,10,12, + 12,10,10,10,12,11, 7, 8, 7,10,10, 7, 7, 9,10,11, + 8, 9, 9,11,10,10,10,11,10,12,10,10,11,12,12, 7, + 8, 8,10,10, 7, 9, 8,11,10, 8, 8, 9,11,11,10,11, + 10,12,11,10,11,11,12,12, 9,10,10,12,12, 9,10,10, + 12,12,10,11,11,13,12,11,10,12,10,14,12,12,12,13, + 14, 9,10,10,12,12, 9,11,10,12,12,10,11,11,12,12, + 11,12,11,14,12,12,12,12,14,14, 5, 7, 7, 9, 9, 7, + 7, 7, 9,10, 7, 8, 8,10,10,10,10,10,11,11,10,10, + 10,12,12, 7, 8, 8,10,10, 8, 9, 8,11,10, 7, 8, 9, + 10,11,10,10,10,11,12,10,10,11,11,13, 6, 7, 8,10, + 10, 8, 9, 9,10,10, 7, 9, 7,11,10,10,11,10,12,12, + 10,11,10,12,10, 9,10,10,12,12,10,11,11,13,12, 9, + 10,10,12,12,12,12,12,14,13,11,11,12,11,14, 9,10, + 10,11,12,10,11,11,12,13, 9,10,10,12,12,12,12,12, + 14,13,11,12,10,14,11, 9, 9,10,11,12, 9,10,10,12, + 12, 9,10,10,12,12,12,12,12,14,14,11,12,12,13,12, + 9,10, 9,12,12, 9,10,11,12,13,10,11,10,13,11,12, + 12,13,13,14,12,12,12,13,13, 9,10,10,12,12,10,11, + 10,13,12,10,10,11,12,13,12,13,12,14,13,12,12,12, + 13,14,11,12,11,14,13,10,10,11,13,13,12,12,12,14, + 13,12,10,14,10,15,13,14,14,14,14,11,11,12,13,14, + 10,12,11,13,13,12,12,12,13,15,12,13,11,15,12,13, + 13,14,14,14, 9,10, 9,12,12, 9,10,10,12,12,10,10, + 10,12,12,11,11,12,12,13,12,12,12,14,14, 9,10,10, + 12,12,10,11,10,13,12,10,10,11,12,13,12,12,12,14, + 13,12,12,13,13,14, 9,10,10,12,13,10,10,11,11,12, + 9,11,10,13,12,12,12,12,13,14,12,13,12,14,13,11, + 12,11,13,13,12,13,12,14,13,10,11,12,13,13,13,13, + 13,14,15,12,11,14,12,14,11,11,12,12,13,12,12,12, + 13,14,10,12,10,14,13,13,13,13,14,15,12,14,11,15, + 10, +}; + +static const static_codebook _8u1__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__8u1__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__8u1__p4_0, + 0 +}; + +static const long _vq_quantlist__8u1__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8u1__p5_0[] = { + 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 5, 8, 7, 8, 8, + 10,10, 4, 6, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, + 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 8, 8, 8, + 9, 9,10,10,12,11, 8, 8, 8, 9, 9,10,10,11,11, 9, + 10,10,11,11,11,11,13,12, 9,10,10,11,11,12,12,12, + 13, +}; + +static const static_codebook _8u1__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__8u1__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8u1__p5_0, + 0 +}; + +static const long _vq_quantlist__8u1__p6_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__8u1__p6_0[] = { + 3, 4, 4, 6, 6, 7, 7, 9, 9, 4, 4, 5, 6, 6, 7, 7, + 9, 9, 4, 4, 4, 6, 6, 7, 7, 9, 9, 6, 6, 6, 7, 7, + 8, 8, 9, 9, 6, 6, 6, 7, 7, 8, 8, 9, 9, 7, 7, 7, + 8, 8, 8, 9,10,10, 7, 7, 7, 8, 8, 9, 8,10,10, 9, + 9, 9, 9, 9,10,10,10,10, 9, 9, 9, 9, 9,10,10,10, + 10, +}; + +static const static_codebook _8u1__p6_0 = { + 2, 81, + (long *)_vq_lengthlist__8u1__p6_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__8u1__p6_0, + 0 +}; + +static const long _vq_quantlist__8u1__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__8u1__p7_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 9, 8,10,10, 8, + 10,10, 5, 9, 9, 7,10,10, 8,10,10, 4,10,10, 9,12, + 12, 9,11,11, 7,12,11,10,11,13,10,13,13, 7,12,12, + 10,13,12,10,13,13, 4,10,10, 9,12,12, 9,12,12, 7, + 12,12,10,13,13,10,12,13, 7,11,12,10,13,13,10,13, + 11, +}; + +static const static_codebook _8u1__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__8u1__p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__8u1__p7_0, + 0 +}; + +static const long _vq_quantlist__8u1__p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__8u1__p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 7, + 8, 8, 9, 9, 9, 9, 4, 5, 5, 7, 7, 8, 8, 9, 9, 9, + 9, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 9, 9, + 9, 9, 9, 9,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, + 10,10,10, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, 8, 9, + 9, 9, 9, 9, 9,10,10,10,10, +}; + +static const static_codebook _8u1__p7_1 = { + 2, 121, + (long *)_vq_lengthlist__8u1__p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__8u1__p7_1, + 0 +}; + +static const long _vq_quantlist__8u1__p8_0[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__8u1__p8_0[] = { + 1, 4, 4, 6, 6, 8, 8,10,10,11,11, 4, 6, 6, 7, 7, + 9, 9,11,11,13,12, 4, 6, 6, 7, 7, 9, 9,11,11,12, + 12, 6, 7, 7, 9, 9,11,11,12,12,13,13, 6, 7, 7, 9, + 9,11,11,12,12,13,13, 8, 9, 9,11,11,12,12,13,13, + 14,14, 8, 9, 9,11,11,12,12,13,13,14,14, 9,11,11, + 12,12,13,13,14,14,15,15, 9,11,11,12,12,13,13,14, + 14,15,14,11,12,12,13,13,14,14,15,15,16,16,11,12, + 12,13,13,14,14,15,15,15,15, +}; + +static const static_codebook _8u1__p8_0 = { + 2, 121, + (long *)_vq_lengthlist__8u1__p8_0, + 1, -524582912, 1618345984, 4, 0, + (long *)_vq_quantlist__8u1__p8_0, + 0 +}; + +static const long _vq_quantlist__8u1__p8_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__8u1__p8_1[] = { + 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 5, 6, 6, 7, 7, + 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, + 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 9, + 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, +}; + +static const static_codebook _8u1__p8_1 = { + 2, 121, + (long *)_vq_lengthlist__8u1__p8_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__8u1__p8_1, + 0 +}; + +static const long _vq_quantlist__8u1__p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__8u1__p9_0[] = { + 1, 4, 4,11,11,11,11,11,11,11,11,11,11,11,11, 3, + 11, 8,11,11,11,11,11,11,11,11,11,11,11,11, 3, 9, + 9,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _8u1__p9_0 = { + 2, 225, + (long *)_vq_lengthlist__8u1__p9_0, + 1, -514071552, 1627381760, 4, 0, + (long *)_vq_quantlist__8u1__p9_0, + 0 +}; + +static const long _vq_quantlist__8u1__p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__8u1__p9_1[] = { + 1, 4, 4, 7, 7, 9, 9, 7, 7, 8, 8,10,10,11,11, 4, + 7, 7, 9, 9,10,10, 8, 8,10,10,10,11,10,11, 4, 7, + 7, 9, 9,10,10, 8, 8,10, 9,11,11,11,11, 7, 9, 9, + 12,12,11,12,10,10,11,10,12,11,11,11, 7, 9, 9,11, + 11,13,12, 9, 9,11,10,11,11,12,11, 9,10,10,12,12, + 14,14,10,10,11,12,12,11,11,11, 9,10,11,11,13,14, + 13,10,11,11,11,12,11,12,12, 7, 8, 8,10, 9,11,10, + 11,12,12,11,12,14,12,13, 7, 8, 8, 9,10,10,11,12, + 12,12,11,12,12,12,13, 9, 9, 9,11,11,13,12,12,12, + 12,11,12,12,13,12, 8,10,10,11,10,11,12,12,12,12, + 12,12,14,12,12, 9,11,11,11,12,12,12,12,13,13,12, + 12,13,13,12,10,11,11,12,11,12,12,12,11,12,13,12, + 12,12,13,11,11,12,12,12,13,12,12,11,12,13,13,12, + 12,13,12,11,12,12,13,13,12,13,12,13,13,13,13,14, + 13, +}; + +static const static_codebook _8u1__p9_1 = { + 2, 225, + (long *)_vq_lengthlist__8u1__p9_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__8u1__p9_1, + 0 +}; + +static const long _vq_quantlist__8u1__p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__8u1__p9_2[] = { + 2, 5, 4, 6, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10,10, 9, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10, 8, 8, 8, 9, 9, 9, 9,10,10,10, 9, + 10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10,10, + 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _8u1__p9_2 = { + 2, 289, + (long *)_vq_lengthlist__8u1__p9_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__8u1__p9_2, + 0 +}; + +static const long _huff_lengthlist__8u1__single[] = { + 4, 7,13, 9,15, 9,16, 8,10,13, 7, 5, 8, 6, 9, 7, + 10, 7,10,11,11, 6, 7, 8, 8, 9, 9, 9,12,16, 8, 5, + 8, 6, 8, 6, 9, 7,10,12,11, 7, 7, 7, 6, 7, 7, 7, + 11,15, 7, 5, 8, 6, 7, 5, 7, 6, 9,13,13, 9, 9, 8, + 6, 6, 5, 5, 9,14, 8, 6, 8, 6, 6, 4, 5, 3, 5,13, + 9, 9,11, 8,10, 7, 8, 4, 5,12,11,16,17,15,17,12, + 13, 8, 8,15, +}; + +static const static_codebook _huff_book__8u1__single = { + 2, 100, + (long *)_huff_lengthlist__8u1__single, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u0__long[] = { + 5, 8,13,10,17,11,11,15, 7, 2, 4, 5, 8, 7, 9,16, + 13, 4, 3, 5, 6, 8,11,20,10, 4, 5, 5, 7, 6, 8,18, + 15, 7, 6, 7, 8,10,14,20,10, 6, 7, 6, 9, 7, 8,17, + 9, 8,10, 8,10, 5, 4,11,12,17,19,14,16,10, 7,12, +}; + +static const static_codebook _huff_book__44u0__long = { + 2, 64, + (long *)_huff_lengthlist__44u0__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u0__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u0__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, + 10,10, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, + 11, 8,11,11, 8,12,11,11,13,13,11,13,14, 7,11,11, + 10,13,12,11,13,14, 4, 8, 8, 8,11,11, 8,11,12, 8, + 11,11,11,13,13,10,12,13, 8,11,11,11,14,13,11,14, + 13, +}; + +static const static_codebook _44u0__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u0__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u0__p1_0, + 0 +}; + +static const long _vq_quantlist__44u0__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u0__p2_0[] = { + 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, + 8, 8, 5, 7, 7, 6, 8, 8, 7, 8, 8, 4, 7, 7, 7, 8, + 8, 7, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, + 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 8, 6, + 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, + 9, +}; + +static const static_codebook _44u0__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u0__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u0__p2_0, + 0 +}; + +static const long _vq_quantlist__44u0__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u0__p3_0[] = { + 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, + 10, 9,12,12, 9, 9,10,12,12, 6, 8, 8,11,10, 8,10, + 10,11,11, 8, 9,10,11,11,10,11,11,14,13,10,11,11, + 13,13, 5, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, + 11,10,11,11,13,13,10,11,11,13,13, 9,11,11,15,14, + 10,12,12,15,14,10,12,11,15,14,13,14,14,16,16,12, + 14,13,17,15, 9,11,11,14,15,10,11,12,14,16,10,11, + 12,14,16,12,13,14,16,16,13,13,15,15,18, 5, 8, 8, + 11,11, 8,10,10,12,12, 8,10,10,12,13,11,12,12,14, + 14,11,12,12,15,15, 8,10,10,13,13,10,12,12,13,13, + 10,12,12,14,14,12,13,13,15,15,12,13,13,16,16, 7, + 10,10,12,12,10,12,11,13,13,10,12,12,13,14,12,13, + 12,15,14,12,13,13,16,16,10,12,12,17,16,12,13,13, + 16,15,11,13,13,17,17,15,15,15,16,17,14,15,15,19, + 19,10,12,12,15,16,11,13,12,15,18,11,13,13,16,16, + 14,15,15,17,17,14,15,15,17,19, 5, 8, 8,11,11, 8, + 10,10,12,12, 8,10,10,12,12,11,12,12,16,15,11,12, + 12,14,15, 7,10,10,13,13,10,12,12,14,13,10,11,12, + 13,13,12,13,13,16,16,12,12,13,15,15, 8,10,10,13, + 13,10,12,12,14,14,10,12,12,13,13,12,13,13,16,16, + 12,13,13,15,15,10,12,12,16,15,11,13,13,17,16,11, + 12,13,16,15,13,15,15,19,17,14,15,14,17,16,10,12, + 12,16,16,11,13,13,16,17,12,13,13,15,17,14,15,15, + 17,19,14,15,15,17,17, 8,11,11,16,16,10,13,12,17, + 17,10,12,13,16,16,15,17,16,20,19,14,15,17,18,19, + 9,12,12,16,17,11,13,14,17,18,11,13,13,19,18,16, + 17,18,19,19,15,16,16,19,19, 9,12,12,16,17,11,14, + 13,18,17,11,13,13,17,17,16,17,16,20,19,14,16,16, + 18,18,12,15,15,19,17,14,15,16, 0,20,13,15,16,20, + 17,18,16,20, 0, 0,15,16,19,20, 0,12,15,14,18,19, + 13,16,15,20,19,13,16,15,20,18,17,18,17, 0,20,16, + 17,16, 0, 0, 8,11,11,16,15,10,12,12,17,17,10,13, + 13,17,16,14,16,15,18,20,15,16,16,19,19, 9,12,12, + 16,16,11,13,13,17,16,11,13,14,17,18,15,15,16,20, + 20,16,16,17,19,19, 9,13,12,16,17,11,14,13,17,17, + 11,14,14,18,17,14,16,15,18,19,16,17,18,18,19,12, + 14,15,19,18,13,15,16,18, 0,13,14,15, 0, 0,16,16, + 17,20, 0,17,17,20,20, 0,12,15,15,19,20,13,15,15, + 0, 0,14,16,15, 0, 0,15,18,16, 0, 0,17,18,16, 0, + 19, +}; + +static const static_codebook _44u0__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u0__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u0__p3_0, + 0 +}; + +static const long _vq_quantlist__44u0__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u0__p4_0[] = { + 4, 5, 5, 9, 9, 5, 6, 6, 9, 9, 5, 6, 6, 9, 9, 9, + 10, 9,12,12, 9, 9,10,12,12, 5, 7, 7,10,10, 7, 7, + 8,10,10, 6, 7, 8,10,10,10,10,10,11,13,10, 9,10, + 12,13, 5, 7, 7,10,10, 6, 8, 7,10,10, 7, 8, 7,10, + 10, 9,10,10,12,12,10,10,10,13,11, 9,10,10,13,13, + 10,11,10,13,13,10,10,10,13,13,12,12,13,14,14,12, + 12,13,14,14, 9,10,10,13,13,10,10,10,13,13,10,10, + 10,13,13,12,13,12,15,14,12,13,12,15,15, 5, 7, 6, + 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,13, + 13,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,10,11, + 8, 9, 9,11,11,11,10,11,11,14,11,11,11,13,13, 6, + 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,14,11,10,11,11,13,13,10,11,11,14,13,10,10,11, + 14,13,10,11,11,14,14,12,11,13,12,16,13,14,14,15, + 15,10,10,11,13,14,10,11,10,14,13,10,11,11,14,14, + 12,13,12,15,13,13,13,14,15,16, 5, 7, 7,10,10, 7, + 8, 8,10,10, 7, 8, 8,10,10,10,10,10,13,13,10,10, + 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,10,11,11,13,13,10,10,11,11,13, 6, 8, 8,10, + 11, 8, 9, 9,11,11, 8, 9, 8,12,10,10,11,11,13,13, + 10,11,10,14,11,10,10,10,14,13,10,11,11,14,13,10, + 10,11,13,13,12,14,14,16,16,12,12,13,13,15,10,11, + 11,13,14,10,11,11,14,15,10,11,10,13,13,13,14,13, + 16,16,12,13,11,15,12, 9,10,10,13,13,10,11,11,14, + 13,10,10,11,13,14,13,14,13,16,16,13,13,13,15,16, + 9,10,10,13,13,10,10,11,13,14,10,11,11,15,13,13, + 13,14,14,18,13,13,14,16,15, 9,10,10,13,14,10,11, + 10,14,13,10,11,11,13,14,13,14,13,16,15,13,13,14, + 15,16,12,13,12,16,14,11,11,13,15,15,13,14,13,16, + 15,15,12,16,12,17,14,15,15,17,17,12,13,13,14,16, + 11,13,11,16,15,12,13,14,15,16,14,15,13, 0,14,14, + 16,16, 0, 0, 9,10,10,13,13,10,11,10,14,14,10,11, + 11,13,13,12,13,13,14,16,13,14,14,16,16, 9,10,10, + 14,14,11,11,11,14,13,10,10,11,14,14,13,13,13,16, + 16,13,13,14,14,17, 9,10,10,13,14,10,11,11,13,15, + 10,11,10,14,14,13,13,13,14,17,13,14,13,17,14,12, + 13,13,16,14,13,14,13,16,15,12,12,13,15,16,15,15, + 16,18,16,15,13,15,14, 0,12,12,13,14,16,13,13,14, + 15,16,11,12,11,16,14,15,16,16,17,17,14,15,12,17, + 12, +}; + +static const static_codebook _44u0__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u0__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u0__p4_0, + 0 +}; + +static const long _vq_quantlist__44u0__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u0__p5_0[] = { + 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, + 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, + 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 8, 8, + 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, + 9, 9,10,10,11,11,12,12, 9, 9, 9,10,11,11,11,12, + 12, +}; + +static const static_codebook _44u0__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u0__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u0__p5_0, + 0 +}; + +static const long _vq_quantlist__44u0__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u0__p6_0[] = { + 1, 4, 4, 6, 6, 8, 8,10, 9,11,10,14,13, 4, 6, 5, + 8, 8, 9, 9,11,10,11,11,14,14, 4, 5, 6, 8, 8, 9, + 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, + 12,12,16,15, 7, 8, 8, 9, 9,10,10,11,11,12,12,15, + 15, 9,10,10,10,10,11,11,12,12,12,12,15,15, 9,10, + 9,10,11,11,11,12,12,12,13,15,15,10,10,11,11,11, + 12,12,13,12,13,13,16,15,10,11,11,11,11,12,12,13, + 12,13,13,16,17,11,11,12,12,12,13,13,13,14,14,15, + 17,17,11,11,12,12,12,13,13,13,14,14,14,16,18,14, + 15,15,15,15,16,16,16,16,17,18, 0, 0,14,15,15,15, + 15,17,16,17,18,17,17,18, 0, +}; + +static const static_codebook _44u0__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u0__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u0__p6_0, + 0 +}; + +static const long _vq_quantlist__44u0__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u0__p6_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 5, 6, 6, 6, 6, +}; + +static const static_codebook _44u0__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u0__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u0__p6_1, + 0 +}; + +static const long _vq_quantlist__44u0__p7_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u0__p7_0[] = { + 1, 4, 4,11,11, 9,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11, 9,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _44u0__p7_0 = { + 4, 625, + (long *)_vq_lengthlist__44u0__p7_0, + 1, -518709248, 1626677248, 3, 0, + (long *)_vq_quantlist__44u0__p7_0, + 0 +}; + +static const long _vq_quantlist__44u0__p7_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u0__p7_1[] = { + 1, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 5, 7, 7, + 8, 7, 7, 7, 9, 8,10, 9,10,11, 5, 7, 7, 8, 8, 7, + 7, 8, 9,10,10,11,11, 6, 8, 8, 9, 9, 9, 9,11,10, + 12,12,15,12, 6, 8, 8, 9, 9, 9, 9,11,11,12,11,14, + 12, 7, 8, 8,10,10,12,12,13,13,13,15,13,13, 7, 8, + 8,10,10,11,11,13,12,14,15,15,15, 9,10,10,11,12, + 13,13,14,15,14,15,14,15, 8,10,10,12,12,14,14,15, + 14,14,15,15,14,10,12,12,14,14,15,14,15,15,15,14, + 15,15,10,12,12,13,14,15,14,15,15,14,15,15,15,12, + 15,13,15,14,15,15,15,15,15,15,15,15,13,13,15,15, + 15,15,15,15,15,15,15,15,15, +}; + +static const static_codebook _44u0__p7_1 = { + 2, 169, + (long *)_vq_lengthlist__44u0__p7_1, + 1, -523010048, 1618608128, 4, 0, + (long *)_vq_quantlist__44u0__p7_1, + 0 +}; + +static const long _vq_quantlist__44u0__p7_2[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u0__p7_2[] = { + 2, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 5, 5, 6, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 5, 6, 5, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, 8, 8, 8, 9, 8, + 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, + 8, 9, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, + 9, 9, 9, 9, 9, 9,10,10, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, + 9, 9, 9,10, 9, 9,10,10, 9, +}; + +static const static_codebook _44u0__p7_2 = { + 2, 169, + (long *)_vq_lengthlist__44u0__p7_2, + 1, -531103744, 1611661312, 4, 0, + (long *)_vq_quantlist__44u0__p7_2, + 0 +}; + +static const long _huff_lengthlist__44u0__short[] = { + 12,13,14,13,17,12,15,17, 5, 5, 6,10,10,11,15,16, + 4, 3, 3, 7, 5, 7,10,16, 7, 7, 7,10, 9,11,12,16, + 6, 5, 5, 9, 5, 6,10,16, 8, 7, 7, 9, 6, 7, 9,16, + 11, 7, 3, 6, 4, 5, 8,16,12, 9, 4, 8, 5, 7, 9,16, +}; + +static const static_codebook _huff_book__44u0__short = { + 2, 64, + (long *)_huff_lengthlist__44u0__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u1__long[] = { + 5, 8,13,10,17,11,11,15, 7, 2, 4, 5, 8, 7, 9,16, + 13, 4, 3, 5, 6, 8,11,20,10, 4, 5, 5, 7, 6, 8,18, + 15, 7, 6, 7, 8,10,14,20,10, 6, 7, 6, 9, 7, 8,17, + 9, 8,10, 8,10, 5, 4,11,12,17,19,14,16,10, 7,12, +}; + +static const static_codebook _huff_book__44u1__long = { + 2, 64, + (long *)_huff_lengthlist__44u1__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u1__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u1__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, + 10,10, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, + 11, 8,11,11, 8,12,11,11,13,13,11,13,14, 7,11,11, + 10,13,12,11,13,14, 4, 8, 8, 8,11,11, 8,11,12, 8, + 11,11,11,13,13,10,12,13, 8,11,11,11,14,13,11,14, + 13, +}; + +static const static_codebook _44u1__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u1__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u1__p1_0, + 0 +}; + +static const long _vq_quantlist__44u1__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u1__p2_0[] = { + 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, + 8, 8, 5, 7, 7, 6, 8, 8, 7, 8, 8, 4, 7, 7, 7, 8, + 8, 7, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, + 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 8, 6, + 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, + 9, +}; + +static const static_codebook _44u1__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u1__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u1__p2_0, + 0 +}; + +static const long _vq_quantlist__44u1__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u1__p3_0[] = { + 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, + 10, 9,12,12, 9, 9,10,12,12, 6, 8, 8,11,10, 8,10, + 10,11,11, 8, 9,10,11,11,10,11,11,14,13,10,11,11, + 13,13, 5, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, + 11,10,11,11,13,13,10,11,11,13,13, 9,11,11,15,14, + 10,12,12,15,14,10,12,11,15,14,13,14,14,16,16,12, + 14,13,17,15, 9,11,11,14,15,10,11,12,14,16,10,11, + 12,14,16,12,13,14,16,16,13,13,15,15,18, 5, 8, 8, + 11,11, 8,10,10,12,12, 8,10,10,12,13,11,12,12,14, + 14,11,12,12,15,15, 8,10,10,13,13,10,12,12,13,13, + 10,12,12,14,14,12,13,13,15,15,12,13,13,16,16, 7, + 10,10,12,12,10,12,11,13,13,10,12,12,13,14,12,13, + 12,15,14,12,13,13,16,16,10,12,12,17,16,12,13,13, + 16,15,11,13,13,17,17,15,15,15,16,17,14,15,15,19, + 19,10,12,12,15,16,11,13,12,15,18,11,13,13,16,16, + 14,15,15,17,17,14,15,15,17,19, 5, 8, 8,11,11, 8, + 10,10,12,12, 8,10,10,12,12,11,12,12,16,15,11,12, + 12,14,15, 7,10,10,13,13,10,12,12,14,13,10,11,12, + 13,13,12,13,13,16,16,12,12,13,15,15, 8,10,10,13, + 13,10,12,12,14,14,10,12,12,13,13,12,13,13,16,16, + 12,13,13,15,15,10,12,12,16,15,11,13,13,17,16,11, + 12,13,16,15,13,15,15,19,17,14,15,14,17,16,10,12, + 12,16,16,11,13,13,16,17,12,13,13,15,17,14,15,15, + 17,19,14,15,15,17,17, 8,11,11,16,16,10,13,12,17, + 17,10,12,13,16,16,15,17,16,20,19,14,15,17,18,19, + 9,12,12,16,17,11,13,14,17,18,11,13,13,19,18,16, + 17,18,19,19,15,16,16,19,19, 9,12,12,16,17,11,14, + 13,18,17,11,13,13,17,17,16,17,16,20,19,14,16,16, + 18,18,12,15,15,19,17,14,15,16, 0,20,13,15,16,20, + 17,18,16,20, 0, 0,15,16,19,20, 0,12,15,14,18,19, + 13,16,15,20,19,13,16,15,20,18,17,18,17, 0,20,16, + 17,16, 0, 0, 8,11,11,16,15,10,12,12,17,17,10,13, + 13,17,16,14,16,15,18,20,15,16,16,19,19, 9,12,12, + 16,16,11,13,13,17,16,11,13,14,17,18,15,15,16,20, + 20,16,16,17,19,19, 9,13,12,16,17,11,14,13,17,17, + 11,14,14,18,17,14,16,15,18,19,16,17,18,18,19,12, + 14,15,19,18,13,15,16,18, 0,13,14,15, 0, 0,16,16, + 17,20, 0,17,17,20,20, 0,12,15,15,19,20,13,15,15, + 0, 0,14,16,15, 0, 0,15,18,16, 0, 0,17,18,16, 0, + 19, +}; + +static const static_codebook _44u1__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u1__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u1__p3_0, + 0 +}; + +static const long _vq_quantlist__44u1__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u1__p4_0[] = { + 4, 5, 5, 9, 9, 5, 6, 6, 9, 9, 5, 6, 6, 9, 9, 9, + 10, 9,12,12, 9, 9,10,12,12, 5, 7, 7,10,10, 7, 7, + 8,10,10, 6, 7, 8,10,10,10,10,10,11,13,10, 9,10, + 12,13, 5, 7, 7,10,10, 6, 8, 7,10,10, 7, 8, 7,10, + 10, 9,10,10,12,12,10,10,10,13,11, 9,10,10,13,13, + 10,11,10,13,13,10,10,10,13,13,12,12,13,14,14,12, + 12,13,14,14, 9,10,10,13,13,10,10,10,13,13,10,10, + 10,13,13,12,13,12,15,14,12,13,12,15,15, 5, 7, 6, + 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,13, + 13,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,10,11, + 8, 9, 9,11,11,11,10,11,11,14,11,11,11,13,13, 6, + 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,14,11,10,11,11,13,13,10,11,11,14,13,10,10,11, + 14,13,10,11,11,14,14,12,11,13,12,16,13,14,14,15, + 15,10,10,11,13,14,10,11,10,14,13,10,11,11,14,14, + 12,13,12,15,13,13,13,14,15,16, 5, 7, 7,10,10, 7, + 8, 8,10,10, 7, 8, 8,10,10,10,10,10,13,13,10,10, + 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,10,11,11,13,13,10,10,11,11,13, 6, 8, 8,10, + 11, 8, 9, 9,11,11, 8, 9, 8,12,10,10,11,11,13,13, + 10,11,10,14,11,10,10,10,14,13,10,11,11,14,13,10, + 10,11,13,13,12,14,14,16,16,12,12,13,13,15,10,11, + 11,13,14,10,11,11,14,15,10,11,10,13,13,13,14,13, + 16,16,12,13,11,15,12, 9,10,10,13,13,10,11,11,14, + 13,10,10,11,13,14,13,14,13,16,16,13,13,13,15,16, + 9,10,10,13,13,10,10,11,13,14,10,11,11,15,13,13, + 13,14,14,18,13,13,14,16,15, 9,10,10,13,14,10,11, + 10,14,13,10,11,11,13,14,13,14,13,16,15,13,13,14, + 15,16,12,13,12,16,14,11,11,13,15,15,13,14,13,16, + 15,15,12,16,12,17,14,15,15,17,17,12,13,13,14,16, + 11,13,11,16,15,12,13,14,15,16,14,15,13, 0,14,14, + 16,16, 0, 0, 9,10,10,13,13,10,11,10,14,14,10,11, + 11,13,13,12,13,13,14,16,13,14,14,16,16, 9,10,10, + 14,14,11,11,11,14,13,10,10,11,14,14,13,13,13,16, + 16,13,13,14,14,17, 9,10,10,13,14,10,11,11,13,15, + 10,11,10,14,14,13,13,13,14,17,13,14,13,17,14,12, + 13,13,16,14,13,14,13,16,15,12,12,13,15,16,15,15, + 16,18,16,15,13,15,14, 0,12,12,13,14,16,13,13,14, + 15,16,11,12,11,16,14,15,16,16,17,17,14,15,12,17, + 12, +}; + +static const static_codebook _44u1__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u1__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u1__p4_0, + 0 +}; + +static const long _vq_quantlist__44u1__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u1__p5_0[] = { + 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, + 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, + 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 8, 8, + 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, + 9, 9,10,10,11,11,12,12, 9, 9, 9,10,11,11,11,12, + 12, +}; + +static const static_codebook _44u1__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u1__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u1__p5_0, + 0 +}; + +static const long _vq_quantlist__44u1__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u1__p6_0[] = { + 1, 4, 4, 6, 6, 8, 8,10, 9,11,10,14,13, 4, 6, 5, + 8, 8, 9, 9,11,10,11,11,14,14, 4, 5, 6, 8, 8, 9, + 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, + 12,12,16,15, 7, 8, 8, 9, 9,10,10,11,11,12,12,15, + 15, 9,10,10,10,10,11,11,12,12,12,12,15,15, 9,10, + 9,10,11,11,11,12,12,12,13,15,15,10,10,11,11,11, + 12,12,13,12,13,13,16,15,10,11,11,11,11,12,12,13, + 12,13,13,16,17,11,11,12,12,12,13,13,13,14,14,15, + 17,17,11,11,12,12,12,13,13,13,14,14,14,16,18,14, + 15,15,15,15,16,16,16,16,17,18, 0, 0,14,15,15,15, + 15,17,16,17,18,17,17,18, 0, +}; + +static const static_codebook _44u1__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u1__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u1__p6_0, + 0 +}; + +static const long _vq_quantlist__44u1__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u1__p6_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 5, 6, 6, 6, 6, +}; + +static const static_codebook _44u1__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u1__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u1__p6_1, + 0 +}; + +static const long _vq_quantlist__44u1__p7_0[] = { + 3, + 2, + 4, + 1, + 5, + 0, + 6, +}; + +static const long _vq_lengthlist__44u1__p7_0[] = { + 1, 3, 2, 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, +}; + +static const static_codebook _44u1__p7_0 = { + 2, 49, + (long *)_vq_lengthlist__44u1__p7_0, + 1, -518017024, 1626677248, 3, 0, + (long *)_vq_quantlist__44u1__p7_0, + 0 +}; + +static const long _vq_quantlist__44u1__p7_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u1__p7_1[] = { + 1, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 5, 7, 7, + 8, 7, 7, 7, 9, 8,10, 9,10,11, 5, 7, 7, 8, 8, 7, + 7, 8, 9,10,10,11,11, 6, 8, 8, 9, 9, 9, 9,11,10, + 12,12,15,12, 6, 8, 8, 9, 9, 9, 9,11,11,12,11,14, + 12, 7, 8, 8,10,10,12,12,13,13,13,15,13,13, 7, 8, + 8,10,10,11,11,13,12,14,15,15,15, 9,10,10,11,12, + 13,13,14,15,14,15,14,15, 8,10,10,12,12,14,14,15, + 14,14,15,15,14,10,12,12,14,14,15,14,15,15,15,14, + 15,15,10,12,12,13,14,15,14,15,15,14,15,15,15,12, + 15,13,15,14,15,15,15,15,15,15,15,15,13,13,15,15, + 15,15,15,15,15,15,15,15,15, +}; + +static const static_codebook _44u1__p7_1 = { + 2, 169, + (long *)_vq_lengthlist__44u1__p7_1, + 1, -523010048, 1618608128, 4, 0, + (long *)_vq_quantlist__44u1__p7_1, + 0 +}; + +static const long _vq_quantlist__44u1__p7_2[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u1__p7_2[] = { + 2, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 5, 5, 6, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 5, 6, 5, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, 8, 8, 8, 9, 8, + 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, + 8, 9, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, + 9, 9, 9, 9, 9, 9,10,10, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, + 9, 9, 9,10, 9, 9,10,10, 9, +}; + +static const static_codebook _44u1__p7_2 = { + 2, 169, + (long *)_vq_lengthlist__44u1__p7_2, + 1, -531103744, 1611661312, 4, 0, + (long *)_vq_quantlist__44u1__p7_2, + 0 +}; + +static const long _huff_lengthlist__44u1__short[] = { + 12,13,14,13,17,12,15,17, 5, 5, 6,10,10,11,15,16, + 4, 3, 3, 7, 5, 7,10,16, 7, 7, 7,10, 9,11,12,16, + 6, 5, 5, 9, 5, 6,10,16, 8, 7, 7, 9, 6, 7, 9,16, + 11, 7, 3, 6, 4, 5, 8,16,12, 9, 4, 8, 5, 7, 9,16, +}; + +static const static_codebook _huff_book__44u1__short = { + 2, 64, + (long *)_huff_lengthlist__44u1__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u2__long[] = { + 5, 9,14,12,15,13,10,13, 7, 4, 5, 6, 8, 7, 8,12, + 13, 4, 3, 5, 5, 6, 9,15,12, 6, 5, 6, 6, 6, 7,14, + 14, 7, 4, 6, 4, 6, 8,15,12, 6, 6, 5, 5, 5, 6,14, + 9, 7, 8, 6, 7, 5, 4,10,10,13,14,14,15,10, 6, 8, +}; + +static const static_codebook _huff_book__44u2__long = { + 2, 64, + (long *)_huff_lengthlist__44u2__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u2__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u2__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, + 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, + 11, 8,11,11, 8,11,11,11,13,14,11,13,13, 7,11,11, + 10,13,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 8, + 11,11,11,14,13,10,12,13, 8,11,11,11,13,13,11,13, + 13, +}; + +static const static_codebook _44u2__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u2__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u2__p1_0, + 0 +}; + +static const long _vq_quantlist__44u2__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u2__p2_0[] = { + 2, 5, 5, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, + 8, 8, 5, 6, 6, 6, 8, 7, 7, 8, 8, 5, 6, 6, 7, 8, + 8, 6, 8, 8, 6, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, + 7,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, + 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, + 9, +}; + +static const static_codebook _44u2__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u2__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u2__p2_0, + 0 +}; + +static const long _vq_quantlist__44u2__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u2__p3_0[] = { + 2, 4, 4, 7, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, + 9, 9,12,11, 8, 9, 9,11,12, 5, 7, 7,10,10, 7, 9, + 9,11,11, 7, 9, 9,10,11,10,11,11,13,13, 9,10,11, + 12,13, 5, 7, 7,10,10, 7, 9, 9,11,10, 7, 9, 9,11, + 11, 9,11,10,13,13,10,11,11,13,13, 8,10,10,14,13, + 10,11,11,15,14, 9,11,11,15,14,13,14,13,16,14,12, + 13,13,15,16, 8,10,10,13,14, 9,11,11,14,15,10,11, + 11,14,15,12,13,13,15,15,12,13,14,15,16, 5, 7, 7, + 10,10, 7, 9, 9,11,11, 7, 9, 9,11,12,10,11,11,14, + 13,10,11,11,14,14, 7, 9, 9,12,12, 9,11,11,13,13, + 9,11,11,13,13,12,13,12,14,14,11,12,13,15,15, 7, + 9, 9,12,12, 8,11,10,13,12, 9,11,11,13,13,11,13, + 12,15,13,11,13,13,15,16, 9,12,11,15,15,11,12,12, + 16,15,11,12,13,16,16,13,14,15,16,15,13,15,15,17, + 17, 9,11,11,14,15,10,12,12,15,15,11,13,12,15,16, + 13,15,14,16,16,13,15,15,17,19, 5, 7, 7,10,10, 7, + 9, 9,12,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, + 11,13,14, 7, 9, 9,12,12, 9,11,11,13,13, 9,10,11, + 12,13,11,13,12,16,15,11,12,12,14,15, 7, 9, 9,12, + 12, 9,11,11,13,13, 9,11,11,13,12,11,13,12,15,16, + 12,13,13,15,14, 9,11,11,15,14,11,13,12,16,15,10, + 11,12,15,15,13,14,14,18,17,13,14,14,15,17,10,11, + 11,14,15,11,13,12,15,17,11,13,12,15,16,13,15,14, + 18,17,14,15,15,16,18, 7,10,10,14,14,10,12,12,15, + 15,10,12,12,15,15,14,15,15,18,17,13,15,15,16,16, + 9,11,11,16,15,11,13,13,16,18,11,13,13,16,16,15, + 16,16, 0, 0,14,15,16,18,17, 9,11,11,15,15,10,13, + 12,17,16,11,12,13,16,17,14,15,16,19,19,14,15,15, + 0,20,12,14,14, 0, 0,13,14,16,19,18,13,15,16,20, + 17,16,18, 0, 0, 0,15,16,17,18,19,11,14,14, 0,19, + 12,15,14,17,17,13,15,15, 0, 0,16,17,15,20,19,15, + 17,16,19, 0, 8,10,10,14,15,10,12,11,15,15,10,11, + 12,16,15,13,14,14,19,17,14,15,15, 0, 0, 9,11,11, + 16,15,11,13,13,17,16,10,12,13,16,17,14,15,15,18, + 18,14,15,16,20,19, 9,12,12, 0,15,11,13,13,16,17, + 11,13,13,19,17,14,16,16,18,17,15,16,16,17,19,11, + 14,14,18,18,13,14,15, 0, 0,12,14,15,19,18,15,16, + 19, 0,19,15,16,19,19,17,12,14,14,16,19,13,15,15, + 0,17,13,15,14,18,18,15,16,15, 0,18,16,17,17, 0, + 0, +}; + +static const static_codebook _44u2__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u2__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u2__p3_0, + 0 +}; + +static const long _vq_quantlist__44u2__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u2__p4_0[] = { + 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, + 9, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 7, 8,10,10,10,10,10,11,12, 9,10,10, + 11,12, 5, 7, 7, 9, 9, 6, 8, 7,10,10, 7, 8, 8,10, + 10, 9,10,10,12,11, 9,10,10,12,11, 9,10,10,12,12, + 10,10,10,13,12, 9,10,10,12,13,12,12,12,14,14,11, + 12,12,13,14, 9,10,10,12,12, 9,10,10,12,13,10,10, + 10,12,13,11,12,12,14,13,12,12,12,14,13, 5, 7, 7, + 10, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, + 12,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, + 8, 9, 9,11,11,10,11,11,12,13,10,11,11,13,13, 6, + 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,13,11,10,11,11,13,13, 9,10,10,13,13,10,11,11, + 13,13,10,11,11,14,13,12,11,13,12,15,12,13,13,15, + 15, 9,10,10,12,13,10,11,10,13,13,10,11,11,13,13, + 12,13,11,15,13,12,13,13,15,15, 5, 7, 7, 9,10, 7, + 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12,12,10,10, + 11,12,12, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, + 11, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,11,13,13, + 10,11,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, + 10,11,13,13,12,13,13,15,15,12,11,13,12,14, 9,10, + 10,12,13,10,11,11,13,14,10,11,11,13,13,12,13,13, + 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, + 13, 9,10,10,13,13,12,13,13,15,15,12,12,12,14,14, + 9,10,10,13,13,10,11,11,13,14,10,11,11,14,12,13, + 13,14,14,16,12,13,13,15,14, 9,10,10,13,13,10,11, + 10,14,13,10,11,11,13,14,12,14,13,16,14,13,13,13, + 14,15,11,13,12,15,14,11,12,13,14,15,12,13,13,16, + 15,14,12,15,12,16,14,15,15,17,16,11,12,12,14,15, + 11,13,11,15,14,12,13,13,15,16,13,15,12,17,13,14, + 15,15,16,16, 8, 9, 9,12,12, 9,10,10,13,13, 9,10, + 10,13,13,12,13,12,14,14,12,13,13,15,15, 9,10,10, + 13,13,10,11,11,14,13,10,10,11,13,14,12,13,13,15, + 14,12,12,14,14,16, 9,10,10,13,13,10,11,11,13,14, + 10,11,11,14,13,13,13,13,15,15,13,14,13,16,14,11, + 12,12,14,14,12,13,13,16,15,11,12,13,14,15,14,15, + 15,16,16,14,13,15,13,17,11,12,12,14,15,12,13,13, + 15,16,11,13,12,15,15,14,15,14,16,16,14,15,12,17, + 13, +}; + +static const static_codebook _44u2__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u2__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u2__p4_0, + 0 +}; + +static const long _vq_quantlist__44u2__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u2__p5_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9, 4, 6, 5, 8, 8, 8, 8, + 10,10, 4, 5, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, + 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 8, 8, 8, + 9, 9,10,11,12,12, 8, 8, 8, 9, 9,10,10,12,12,10, + 10,10,11,11,12,12,13,13,10,10,10,11,11,12,12,13, + 13, +}; + +static const static_codebook _44u2__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u2__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u2__p5_0, + 0 +}; + +static const long _vq_quantlist__44u2__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u2__p6_0[] = { + 1, 4, 4, 6, 6, 8, 8,10,10,11,11,14,13, 4, 6, 5, + 8, 8, 9, 9,11,10,12,11,15,14, 4, 5, 6, 8, 8, 9, + 9,11,11,11,11,14,14, 6, 8, 8,10, 9,11,11,11,11, + 12,12,15,15, 6, 8, 8, 9, 9,11,11,11,12,12,12,15, + 15, 8,10,10,11,11,11,11,12,12,13,13,15,16, 8,10, + 10,11,11,11,11,12,12,13,13,16,16,10,11,11,12,12, + 12,12,13,13,13,13,17,16,10,11,11,12,12,12,12,13, + 13,13,14,16,17,11,12,12,13,13,13,13,14,14,15,14, + 18,17,11,12,12,13,13,13,13,14,14,14,15,19,18,14, + 15,15,15,15,16,16,18,19,18,18, 0, 0,14,15,15,16, + 15,17,17,16,18,17,18, 0, 0, +}; + +static const static_codebook _44u2__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u2__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u2__p6_0, + 0 +}; + +static const long _vq_quantlist__44u2__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u2__p6_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 5, 5, 6, 6, 6, +}; + +static const static_codebook _44u2__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u2__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u2__p6_1, + 0 +}; + +static const long _vq_quantlist__44u2__p7_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u2__p7_0[] = { + 1, 3, 2,12,12,12,12,12,12, 4,12,12,12,12,12,12, + 12,12, 5,12,12,12,12,12,12,12,12,12,12,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11, +}; + +static const static_codebook _44u2__p7_0 = { + 2, 81, + (long *)_vq_lengthlist__44u2__p7_0, + 1, -516612096, 1626677248, 4, 0, + (long *)_vq_quantlist__44u2__p7_0, + 0 +}; + +static const long _vq_quantlist__44u2__p7_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u2__p7_1[] = { + 1, 4, 4, 7, 6, 7, 6, 8, 7, 9, 7, 9, 8, 4, 7, 6, + 8, 8, 9, 8,10, 9,10,10,11,11, 4, 7, 7, 8, 8, 8, + 8, 9,10,11,11,11,11, 6, 8, 8,10,10,10,10,11,11, + 12,12,12,12, 7, 8, 8,10,10,10,10,11,11,12,12,13, + 13, 7, 9, 9,11,10,12,12,13,13,14,13,14,14, 7, 9, + 9,10,11,11,12,13,13,13,13,16,14, 9,10,10,12,12, + 13,13,14,14,15,16,15,16, 9,10,10,12,12,12,13,14, + 14,14,15,16,15,10,12,12,13,13,15,13,16,16,15,17, + 17,17,10,11,11,12,14,14,14,15,15,17,17,15,17,11, + 12,12,14,14,14,15,15,15,17,16,17,17,10,12,12,13, + 14,14,14,17,15,17,17,17,17, +}; + +static const static_codebook _44u2__p7_1 = { + 2, 169, + (long *)_vq_lengthlist__44u2__p7_1, + 1, -523010048, 1618608128, 4, 0, + (long *)_vq_quantlist__44u2__p7_1, + 0 +}; + +static const long _vq_quantlist__44u2__p7_2[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u2__p7_2[] = { + 2, 5, 5, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 5, 6, 6, + 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 6, 7, 7, 8, + 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 7, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, +}; + +static const static_codebook _44u2__p7_2 = { + 2, 169, + (long *)_vq_lengthlist__44u2__p7_2, + 1, -531103744, 1611661312, 4, 0, + (long *)_vq_quantlist__44u2__p7_2, + 0 +}; + +static const long _huff_lengthlist__44u2__short[] = { + 13,15,17,17,15,15,12,17,11, 9, 7,10,10, 9,12,17, + 10, 6, 3, 6, 5, 7,10,17,15,10, 6, 9, 8, 9,11,17, + 15, 8, 4, 7, 3, 5, 9,16,16,10, 5, 8, 4, 5, 8,16, + 13,11, 5, 8, 3, 3, 5,14,13,12, 7,10, 5, 5, 7,14, +}; + +static const static_codebook _huff_book__44u2__short = { + 2, 64, + (long *)_huff_lengthlist__44u2__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u3__long[] = { + 6, 9,13,12,14,11,10,13, 8, 4, 5, 7, 8, 7, 8,12, + 11, 4, 3, 5, 5, 7, 9,14,11, 6, 5, 6, 6, 6, 7,13, + 13, 7, 5, 6, 4, 5, 7,14,11, 7, 6, 6, 5, 5, 6,13, + 9, 7, 8, 6, 7, 5, 3, 9, 9,12,13,12,14,10, 6, 7, +}; + +static const static_codebook _huff_book__44u3__long = { + 2, 64, + (long *)_huff_lengthlist__44u3__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u3__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u3__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, + 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, + 11, 8,11,11, 8,11,11,11,13,14,11,14,14, 8,11,11, + 10,14,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 7, + 11,11,11,14,14,10,12,14, 8,11,11,11,14,14,11,14, + 13, +}; + +static const static_codebook _44u3__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u3__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u3__p1_0, + 0 +}; + +static const long _vq_quantlist__44u3__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u3__p2_0[] = { + 2, 5, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, + 8, 8, 5, 6, 6, 6, 8, 8, 7, 8, 8, 5, 7, 6, 7, 8, + 8, 6, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, + 8,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, + 8, 8, 8,10,10, 8, 8,10, 7, 8, 8, 8,10,10, 8,10, + 9, +}; + +static const static_codebook _44u3__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u3__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u3__p2_0, + 0 +}; + +static const long _vq_quantlist__44u3__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u3__p3_0[] = { + 2, 4, 4, 7, 7, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, + 9, 9,12,12, 8, 9, 9,11,12, 5, 7, 7,10,10, 7, 9, + 9,11,11, 7, 9, 9,10,11,10,11,11,13,13, 9,10,11, + 13,13, 5, 7, 7,10,10, 7, 9, 9,11,10, 7, 9, 9,11, + 11, 9,11,10,13,13,10,11,11,14,13, 8,10,10,14,13, + 10,11,11,15,14, 9,11,11,14,14,13,14,13,16,16,12, + 13,13,15,15, 8,10,10,13,14, 9,11,11,14,14,10,11, + 11,14,15,12,13,13,15,15,13,14,14,15,16, 5, 7, 7, + 10,10, 7, 9, 9,11,11, 7, 9, 9,11,12,10,11,11,14, + 14,10,11,11,14,14, 7, 9, 9,12,12, 9,11,11,13,13, + 9,11,11,13,13,12,12,13,15,15,11,12,13,15,16, 7, + 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,13,11,13, + 12,15,13,11,13,13,15,16, 9,12,11,15,14,11,12,13, + 16,15,11,13,13,15,16,14,14,15,17,16,13,15,16, 0, + 17, 9,11,11,15,15,10,13,12,15,15,11,13,13,15,16, + 13,15,13,16,15,14,16,15, 0,19, 5, 7, 7,10,10, 7, + 9, 9,11,11, 7, 9, 9,11,11,10,12,11,14,14,10,11, + 12,14,14, 7, 9, 9,12,12, 9,11,11,14,13, 9,10,11, + 12,13,11,13,13,16,16,11,12,13,13,16, 7, 9, 9,12, + 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,15,15, + 12,13,12,15,14, 9,11,11,15,14,11,13,12,16,16,10, + 12,12,15,15,13,15,15,17,19,13,14,15,16,17,10,12, + 12,15,15,11,13,13,16,16,11,13,13,15,16,13,15,15, + 0, 0,14,15,15,16,16, 8,10,10,14,14,10,12,12,15, + 15,10,12,11,15,16,14,15,15,19,20,13,14,14,18,16, + 9,11,11,15,15,11,13,13,17,16,11,13,13,16,16,15, + 17,17,20,20,14,15,16,17,20, 9,11,11,15,15,10,13, + 12,16,15,11,13,13,15,17,14,16,15,18, 0,14,16,15, + 18,20,12,14,14, 0, 0,14,14,16, 0, 0,13,16,15, 0, + 0,17,17,18, 0, 0,16,17,19,19, 0,12,14,14,18, 0, + 12,16,14, 0,17,13,15,15,18, 0,16,18,17, 0,17,16, + 18,17, 0, 0, 7,10,10,14,14,10,12,11,15,15,10,12, + 12,16,15,13,15,15,18, 0,14,15,15,17, 0, 9,11,11, + 15,15,11,13,13,16,16,11,12,13,16,16,14,15,16,17, + 17,14,16,16,16,18, 9,11,12,16,16,11,13,13,17,17, + 11,14,13,20,17,15,16,16,19, 0,15,16,17, 0,19,11, + 13,14,17,16,14,15,15,20,18,13,14,15,17,19,16,18, + 18, 0,20,16,16,19,17, 0,12,15,14,17, 0,14,15,15, + 18,19,13,16,15,19,20,15,18,18, 0,20,17, 0,16, 0, + 0, +}; + +static const static_codebook _44u3__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u3__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u3__p3_0, + 0 +}; + +static const long _vq_quantlist__44u3__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u3__p4_0[] = { + 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, + 9, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 7, 8,10,10, 9,10,10,11,12, 9,10,10, + 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, + 10, 9,10, 9,12,11, 9,10,10,12,11, 9,10, 9,12,12, + 9,10,10,13,12, 9,10,10,12,13,12,12,12,14,14,11, + 12,12,13,14, 9, 9,10,12,12, 9,10,10,12,12, 9,10, + 10,12,13,11,12,11,14,13,12,12,12,14,13, 5, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, + 12, 9,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, + 8, 9, 9,11,11,11,11,11,12,13,10,11,11,13,13, 6, + 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,13,11,10,11,11,13,13, 9,11,10,13,12,10,11,11, + 13,13,10,11,11,13,13,12,12,13,12,15,12,13,13,15, + 15, 9,10,10,12,13,10,11,10,13,12,10,11,11,13,14, + 12,13,11,15,13,12,13,13,15,15, 5, 7, 7, 9, 9, 7, + 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12,10,10, + 11,12,12, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, + 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,13, + 11,11,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, + 10,11,12,13,12,13,13,15,15,12,11,13,13,14, 9,10, + 11,12,13,10,11,11,13,13,10,11,11,13,13,12,13,13, + 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, + 13, 9,10,10,13,13,12,13,13,15,14,12,12,12,14,13, + 9,10,10,13,12,10,11,11,13,13,10,11,11,14,12,13, + 13,14,14,16,12,13,13,15,15, 9,10,10,13,13,10,11, + 10,14,13,10,11,11,13,14,12,14,13,15,14,13,13,13, + 15,15,11,13,12,15,14,11,12,13,14,15,12,13,13,16, + 14,14,12,15,12,16,14,15,15,17,15,11,12,12,14,14, + 11,13,11,15,14,12,13,13,15,15,13,15,12,17,13,14, + 15,15,16,16, 8, 9, 9,12,12, 9,10,10,12,13, 9,10, + 10,13,13,12,12,12,14,14,12,13,13,15,15, 9,10,10, + 13,12,10,11,11,14,13,10,10,11,13,14,12,13,13,15, + 15,12,12,13,14,16, 9,10,10,13,13,10,11,11,13,14, + 10,11,11,14,13,12,13,13,14,15,13,14,13,16,14,11, + 12,12,14,14,12,13,13,15,14,11,12,13,14,15,14,15, + 15,16,16,13,13,15,13,16,11,12,12,14,15,12,13,13, + 14,15,11,13,12,15,14,14,15,15,16,16,14,15,12,16, + 13, +}; + +static const static_codebook _44u3__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u3__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u3__p4_0, + 0 +}; + +static const long _vq_quantlist__44u3__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u3__p5_0[] = { + 2, 3, 3, 6, 6, 7, 7, 9, 9, 4, 5, 5, 7, 7, 8, 8, + 10,10, 4, 5, 5, 7, 7, 8, 8,10,10, 6, 7, 7, 8, 8, + 9, 9,11,10, 6, 7, 7, 8, 8, 9, 9,10,10, 7, 8, 8, + 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, + 10,10,11,10,11,11,12,12, 9,10,10,10,10,11,11,12, + 12, +}; + +static const static_codebook _44u3__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u3__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u3__p5_0, + 0 +}; + +static const long _vq_quantlist__44u3__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u3__p6_0[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9,10,11,13,14, 4, 6, 5, + 8, 8, 9, 9,10,10,11,11,14,14, 4, 6, 6, 8, 8, 9, + 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, + 12,12,15,15, 6, 8, 8, 9, 9,10,11,11,11,12,12,15, + 15, 8, 9, 9,11,10,11,11,12,12,13,13,15,16, 8, 9, + 9,10,11,11,11,12,12,13,13,16,16,10,10,11,11,11, + 12,12,13,13,13,14,17,16, 9,10,11,12,11,12,12,13, + 13,13,13,16,18,11,12,11,12,12,13,13,13,14,15,14, + 17,17,11,11,12,12,12,13,13,13,14,14,15,18,17,14, + 15,15,15,15,16,16,17,17,19,18, 0,20,14,15,14,15, + 15,16,16,16,17,18,16,20,18, +}; + +static const static_codebook _44u3__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u3__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u3__p6_0, + 0 +}; + +static const long _vq_quantlist__44u3__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u3__p6_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 5, 5, 6, 6, 6, +}; + +static const static_codebook _44u3__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u3__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u3__p6_1, + 0 +}; + +static const long _vq_quantlist__44u3__p7_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u3__p7_0[] = { + 1, 3, 3,10,10,10,10,10,10, 4,10,10,10,10,10,10, + 10,10, 4,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, +}; + +static const static_codebook _44u3__p7_0 = { + 2, 81, + (long *)_vq_lengthlist__44u3__p7_0, + 1, -515907584, 1627381760, 4, 0, + (long *)_vq_quantlist__44u3__p7_0, + 0 +}; + +static const long _vq_quantlist__44u3__p7_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u3__p7_1[] = { + 1, 4, 4, 6, 6, 7, 6, 8, 7, 9, 8,10, 9,11,11, 4, + 7, 7, 8, 7, 9, 9,10,10,11,11,11,11,12,12, 4, 7, + 7, 7, 7, 9, 9,10,10,11,11,12,12,12,11, 6, 8, 8, + 9, 9,10,10,11,11,12,12,13,12,13,13, 6, 8, 8, 9, + 9,10,11,11,11,12,12,13,14,13,13, 8, 9, 9,11,11, + 12,12,12,13,14,13,14,14,14,15, 8, 9, 9,11,11,11, + 12,13,14,13,14,15,17,14,15, 9,10,10,12,12,13,13, + 13,14,15,15,15,16,16,16, 9,11,11,12,12,13,13,14, + 14,14,15,16,16,16,16,10,12,12,13,13,14,14,15,15, + 15,16,17,17,17,17,10,12,11,13,13,15,14,15,14,16, + 17,16,16,16,16,11,13,12,14,14,14,14,15,16,17,16, + 17,17,17,17,11,13,12,14,14,14,15,17,16,17,17,17, + 17,17,17,12,13,13,15,16,15,16,17,17,16,16,17,17, + 17,17,12,13,13,15,15,15,16,17,17,17,16,17,16,17, + 17, +}; + +static const static_codebook _44u3__p7_1 = { + 2, 225, + (long *)_vq_lengthlist__44u3__p7_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__44u3__p7_1, + 0 +}; + +static const long _vq_quantlist__44u3__p7_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44u3__p7_2[] = { + 2, 5, 5, 7, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 10,10, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, + 9,10, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 10,10,10,10, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, + 9,10,10,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10, 7, 8, 8, 9, 8, 9, 9, 9, 9,10, + 9,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9,10, + 9,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, + 9,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, + 9,10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, 9, + 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,11, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,11, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 9,10,10,10,10,10,10,10,10,10,10,10,11,11,11,10, + 11, +}; + +static const static_codebook _44u3__p7_2 = { + 2, 289, + (long *)_vq_lengthlist__44u3__p7_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44u3__p7_2, + 0 +}; + +static const long _huff_lengthlist__44u3__short[] = { + 14,14,14,15,13,15,12,16,10, 8, 7, 9, 9, 8,12,16, + 10, 5, 4, 6, 5, 6, 9,16,14, 8, 6, 8, 7, 8,10,16, + 14, 7, 4, 6, 3, 5, 8,16,15, 9, 5, 7, 4, 4, 7,16, + 13,10, 6, 7, 4, 3, 4,13,13,12, 7, 9, 5, 5, 6,12, +}; + +static const static_codebook _huff_book__44u3__short = { + 2, 64, + (long *)_huff_lengthlist__44u3__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u4__long[] = { + 3, 8,12,12,13,12,11,13, 5, 4, 6, 7, 8, 8, 9,13, + 9, 5, 4, 5, 5, 7, 9,13, 9, 6, 5, 6, 6, 7, 8,12, + 12, 7, 5, 6, 4, 5, 8,13,11, 7, 6, 6, 5, 5, 6,12, + 10, 8, 8, 7, 7, 5, 3, 8,10,12,13,12,12, 9, 6, 7, +}; + +static const static_codebook _huff_book__44u4__long = { + 2, 64, + (long *)_huff_lengthlist__44u4__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u4__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u4__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, + 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, + 11, 8,11,11, 8,11,11,11,13,14,11,15,14, 8,11,11, + 10,13,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 7, + 11,11,11,15,14,10,12,14, 8,11,11,11,14,14,11,14, + 13, +}; + +static const static_codebook _44u4__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u4__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u4__p1_0, + 0 +}; + +static const long _vq_quantlist__44u4__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u4__p2_0[] = { + 2, 5, 5, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, + 8, 8, 5, 6, 6, 6, 8, 8, 7, 8, 8, 5, 7, 6, 6, 8, + 8, 6, 8, 8, 6, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, + 8,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 6, 8, 8, 6, + 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, + 9, +}; + +static const static_codebook _44u4__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u4__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u4__p2_0, + 0 +}; + +static const long _vq_quantlist__44u4__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u4__p3_0[] = { + 2, 4, 4, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, + 10, 9,12,12, 8, 9,10,12,12, 5, 7, 7,10,10, 7, 9, + 9,11,11, 7, 9, 9,11,11,10,12,11,14,14, 9,10,11, + 13,14, 5, 7, 7,10,10, 7, 9, 9,11,11, 7, 9, 9,11, + 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,14,13, + 10,12,12,15,14, 9,11,11,15,14,13,14,14,17,17,12, + 14,14,16,16, 8,10,10,14,14, 9,11,11,14,15,10,12, + 12,14,15,12,14,13,16,16,13,14,15,15,18, 4, 7, 7, + 10,10, 7, 9, 9,12,11, 7, 9, 9,11,12,10,12,11,15, + 14,10,11,12,14,15, 7, 9, 9,12,12, 9,11,12,13,13, + 9,11,12,13,13,12,13,13,15,16,11,13,13,15,16, 7, + 9, 9,12,12, 9,11,10,13,12, 9,11,12,13,14,11,13, + 12,16,14,12,13,13,15,16,10,12,12,16,15,11,13,13, + 17,16,11,13,13,17,16,14,15,15,17,17,14,16,16,18, + 20, 9,11,11,15,16,11,13,12,16,16,11,13,13,16,17, + 14,15,14,18,16,14,16,16,17,20, 5, 7, 7,10,10, 7, + 9, 9,12,11, 7, 9,10,11,12,10,12,11,15,15,10,12, + 12,14,14, 7, 9, 9,12,12, 9,12,11,14,13, 9,10,11, + 12,13,12,13,14,16,16,11,12,13,14,16, 7, 9, 9,12, + 12, 9,12,11,13,13, 9,12,11,13,13,11,13,13,16,16, + 12,13,13,16,15, 9,11,11,16,14,11,13,13,16,16,11, + 12,13,16,16,14,16,16,17,17,13,14,15,16,17,10,12, + 12,15,15,11,13,13,16,17,11,13,13,16,16,14,16,15, + 19,19,14,15,15,17,18, 8,10,10,14,14,10,12,12,15, + 15,10,12,12,16,16,14,16,15,20,19,13,15,15,17,16, + 9,12,12,16,16,11,13,13,16,18,11,14,13,16,17,16, + 17,16,20, 0,15,16,18,18,20, 9,11,11,15,15,11,14, + 12,17,16,11,13,13,17,17,15,17,15,20,20,14,16,16, + 17, 0,13,15,14,18,16,14,15,16, 0,18,14,16,16, 0, + 0,18,16, 0, 0,20,16,18,18, 0, 0,12,14,14,17,18, + 13,15,14,20,18,14,16,15,19,19,16,20,16, 0,18,16, + 19,17,19, 0, 8,10,10,14,14,10,12,12,16,15,10,12, + 12,16,16,13,15,15,18,17,14,16,16,19, 0, 9,11,11, + 16,15,11,14,13,18,17,11,12,13,17,18,14,17,16,18, + 18,15,16,17,18,18, 9,12,12,16,16,11,13,13,16,18, + 11,14,13,17,17,15,16,16,18,20,16,17,17,20,20,12, + 14,14,18,17,14,16,16, 0,19,13,14,15,18, 0,16, 0, + 0, 0, 0,16,16, 0,19,20,13,15,14, 0, 0,14,16,16, + 18,19,14,16,15, 0,20,16,20,18, 0,20,17,20,17, 0, + 0, +}; + +static const static_codebook _44u4__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u4__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u4__p3_0, + 0 +}; + +static const long _vq_quantlist__44u4__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u4__p4_0[] = { + 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, + 9, 9,11,11, 8, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 7, 8,10,10, 9,10,10,11,12, 9,10,10, + 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, + 10, 9,10,10,12,11, 9,10,10,12,11, 9,10, 9,12,12, + 9,10,10,13,12, 9,10,10,12,12,12,12,12,14,14,11, + 12,12,13,14, 9, 9,10,12,12, 9,10,10,13,13, 9,10, + 10,12,13,11,12,12,14,13,11,12,12,14,14, 5, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, + 12, 9,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, + 8, 9, 9,11,11,11,11,11,12,13,10,11,11,13,13, 6, + 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,13,11,10,11,11,13,13, 9,11,10,13,12,10,11,11, + 13,14,10,11,11,14,13,12,12,13,12,15,12,13,13,15, + 15, 9,10,10,12,13,10,11,10,13,12,10,11,11,13,14, + 12,13,11,15,13,13,13,13,15,15, 5, 7, 7, 9, 9, 7, + 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12,10,10, + 11,12,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, + 11, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,11,13,13, + 11,12,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, + 10,11,12,13,12,13,13,15,15,12,11,13,13,14, 9,10, + 11,12,13,10,11,11,13,14,10,11,11,13,13,12,13,13, + 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, + 13, 9,10,10,13,13,12,13,13,15,15,12,12,12,14,14, + 9,10,10,13,13,10,11,11,13,14,10,11,11,14,13,13, + 13,14,14,16,13,13,13,15,15, 9,10,10,13,13,10,11, + 10,14,13,10,11,11,13,14,12,14,13,16,14,12,13,13, + 14,15,11,12,12,15,14,11,12,13,14,15,12,13,13,16, + 15,14,12,15,12,16,14,15,15,16,16,11,12,12,14,14, + 11,13,12,15,14,12,13,13,15,16,13,15,13,17,13,14, + 15,15,16,17, 8, 9, 9,12,12, 9,10,10,12,13, 9,10, + 10,13,13,12,12,12,14,14,12,13,13,15,15, 9,10,10, + 13,12,10,11,11,14,13,10,10,11,13,14,13,13,13,15, + 15,12,13,14,14,16, 9,10,10,13,13,10,11,11,13,14, + 10,11,11,14,14,13,13,13,15,15,13,14,13,16,14,11, + 12,12,15,14,12,13,13,16,15,11,12,13,14,15,14,15, + 15,17,16,13,13,15,13,16,11,12,13,14,15,13,13,13, + 15,16,11,13,12,15,14,14,15,15,16,16,14,15,12,17, + 13, +}; + +static const static_codebook _44u4__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u4__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u4__p4_0, + 0 +}; + +static const long _vq_quantlist__44u4__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u4__p5_0[] = { + 2, 3, 3, 6, 6, 7, 7, 9, 9, 4, 5, 5, 7, 7, 8, 8, + 10, 9, 4, 5, 5, 7, 7, 8, 8,10,10, 6, 7, 7, 8, 8, + 9, 9,11,10, 6, 7, 7, 8, 8, 9, 9,10,11, 7, 8, 8, + 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, + 10,10,11,10,11,11,12,12, 9,10,10,10,11,11,11,12, + 12, +}; + +static const static_codebook _44u4__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u4__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u4__p5_0, + 0 +}; + +static const long _vq_quantlist__44u4__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u4__p6_0[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9,11,10,13,13, 4, 6, 5, + 8, 8, 9, 9,10,10,11,11,14,14, 4, 6, 6, 8, 8, 9, + 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, + 12,12,15,15, 6, 8, 8, 9, 9,10,11,11,11,12,12,15, + 15, 8, 9, 9,11,10,11,11,12,12,13,13,16,16, 8, 9, + 9,10,10,11,11,12,12,13,13,16,16,10,10,10,12,11, + 12,12,13,13,14,14,16,16,10,10,10,11,12,12,12,13, + 13,13,14,16,17,11,12,11,12,12,13,13,14,14,15,14, + 18,17,11,11,12,12,12,13,13,14,14,14,15,19,18,14, + 15,14,15,15,17,16,17,17,17,17,21, 0,14,15,15,16, + 16,16,16,17,17,18,17,20,21, +}; + +static const static_codebook _44u4__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u4__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u4__p6_0, + 0 +}; + +static const long _vq_quantlist__44u4__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u4__p6_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 5, 5, 6, 6, 6, +}; + +static const static_codebook _44u4__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u4__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u4__p6_1, + 0 +}; + +static const long _vq_quantlist__44u4__p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u4__p7_0[] = { + 1, 3, 3,12,12,12,12,12,12,12,12,12,12, 3,12,11, + 12,12,12,12,12,12,12,12,12,12, 4,11,10,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11, +}; + +static const static_codebook _44u4__p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44u4__p7_0, + 1, -514332672, 1627381760, 4, 0, + (long *)_vq_quantlist__44u4__p7_0, + 0 +}; + +static const long _vq_quantlist__44u4__p7_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u4__p7_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 8,10, 8,10, 9,11,11, 4, + 7, 6, 8, 7, 9, 9,10,10,11,10,11,10,12,10, 4, 6, + 7, 8, 8, 9, 9,10,10,11,11,11,11,12,12, 6, 8, 8, + 10, 9,11,10,12,11,12,12,12,12,13,13, 6, 8, 8,10, + 10,10,11,11,11,12,12,13,12,13,13, 8, 9, 9,11,11, + 12,11,12,12,13,13,13,13,13,13, 8, 9, 9,11,11,11, + 12,12,12,13,13,13,13,13,13, 9,10,10,12,11,13,13, + 13,13,14,13,13,14,14,14, 9,10,11,11,12,12,13,13, + 13,13,13,14,15,14,14,10,11,11,12,12,13,13,14,14, + 14,14,14,15,16,16,10,11,11,12,13,13,13,13,15,14, + 14,15,16,15,16,10,12,12,13,13,14,14,14,15,15,15, + 15,15,15,16,11,12,12,13,13,14,14,14,15,15,15,16, + 15,17,16,11,12,12,13,13,13,15,15,14,16,16,16,16, + 16,17,11,12,12,13,13,14,14,15,14,15,15,17,17,16, + 16, +}; + +static const static_codebook _44u4__p7_1 = { + 2, 225, + (long *)_vq_lengthlist__44u4__p7_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__44u4__p7_1, + 0 +}; + +static const long _vq_quantlist__44u4__p7_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44u4__p7_2[] = { + 2, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 10,10,10,10, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, + 9,10, 9,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,11,10,10,10, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, + 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 9,10, 9,10,10,10,10,10,10,10,10,10,10,11,10,10, + 10, +}; + +static const static_codebook _44u4__p7_2 = { + 2, 289, + (long *)_vq_lengthlist__44u4__p7_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44u4__p7_2, + 0 +}; + +static const long _huff_lengthlist__44u4__short[] = { + 14,17,15,17,16,14,13,16,10, 7, 7,10,13,10,15,16, + 9, 4, 4, 6, 5, 7, 9,16,12, 8, 7, 8, 8, 8,11,16, + 14, 7, 4, 6, 3, 5, 8,15,13, 8, 5, 7, 4, 5, 7,16, + 12, 9, 6, 8, 3, 3, 5,16,14,13, 7,10, 5, 5, 7,15, +}; + +static const static_codebook _huff_book__44u4__short = { + 2, 64, + (long *)_huff_lengthlist__44u4__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u5__long[] = { + 3, 8,13,12,14,12,16,11,13,14, 5, 4, 5, 6, 7, 8, + 10, 9,12,15,10, 5, 5, 5, 6, 8, 9, 9,13,15,10, 5, + 5, 6, 6, 7, 8, 8,11,13,12, 7, 5, 6, 4, 6, 7, 7, + 11,14,11, 7, 7, 6, 6, 6, 7, 6,10,14,14, 9, 8, 8, + 6, 7, 7, 7,11,16,11, 8, 8, 7, 6, 6, 7, 4, 7,12, + 10,10,12,10,10, 9,10, 5, 6, 9,10,12,15,13,14,14, + 14, 8, 7, 8, +}; + +static const static_codebook _huff_book__44u5__long = { + 2, 100, + (long *)_huff_lengthlist__44u5__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u5__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u5__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, + 9,10, 5, 8, 8, 7,10, 9, 8,10,10, 5, 8, 8, 8,10, + 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, + 10,13,11,10,13,13, 4, 8, 8, 8,11,10, 8,10,10, 7, + 10,10,10,13,13,10,11,13, 8,10,11,10,13,13,10,13, + 12, +}; + +static const static_codebook _44u5__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u5__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u5__p1_0, + 0 +}; + +static const long _vq_quantlist__44u5__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u5__p2_0[] = { + 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, + 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, + 8, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 8, 7, + 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, + 8, 7, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, + 9, +}; + +static const static_codebook _44u5__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u5__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u5__p2_0, + 0 +}; + +static const long _vq_quantlist__44u5__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u5__p3_0[] = { + 2, 4, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, + 10, 9,13,12, 8, 9,10,12,12, 5, 7, 7,10,10, 7, 9, + 9,11,11, 6, 8, 9,11,11,10,11,11,14,14, 9,10,11, + 13,14, 5, 7, 7, 9,10, 7, 9, 8,11,11, 7, 9, 9,11, + 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,13,13, + 10,11,11,15,14, 9,11,11,14,14,13,14,14,17,16,12, + 13,13,15,16, 8,10,10,13,13, 9,11,11,14,15,10,11, + 11,14,15,12,14,13,16,16,13,15,14,15,17, 5, 7, 7, + 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14, + 14,10,11,12,14,14, 7, 9, 9,12,11, 9,11,11,13,13, + 9,11,11,13,13,12,13,13,15,16,11,12,13,15,16, 6, + 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,14,11,13, + 12,16,14,11,13,13,16,17,10,12,11,15,15,11,13,13, + 16,16,11,13,13,17,16,14,15,15,17,17,14,16,16,17, + 18, 9,11,11,14,15,10,12,12,15,15,11,13,13,16,17, + 13,15,13,17,15,14,15,16,18, 0, 5, 7, 7,10,10, 7, + 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, + 12,14,15, 6, 9, 9,12,11, 9,11,11,13,13, 8,10,11, + 12,13,11,13,13,16,15,11,12,13,14,15, 7, 9, 9,11, + 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,15,16, + 11,13,13,15,14, 9,11,11,15,14,11,13,13,17,15,10, + 12,12,15,15,14,16,16,17,17,13,13,15,15,17,10,11, + 12,15,15,11,13,13,16,16,11,13,13,15,15,14,15,15, + 18,18,14,15,15,17,17, 8,10,10,13,13,10,12,11,15, + 15,10,11,12,15,15,14,15,15,18,18,13,14,14,18,18, + 9,11,11,15,16,11,13,13,17,17,11,13,13,16,16,15, + 15,16,17, 0,14,15,17, 0, 0, 9,11,11,15,15,10,13, + 12,18,16,11,13,13,15,16,14,16,15,20,20,14,15,16, + 17, 0,13,14,14,20,16,14,15,16,19,18,14,15,15,19, + 0,18,16, 0,20,20,16,18,18, 0, 0,12,14,14,18,18, + 13,15,14,18,16,14,15,16,18,20,16,19,16, 0,17,17, + 18,18,19, 0, 8,10,10,14,14,10,11,11,14,15,10,11, + 12,15,15,13,15,14,19,17,13,15,15,17, 0, 9,11,11, + 16,15,11,13,13,16,16,10,12,13,15,17,14,16,16,18, + 18,14,15,15,18, 0, 9,11,11,15,15,11,13,13,16,17, + 11,13,13,18,17,14,18,16,18,18,15,17,17,18, 0,12, + 14,14,18,18,14,15,15,20, 0,13,14,15,17, 0,16,18, + 17, 0, 0,16,16, 0,17,20,12,14,14,18,18,14,16,15, + 0,18,14,16,15,18, 0,16,19,17, 0, 0,17,18,16, 0, + 0, +}; + +static const static_codebook _44u5__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u5__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u5__p3_0, + 0 +}; + +static const long _vq_quantlist__44u5__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u5__p4_0[] = { + 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, + 9, 9,11,11, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, + 8,10,10, 6, 7, 8, 9,10, 9,10,10,11,12, 9, 9,10, + 11,12, 6, 7, 7, 9, 9, 6, 8, 7,10, 9, 7, 8, 8,10, + 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,12,11, + 9,10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11, + 11,12,13,14, 8, 9, 9,11,12, 9,10,10,12,12, 9,10, + 10,12,12,11,12,11,14,13,11,12,12,13,13, 5, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, + 12, 9,10,10,12,12, 7, 8, 8,10,10, 8, 8, 9,10,11, + 8, 9, 9,11,11,10,10,11,11,13,10,11,11,12,13, 6, + 7, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, + 12,13,10,11,11,13,13,12,11,13,12,15,12,13,13,14, + 15, 9,10,10,12,12, 9,11,10,13,12,10,11,11,13,13, + 11,13,11,14,12,12,13,13,14,15, 5, 7, 7, 9, 9, 7, + 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10, + 10,12,12, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 8, 9, + 10,11,10,11,11,12,12,10,10,11,11,13, 7, 8, 8,10, + 10, 8, 9, 9,11,11, 8, 9, 8,11,10,10,11,11,13,12, + 10,11,10,13,11, 9,10,10,12,12,10,11,11,13,12, 9, + 10,10,12,13,12,13,13,14,15,11,11,13,12,14, 9,10, + 10,12,12,10,11,11,13,13,10,11,10,13,12,12,13,13, + 14,14,12,13,11,14,12, 8, 9, 9,12,12, 9,10,10,12, + 12, 9,10,10,12,12,12,12,12,14,14,11,12,12,14,13, + 9,10,10,12,12,10,11,11,13,13,10,11,11,13,12,12, + 12,13,14,15,12,13,13,15,14, 9,10,10,12,12,10,11, + 10,13,12,10,11,11,12,13,12,13,12,15,13,12,13,13, + 14,15,11,12,12,14,13,11,12,12,14,15,12,13,13,15, + 14,13,12,14,12,16,13,14,14,15,15,11,11,12,14,14, + 11,12,11,14,13,12,13,13,14,15,13,14,12,16,12,14, + 14,15,16,16, 8, 9, 9,11,12, 9,10,10,12,12, 9,10, + 10,12,13,11,12,12,13,13,12,12,13,14,14, 9,10,10, + 12,12,10,11,10,13,12,10,10,11,12,13,12,13,13,15, + 14,12,12,13,13,15, 9,10,10,12,13,10,11,11,12,13, + 10,11,11,13,13,12,13,13,14,15,12,13,12,15,14,11, + 12,11,14,13,12,13,13,15,14,11,11,12,13,14,14,15, + 14,16,15,13,12,14,13,16,11,12,12,13,14,12,13,13, + 14,15,11,12,11,14,14,14,14,14,15,16,13,15,12,16, + 12, +}; + +static const static_codebook _44u5__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u5__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u5__p4_0, + 0 +}; + +static const long _vq_quantlist__44u5__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u5__p5_0[] = { + 2, 3, 3, 6, 6, 8, 8,10,10, 4, 5, 5, 8, 7, 8, 8, + 11,10, 3, 5, 5, 7, 8, 8, 8,10,11, 6, 8, 7,10, 9, + 10,10,11,11, 6, 7, 8, 9, 9, 9,10,11,12, 8, 8, 8, + 10,10,11,11,13,12, 8, 8, 9, 9,10,11,11,12,13,10, + 11,10,12,11,13,12,14,14,10,10,11,11,12,12,13,14, + 14, +}; + +static const static_codebook _44u5__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u5__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u5__p5_0, + 0 +}; + +static const long _vq_quantlist__44u5__p6_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u5__p6_0[] = { + 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, + 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, + 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 7, 7, + 8, 8, 9, 9,11,10, 7, 7, 7, 8, 8, 9, 9,10,11, 9, + 9, 9,10,10,11,10,11,11, 9, 9, 9,10,10,11,10,11, + 11, +}; + +static const static_codebook _44u5__p6_0 = { + 2, 81, + (long *)_vq_lengthlist__44u5__p6_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u5__p6_0, + 0 +}; + +static const long _vq_quantlist__44u5__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u5__p7_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 9, 8,11,10, 7, + 11,10, 5, 9, 9, 7,10,10, 8,10,11, 4, 9, 9, 9,12, + 12, 9,12,12, 8,12,12,11,12,12,10,12,13, 7,12,12, + 11,12,12,10,12,13, 4, 9, 9, 9,12,12, 9,12,12, 7, + 12,11,10,13,13,11,12,12, 7,12,12,10,13,13,11,12, + 12, +}; + +static const static_codebook _44u5__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44u5__p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44u5__p7_0, + 0 +}; + +static const long _vq_quantlist__44u5__p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u5__p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 7, + 8, 8, 9, 8, 8, 9, 4, 5, 5, 7, 7, 8, 8, 9, 9, 8, + 9, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 6, 7, 7, 8, + 8, 9, 9, 9, 9, 9, 9, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, + 9, 9, 9, 9,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, + 10,10,10, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, 8, 9, + 9, 9, 9, 9, 9,10,10,10,10, +}; + +static const static_codebook _44u5__p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44u5__p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u5__p7_1, + 0 +}; + +static const long _vq_quantlist__44u5__p8_0[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u5__p8_0[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, + 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, 9,10,10,11, + 11, 6, 8, 7, 9, 9,10,10,11,11,13,12, 6, 8, 8, 9, + 9,10,10,11,11,12,13, 8, 9, 9,10,10,12,12,13,12, + 14,13, 8, 9, 9,10,10,12,12,13,13,14,14, 9,11,11, + 12,12,13,13,14,14,15,14, 9,11,11,12,12,13,13,14, + 14,15,14,11,12,12,13,13,14,14,15,14,15,14,11,11, + 12,13,13,14,14,14,14,15,15, +}; + +static const static_codebook _44u5__p8_0 = { + 2, 121, + (long *)_vq_lengthlist__44u5__p8_0, + 1, -524582912, 1618345984, 4, 0, + (long *)_vq_quantlist__44u5__p8_0, + 0 +}; + +static const long _vq_quantlist__44u5__p8_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u5__p8_1[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 5, 7, 6, + 7, 7, 8, 8, 8, 8, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8, 6, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44u5__p8_1 = { + 2, 121, + (long *)_vq_lengthlist__44u5__p8_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u5__p8_1, + 0 +}; + +static const long _vq_quantlist__44u5__p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u5__p9_0[] = { + 1, 3, 2,12,10,13,13,13,13,13,13,13,13, 4, 9, 9, + 13,13,13,13,13,13,13,13,13,13, 5,10, 9,13,13,13, + 13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13, + 13,13,13,13,11,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12, +}; + +static const static_codebook _44u5__p9_0 = { + 2, 169, + (long *)_vq_lengthlist__44u5__p9_0, + 1, -514332672, 1627381760, 4, 0, + (long *)_vq_quantlist__44u5__p9_0, + 0 +}; + +static const long _vq_quantlist__44u5__p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u5__p9_1[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 7, 8, 7, 9, 8, 9, 9, 4, + 7, 6, 9, 8,10,10, 9, 8, 9, 9, 9, 9, 9, 8, 5, 6, + 6, 8, 9,10,10, 9, 9, 9,10,10,10,10,11, 7, 8, 8, + 10,10,11,11,10,10,11,11,11,12,11,11, 7, 8, 8,10, + 10,11,11,10,10,11,11,12,11,11,11, 8, 9, 9,11,11, + 12,12,11,11,12,11,12,12,12,12, 8, 9,10,11,11,12, + 12,11,11,12,12,12,12,12,12, 8, 9, 9,10,10,12,11, + 12,12,12,12,12,12,12,13, 8, 9, 9,11,11,11,11,12, + 12,12,12,13,12,13,13, 9,10,10,11,11,12,12,12,13, + 12,13,13,13,14,13, 9,10,10,11,11,12,12,12,13,13, + 12,13,13,14,13, 9,11,10,12,11,13,12,12,13,13,13, + 13,13,13,14, 9,10,10,12,12,12,12,12,13,13,13,13, + 13,14,14,10,11,11,12,12,12,13,13,13,14,14,13,14, + 14,14,10,11,11,12,12,12,12,13,12,13,14,13,14,14, + 14, +}; + +static const static_codebook _44u5__p9_1 = { + 2, 225, + (long *)_vq_lengthlist__44u5__p9_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__44u5__p9_1, + 0 +}; + +static const long _vq_quantlist__44u5__p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44u5__p9_2[] = { + 2, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9,10, 9,10,10,10, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, + 9, 9,10, 9,10, 9,10, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10, 9,10,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, + 9,10, 9,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, 9, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, + 9,10, 9,10, 9,10,10,10,10,10,10, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, + 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 9,10,10, 9,10,10,10,10,10,10,10,10,10,10, 9, 9, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 9, 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _44u5__p9_2 = { + 2, 289, + (long *)_vq_lengthlist__44u5__p9_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44u5__p9_2, + 0 +}; + +static const long _huff_lengthlist__44u5__short[] = { + 4,10,17,13,17,13,17,17,17,17, 3, 6, 8, 9,11, 9, + 15,12,16,17, 6, 5, 5, 7, 7, 8,10,11,17,17, 7, 8, + 7, 9, 9,10,13,13,17,17, 8, 6, 5, 7, 4, 7, 5, 8, + 14,17, 9, 9, 8, 9, 7, 9, 8,10,16,17,12,10, 7, 8, + 4, 7, 4, 7,16,17,12,11, 9,10, 6, 9, 5, 7,14,17, + 14,13,10,15, 4, 8, 3, 5,14,17,17,14,11,15, 6,10, + 6, 8,15,17, +}; + +static const static_codebook _huff_book__44u5__short = { + 2, 100, + (long *)_huff_lengthlist__44u5__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u6__long[] = { + 3, 9,14,13,14,13,16,12,13,14, 5, 4, 6, 6, 8, 9, + 11,10,12,15,10, 5, 5, 6, 6, 8,10,10,13,16,10, 6, + 6, 6, 6, 8, 9, 9,12,14,13, 7, 6, 6, 4, 6, 6, 7, + 11,14,10, 7, 7, 7, 6, 6, 6, 7,10,13,15,10, 9, 8, + 5, 6, 5, 6,10,14,10, 9, 8, 8, 6, 6, 5, 4, 6,11, + 11,11,12,11,10, 9, 9, 5, 5, 9,10,12,15,13,13,13, + 13, 8, 7, 7, +}; + +static const static_codebook _huff_book__44u6__long = { + 2, 100, + (long *)_huff_lengthlist__44u6__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u6__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u6__p1_0[] = { + 1, 4, 4, 4, 8, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, + 9,10, 5, 8, 8, 7,10, 9, 8,10,10, 5, 8, 8, 8,10, + 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, + 10,13,11,10,13,13, 5, 8, 8, 8,11,10, 8,10,10, 7, + 10,10,10,13,13,10,11,13, 8,10,11,10,13,13,10,13, + 12, +}; + +static const static_codebook _44u6__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u6__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u6__p1_0, + 0 +}; + +static const long _vq_quantlist__44u6__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u6__p2_0[] = { + 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, + 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, + 8, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 7, 7, + 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, + 8, 8, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, + 9, +}; + +static const static_codebook _44u6__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u6__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u6__p2_0, + 0 +}; + +static const long _vq_quantlist__44u6__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u6__p3_0[] = { + 2, 5, 4, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, + 9, 9,13,12, 8, 9,10,12,13, 5, 7, 7,10, 9, 7, 9, + 9,11,11, 7, 8, 9,11,11,10,11,11,14,14, 9,10,11, + 13,14, 5, 7, 7, 9,10, 6, 9, 8,11,11, 7, 9, 9,11, + 11, 9,11,10,14,13,10,11,11,14,13, 8,10,10,13,13, + 10,11,11,15,15, 9,11,11,14,14,13,14,14,17,16,12, + 13,14,16,16, 8,10,10,13,14, 9,11,11,14,15,10,11, + 12,14,15,12,14,13,16,15,13,14,14,15,17, 5, 7, 7, + 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,12,11,14, + 14,10,11,11,14,14, 7, 9, 9,12,11, 9,11,11,13,13, + 9,11,11,13,13,11,13,13,14,15,11,12,13,15,16, 6, + 9, 9,11,12, 8,11,10,13,12, 9,11,11,13,14,11,13, + 12,16,14,11,13,13,15,16,10,12,11,14,15,11,13,13, + 15,17,11,13,13,17,16,15,15,16,17,16,14,15,16,18, + 0, 9,11,11,14,15,10,12,12,16,15,11,13,13,16,16, + 13,15,14,18,15,14,16,16, 0, 0, 5, 7, 7,10,10, 7, + 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, + 12,14,14, 6, 9, 9,11,11, 9,11,11,13,13, 8,10,11, + 12,13,11,13,13,16,15,11,12,13,14,16, 7, 9, 9,11, + 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,16,15, + 11,13,12,15,15, 9,11,11,15,14,11,13,13,17,16,10, + 12,13,15,16,14,16,16, 0,18,14,14,15,15,17,10,11, + 12,15,15,11,13,13,16,16,11,13,13,16,16,14,16,16, + 19,17,14,15,15,17,17, 8,10,10,14,14,10,12,11,15, + 15,10,11,12,16,15,14,15,15,18,20,13,14,16,17,18, + 9,11,11,15,16,11,13,13,17,17,11,13,13,17,16,15, + 16,16, 0, 0,15,16,16, 0, 0, 9,11,11,15,15,10,13, + 12,17,15,11,13,13,17,16,15,17,15,20,19,15,16,16, + 19, 0,13,15,14, 0,17,14,15,16, 0,20,15,16,16, 0, + 19,17,18, 0, 0, 0,16,17,18, 0, 0,12,14,14,19,18, + 13,15,14, 0,17,14,15,16,19,19,16,18,16, 0,19,19, + 20,17,20, 0, 8,10,10,13,14,10,11,11,15,15,10,12, + 12,15,16,14,15,14,19,16,14,15,15, 0,18, 9,11,11, + 16,15,11,13,13, 0,16,11,12,13,16,17,14,16,17, 0, + 19,15,16,16,18, 0, 9,11,11,15,16,11,13,13,16,16, + 11,14,13,18,17,15,16,16,18,20,15,17,19, 0, 0,12, + 14,14,17,17,14,16,15, 0, 0,13,14,15,19, 0,16,18, + 20, 0, 0,16,16,18,18, 0,12,14,14,17,20,14,16,16, + 19, 0,14,16,14, 0,20,16,20,17, 0, 0,17, 0,15, 0, + 19, +}; + +static const static_codebook _44u6__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u6__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u6__p3_0, + 0 +}; + +static const long _vq_quantlist__44u6__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u6__p4_0[] = { + 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, + 9, 9,11,11, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 7, 8, 9,10, 9,10,10,11,11, 9, 9,10, + 11,12, 6, 7, 7, 9, 9, 7, 8, 7,10, 9, 7, 8, 8,10, + 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,11,11, + 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,13,11, + 11,12,13,13, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, + 10,12,12,11,12,11,13,12,11,12,12,13,13, 5, 7, 7, + 9, 9, 7, 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12, + 11, 9,10,10,11,12, 7, 8, 8,10,10, 8, 8, 9,11,11, + 8, 9, 9,11,11,10,10,11,12,13,10,10,11,12,12, 6, + 7, 7,10,10, 7, 9, 8,11,10, 8, 8, 9,10,11,10,11, + 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, + 13,13,10,11,11,12,13,12,12,12,13,14,12,12,13,14, + 14, 9,10,10,12,12, 9,10,10,13,12,10,11,11,13,13, + 11,12,11,14,12,12,13,13,14,14, 6, 7, 7, 9, 9, 7, + 8, 7,10,10, 7, 8, 8,10,10, 9,10,10,12,11, 9,10, + 10,11,12, 6, 7, 7,10,10, 8, 9, 8,11,10, 7, 8, 9, + 10,11,10,11,11,12,12,10,10,11,11,13, 7, 8, 8,10, + 10, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,10,13,12, + 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,12, 9, + 10,10,12,13,12,13,12,14,14,11,11,12,12,14, 9,10, + 10,12,12,10,11,11,13,13,10,11,10,13,12,12,12,12, + 14,14,12,13,12,14,13, 8, 9, 9,11,11, 9,10,10,12, + 12, 9,10,10,12,12,11,12,12,14,13,11,12,12,13,14, + 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, + 12,13,14,15,12,12,13,14,14, 9,10,10,12,12, 9,11, + 10,13,12,10,10,11,12,13,12,13,12,14,13,12,12,13, + 14,15,11,12,12,14,13,11,12,12,14,14,12,13,13,14, + 14,13,13,14,14,16,13,14,14,15,15,11,12,11,13,13, + 11,12,11,14,13,12,12,13,14,15,12,14,12,15,12,13, + 14,15,15,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, + 10,12,12,11,12,12,14,13,11,12,12,13,13, 9,10,10, + 12,12,10,11,10,13,12, 9,10,11,12,13,12,13,12,14, + 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,13,13, + 10,11,11,13,13,12,13,12,14,14,12,13,13,14,14,11, + 11,11,13,13,12,13,12,14,14,11,11,12,13,14,14,14, + 14,16,15,12,12,14,12,15,11,12,12,13,14,12,13,13, + 14,15,11,12,12,14,14,13,14,14,16,16,13,14,13,16, + 13, +}; + +static const static_codebook _44u6__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u6__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u6__p4_0, + 0 +}; + +static const long _vq_quantlist__44u6__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u6__p5_0[] = { + 2, 3, 3, 6, 6, 8, 8,10,10, 4, 5, 5, 8, 7, 8, 8, + 11,11, 3, 5, 5, 7, 8, 8, 8,11,11, 6, 8, 7, 9, 9, + 10, 9,12,11, 6, 7, 8, 9, 9, 9,10,11,12, 8, 8, 8, + 10, 9,12,11,13,13, 8, 8, 9, 9,10,11,12,13,13,10, + 11,11,12,12,13,13,14,14,10,10,11,11,12,13,13,14, + 14, +}; + +static const static_codebook _44u6__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u6__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u6__p5_0, + 0 +}; + +static const long _vq_quantlist__44u6__p6_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u6__p6_0[] = { + 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, + 9, 9, 4, 4, 5, 6, 6, 7, 8, 9, 9, 5, 6, 6, 7, 7, + 8, 8,10,10, 5, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, + 8, 8,10, 9,11,11, 7, 7, 8, 8, 8, 9,10,10,11, 9, + 9, 9,10,10,11,11,12,11, 9, 9, 9,10,10,11,11,11, + 12, +}; + +static const static_codebook _44u6__p6_0 = { + 2, 81, + (long *)_vq_lengthlist__44u6__p6_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u6__p6_0, + 0 +}; + +static const long _vq_quantlist__44u6__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u6__p7_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 8, 7,10,10, 8, + 10,10, 5, 8, 9, 7,10,10, 7,10, 9, 4, 8, 8, 9,11, + 11, 8,11,11, 7,11,11,10,10,13,10,13,13, 7,11,11, + 10,13,12,10,13,13, 5, 9, 8, 8,11,11, 9,11,11, 7, + 11,11,10,13,13,10,12,13, 7,11,11,10,13,13, 9,13, + 10, +}; + +static const static_codebook _44u6__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44u6__p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44u6__p7_0, + 0 +}; + +static const long _vq_quantlist__44u6__p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u6__p7_1[] = { + 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 6, + 8, 8, 8, 8, 8, 8, 4, 5, 5, 6, 7, 8, 8, 8, 8, 8, + 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, + 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, +}; + +static const static_codebook _44u6__p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44u6__p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u6__p7_1, + 0 +}; + +static const long _vq_quantlist__44u6__p8_0[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u6__p8_0[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, + 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, 9,10,10,11, + 11, 6, 8, 8, 9, 9,10,10,11,11,12,12, 6, 8, 8, 9, + 9,10,10,11,11,12,12, 8, 9, 9,10,10,11,11,12,12, + 13,13, 8, 9, 9,10,10,11,11,12,12,13,13,10,10,10, + 11,11,13,13,13,13,15,14, 9,10,10,12,11,12,13,13, + 13,14,15,11,12,12,13,13,13,13,15,14,15,15,11,11, + 12,13,13,14,14,14,15,15,15, +}; + +static const static_codebook _44u6__p8_0 = { + 2, 121, + (long *)_vq_lengthlist__44u6__p8_0, + 1, -524582912, 1618345984, 4, 0, + (long *)_vq_quantlist__44u6__p8_0, + 0 +}; + +static const long _vq_quantlist__44u6__p8_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u6__p8_1[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 5, 7, 7, + 7, 7, 8, 7, 8, 8, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, + 8, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 6, 6, 7, 7, + 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44u6__p8_1 = { + 2, 121, + (long *)_vq_lengthlist__44u6__p8_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u6__p8_1, + 0 +}; + +static const long _vq_quantlist__44u6__p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u6__p9_0[] = { + 1, 3, 2, 9, 8,15,15,15,15,15,15,15,15,15,15, 4, + 8, 9,13,14,14,14,14,14,14,14,14,14,14,14, 5, 8, + 9,14,14,14,14,14,14,14,14,14,14,14,14,11,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,11,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14, +}; + +static const static_codebook _44u6__p9_0 = { + 2, 225, + (long *)_vq_lengthlist__44u6__p9_0, + 1, -514071552, 1627381760, 4, 0, + (long *)_vq_quantlist__44u6__p9_0, + 0 +}; + +static const long _vq_quantlist__44u6__p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u6__p9_1[] = { + 1, 4, 4, 7, 7, 8, 9, 8, 8, 9, 8, 9, 8, 9, 9, 4, + 7, 6, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 7, + 6, 9, 9,10,10, 9, 9,10,10,10,10,11,11, 7, 9, 8, + 10,10,11,11,10,10,11,11,11,11,11,11, 7, 8, 9,10, + 10,11,11,10,10,11,11,11,11,11,12, 8,10,10,11,11, + 12,12,11,11,12,12,12,12,13,12, 8,10,10,11,11,12, + 11,11,11,11,12,12,12,12,13, 8, 9, 9,11,10,11,11, + 12,12,12,12,13,12,13,12, 8, 9, 9,11,11,11,11,12, + 12,12,12,12,13,13,13, 9,10,10,11,12,12,12,12,12, + 13,13,13,13,13,13, 9,10,10,11,11,12,12,12,12,13, + 13,13,13,14,13,10,10,10,12,11,12,12,13,13,13,13, + 13,13,13,13,10,10,11,11,11,12,12,13,13,13,13,13, + 13,13,13,10,11,11,12,12,13,12,12,13,13,13,13,13, + 13,14,10,11,11,12,12,13,12,13,13,13,14,13,13,14, + 13, +}; + +static const static_codebook _44u6__p9_1 = { + 2, 225, + (long *)_vq_lengthlist__44u6__p9_1, + 1, -522338304, 1620115456, 4, 0, + (long *)_vq_quantlist__44u6__p9_1, + 0 +}; + +static const long _vq_quantlist__44u6__p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44u6__p9_2[] = { + 3, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 9, + 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10, 9, 9,10, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,10, 9,10,10, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10,10, 9, 9, + 10, +}; + +static const static_codebook _44u6__p9_2 = { + 2, 289, + (long *)_vq_lengthlist__44u6__p9_2, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44u6__p9_2, + 0 +}; + +static const long _huff_lengthlist__44u6__short[] = { + 4,11,16,13,17,13,17,16,17,17, 4, 7, 9, 9,13,10, + 16,12,16,17, 7, 6, 5, 7, 8, 9,12,12,16,17, 6, 9, + 7, 9,10,10,15,15,17,17, 6, 7, 5, 7, 5, 7, 7,10, + 16,17, 7, 9, 8, 9, 8,10,11,11,15,17, 7, 7, 7, 8, + 5, 8, 8, 9,15,17, 8, 7, 9, 9, 7, 8, 7, 2, 7,15, + 14,13,13,15, 5,10, 4, 3, 6,17,17,15,13,17, 7,11, + 7, 6, 9,16, +}; + +static const static_codebook _huff_book__44u6__short = { + 2, 100, + (long *)_huff_lengthlist__44u6__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u7__long[] = { + 3, 9,14,13,15,14,16,13,13,14, 5, 5, 7, 7, 8, 9, + 11,10,12,15,10, 6, 5, 6, 6, 9,10,10,13,16,10, 6, + 6, 6, 6, 8, 9, 9,12,15,14, 7, 6, 6, 5, 6, 6, 8, + 12,15,10, 8, 7, 7, 6, 7, 7, 7,11,13,14,10, 9, 8, + 5, 6, 4, 5, 9,12,10, 9, 9, 8, 6, 6, 5, 3, 6,11, + 12,11,12,12,10, 9, 8, 5, 5, 8,10,11,15,13,13,13, + 12, 8, 6, 7, +}; + +static const static_codebook _huff_book__44u7__long = { + 2, 100, + (long *)_huff_lengthlist__44u7__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u7__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u7__p1_0[] = { + 1, 4, 4, 4, 7, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, + 10,10, 5, 8, 8, 7,10,10, 8,10,10, 5, 8, 8, 8,11, + 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, + 10,13,12,10,13,13, 5, 8, 8, 8,11,10, 8,10,11, 7, + 10,10,10,13,13,10,12,13, 8,11,11,10,13,13,10,13, + 12, +}; + +static const static_codebook _44u7__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u7__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u7__p1_0, + 0 +}; + +static const long _vq_quantlist__44u7__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u7__p2_0[] = { + 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, + 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, + 7, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 8, 7, + 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, + 8, 8, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, + 9, +}; + +static const static_codebook _44u7__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44u7__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u7__p2_0, + 0 +}; + +static const long _vq_quantlist__44u7__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u7__p3_0[] = { + 2, 5, 4, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, + 9, 9,13,12, 8, 9,10,12,13, 5, 7, 7,10, 9, 7, 9, + 9,11,11, 6, 8, 9,11,11,10,11,11,14,14, 9,10,11, + 13,14, 5, 7, 7, 9, 9, 7, 9, 8,11,11, 7, 9, 9,11, + 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,14,13, + 10,11,12,15,14, 9,11,11,15,14,13,14,14,16,16,12, + 13,14,17,16, 8,10,10,13,13, 9,11,11,14,15,10,11, + 12,14,15,12,14,13,16,16,13,14,15,15,17, 5, 7, 7, + 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,12,11,15, + 14,10,11,12,14,14, 7, 9, 9,12,12, 9,11,11,13,13, + 9,11,11,13,13,11,13,13,14,17,11,13,13,15,16, 6, + 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,13,11,13, + 12,16,14,11,13,13,16,16,10,12,12,15,15,11,13,13, + 16,16,11,13,13,16,15,14,16,17,17,19,14,16,16,18, + 0, 9,11,11,14,15,10,13,12,16,15,11,13,13,16,16, + 14,15,14, 0,16,14,16,16,18, 0, 5, 7, 7,10,10, 7, + 9, 9,12,11, 7, 9, 9,11,12,10,11,11,15,14,10,11, + 12,14,14, 6, 9, 9,11,11, 9,11,11,13,13, 8,10,11, + 12,13,11,13,13,17,15,11,12,13,14,15, 7, 9, 9,11, + 12, 9,11,11,13,13, 9,11,11,13,13,11,13,12,16,16, + 11,13,13,15,14, 9,11,11,14,15,11,13,13,16,15,10, + 12,13,16,16,15,16,16, 0, 0,14,13,15,16,18,10,11, + 11,15,15,11,13,14,16,18,11,13,13,16,15,15,16,16, + 19, 0,14,15,15,16,16, 8,10,10,13,13,10,12,11,16, + 15,10,11,11,16,15,13,15,16,18, 0,13,14,15,17,17, + 9,11,11,15,15,11,13,13,16,18,11,13,13,16,17,15, + 16,16, 0, 0,15,18,16, 0,17, 9,11,11,15,15,11,13, + 12,17,15,11,13,14,16,17,15,18,15, 0,17,15,16,16, + 18,19,13,15,14, 0,18,14,16,16,19,18,14,16,15,19, + 19,16,18,19, 0, 0,16,17, 0, 0, 0,12,14,14,17,17, + 13,16,14, 0,18,14,16,15,18, 0,16,18,16,19,17,18, + 19,17, 0, 0, 8,10,10,14,14, 9,12,11,15,15,10,11, + 12,15,17,13,15,15,18,16,14,16,15,18,17, 9,11,11, + 16,15,11,13,13, 0,16,11,12,13,16,15,15,16,16, 0, + 17,15,15,16,18,17, 9,12,11,15,17,11,13,13,16,16, + 11,14,13,16,16,15,15,16,18,19,16,18,16, 0, 0,12, + 14,14, 0,16,14,16,16, 0,18,13,14,15,16, 0,17,16, + 18, 0, 0,16,16,17,19, 0,13,14,14,17, 0,14,17,16, + 0,19,14,15,15,18,19,17,16,18, 0, 0,15,19,16, 0, + 0, +}; + +static const static_codebook _44u7__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44u7__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u7__p3_0, + 0 +}; + +static const long _vq_quantlist__44u7__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u7__p4_0[] = { + 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, + 9, 9,11,11, 8, 9, 9,10,11, 6, 7, 7, 9, 9, 7, 8, + 8,10,10, 6, 7, 8, 9,10, 9,10,10,12,12, 9, 9,10, + 11,12, 6, 7, 7, 9, 9, 6, 8, 7,10, 9, 7, 8, 8,10, + 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,11,11, + 9,10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11, + 11,12,13,13, 8, 9, 9,11,11, 9,10,10,12,11, 9,10, + 10,12,12,11,12,11,13,13,11,12,12,13,13, 6, 7, 7, + 9, 9, 7, 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12, + 11, 9,10,10,12,12, 7, 8, 8,10,10, 8, 8, 9,11,11, + 8, 9, 9,11,11,10,11,11,12,12,10,10,11,12,13, 6, + 7, 7,10,10, 7, 9, 8,11,10, 8, 8, 9,10,11,10,11, + 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, + 13,13,10,11,11,13,12,12,12,13,13,14,12,12,13,14, + 14, 9,10,10,12,12, 9,10,10,12,12,10,11,11,13,13, + 11,12,11,14,12,12,13,13,14,14, 6, 7, 7, 9, 9, 7, + 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12,11, 9,10, + 10,11,12, 6, 7, 7,10,10, 8, 9, 8,11,10, 7, 8, 9, + 10,11,10,11,11,13,12,10,10,11,11,13, 7, 8, 8,10, + 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,10,13,12, + 10,11,11,12,12, 9,10,10,12,12,10,11,11,13,12, 9, + 10,10,12,13,12,13,12,14,14,11,11,12,12,14, 9,10, + 10,12,12,10,11,11,13,13,10,11,11,13,13,12,13,12, + 14,14,12,13,12,14,13, 8, 9, 9,11,11, 9,10,10,12, + 12, 9,10,10,12,12,11,12,12,14,13,11,12,12,13,13, + 9,10,10,12,12,10,11,11,13,13,10,11,11,13,12,12, + 13,13,14,14,12,12,13,14,14, 9,10,10,12,12, 9,11, + 10,13,12,10,10,11,12,13,11,13,12,14,13,12,12,13, + 14,14,11,12,12,13,13,11,12,13,14,14,12,13,13,14, + 14,13,13,14,14,16,13,14,14,16,16,11,11,11,13,13, + 11,12,11,14,13,12,12,13,14,15,13,14,12,16,13,14, + 14,14,15,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, + 10,12,12,11,12,12,14,13,11,12,12,13,14, 9,10,10, + 12,12,10,11,10,13,12, 9,10,11,12,13,12,13,12,14, + 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,12,13, + 10,11,11,13,13,12,13,12,14,14,12,13,13,14,14,11, + 12,12,13,13,12,13,12,14,14,11,11,12,13,14,13,15, + 14,16,15,13,12,14,13,16,11,12,12,13,13,12,13,13, + 14,14,12,12,12,14,14,13,14,14,15,15,13,14,13,16, + 14, +}; + +static const static_codebook _44u7__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44u7__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u7__p4_0, + 0 +}; + +static const long _vq_quantlist__44u7__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u7__p5_0[] = { + 2, 3, 3, 6, 6, 7, 8,10,10, 4, 5, 5, 8, 7, 8, 8, + 11,11, 3, 5, 5, 7, 7, 8, 9,11,11, 6, 8, 7, 9, 9, + 10,10,12,12, 6, 7, 8, 9,10,10,10,12,12, 8, 8, 8, + 10,10,12,11,13,13, 8, 8, 9,10,10,11,11,13,13,10, + 11,11,12,12,13,13,14,14,10,11,11,12,12,13,13,14, + 14, +}; + +static const static_codebook _44u7__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44u7__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u7__p5_0, + 0 +}; + +static const long _vq_quantlist__44u7__p6_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u7__p6_0[] = { + 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 8, 7, + 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, + 8, 8,10,10, 5, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, + 8, 8,10, 9,11,11, 7, 7, 8, 8, 8, 9,10,11,11, 9, + 9, 9,10,10,11,10,12,11, 9, 9, 9,10,10,11,11,11, + 12, +}; + +static const static_codebook _44u7__p6_0 = { + 2, 81, + (long *)_vq_lengthlist__44u7__p6_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u7__p6_0, + 0 +}; + +static const long _vq_quantlist__44u7__p7_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u7__p7_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 8, 8, 9, 9, 7, + 10,10, 5, 8, 9, 7, 9,10, 8, 9, 9, 4, 9, 9, 9,11, + 10, 8,10,10, 7,11,10,10,10,12,10,12,12, 7,10,10, + 10,12,11,10,12,12, 5, 9, 9, 8,10,10, 9,11,11, 7, + 11,10,10,12,12,10,11,12, 7,10,11,10,12,12,10,12, + 10, +}; + +static const static_codebook _44u7__p7_0 = { + 4, 81, + (long *)_vq_lengthlist__44u7__p7_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44u7__p7_0, + 0 +}; + +static const long _vq_quantlist__44u7__p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u7__p7_1[] = { + 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 6, 6, + 8, 7, 8, 8, 8, 8, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8, + 8, 6, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 6, 6, 7, 7, + 7, 8, 8, 9, 9, 9, 9, 7, 8, 7, 8, 8, 9, 9, 9, 9, + 9, 9, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, + 9, 9, 9, 9,10, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9,10, 8, 8, 8, 9, 9, 9, 9,10, 9,10,10, 8, 8, + 8, 9, 9, 9, 9, 9,10,10,10, +}; + +static const static_codebook _44u7__p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44u7__p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u7__p7_1, + 0 +}; + +static const long _vq_quantlist__44u7__p8_0[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u7__p8_0[] = { + 1, 4, 4, 6, 6, 8, 8,10,10,11,11, 4, 6, 6, 7, 7, + 9, 9,11,10,12,12, 5, 6, 5, 7, 7, 9, 9,10,11,12, + 12, 6, 7, 7, 8, 8,10,10,11,11,13,13, 6, 7, 7, 8, + 8,10,10,11,12,13,13, 8, 9, 9,10,10,11,11,12,12, + 14,14, 8, 9, 9,10,10,11,11,12,12,14,14,10,10,10, + 11,11,13,12,14,14,15,15,10,10,10,12,12,13,13,14, + 14,15,15,11,12,12,13,13,14,14,15,14,16,15,11,12, + 12,13,13,14,14,15,15,15,16, +}; + +static const static_codebook _44u7__p8_0 = { + 2, 121, + (long *)_vq_lengthlist__44u7__p8_0, + 1, -524582912, 1618345984, 4, 0, + (long *)_vq_quantlist__44u7__p8_0, + 0 +}; + +static const long _vq_quantlist__44u7__p8_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u7__p8_1[] = { + 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 7, 7, 7, 7, 7, 8, 7, 8, 8, + 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 7, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, + 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44u7__p8_1 = { + 2, 121, + (long *)_vq_lengthlist__44u7__p8_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u7__p8_1, + 0 +}; + +static const long _vq_quantlist__44u7__p9_0[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u7__p9_0[] = { + 1, 3, 3,10,10,10,10,10,10,10,10, 4,10,10,10,10, + 10,10,10,10,10,10, 4,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, +}; + +static const static_codebook _44u7__p9_0 = { + 2, 121, + (long *)_vq_lengthlist__44u7__p9_0, + 1, -512171520, 1630791680, 4, 0, + (long *)_vq_quantlist__44u7__p9_0, + 0 +}; + +static const long _vq_quantlist__44u7__p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u7__p9_1[] = { + 1, 4, 4, 6, 5, 8, 6, 9, 8,10, 9,11,10, 4, 6, 6, + 8, 8, 9, 9,11,10,11,11,11,11, 4, 6, 6, 8, 8,10, + 9,11,11,11,11,11,12, 6, 8, 8,10,10,11,11,12,12, + 13,12,13,13, 6, 8, 8,10,10,11,11,12,12,12,13,14, + 13, 8,10,10,11,11,12,13,14,14,14,14,15,15, 8,10, + 10,11,12,12,13,13,14,14,14,14,15, 9,11,11,13,13, + 14,14,15,14,16,15,17,15, 9,11,11,12,13,14,14,15, + 14,15,15,15,16,10,12,12,13,14,15,15,15,15,16,17, + 16,17,10,13,12,13,14,14,16,16,16,16,15,16,17,11, + 13,13,14,15,14,17,15,16,17,17,17,17,11,13,13,14, + 15,15,15,15,17,17,16,17,16, +}; + +static const static_codebook _44u7__p9_1 = { + 2, 169, + (long *)_vq_lengthlist__44u7__p9_1, + 1, -518889472, 1622704128, 4, 0, + (long *)_vq_quantlist__44u7__p9_1, + 0 +}; + +static const long _vq_quantlist__44u7__p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44u7__p9_2[] = { + 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 8, +}; + +static const static_codebook _44u7__p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44u7__p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44u7__p9_2, + 0 +}; + +static const long _huff_lengthlist__44u7__short[] = { + 5,12,17,16,16,17,17,17,17,17, 4, 7,11,11,12, 9, + 17,10,17,17, 7, 7, 8, 9, 7, 9,11,10,15,17, 7, 9, + 10,11,10,12,14,12,16,17, 7, 8, 5, 7, 4, 7, 7, 8, + 16,16, 6,10, 9,10, 7,10,11,11,16,17, 6, 8, 8, 9, + 5, 7, 5, 8,16,17, 5, 5, 8, 7, 6, 7, 7, 6, 6,14, + 12,10,12,11, 7,11, 4, 4, 2, 7,17,15,15,15, 8,15, + 6, 8, 5, 9, +}; + +static const static_codebook _huff_book__44u7__short = { + 2, 100, + (long *)_huff_lengthlist__44u7__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u8__long[] = { + 3, 9,13,14,14,15,14,14,15,15, 5, 4, 6, 8,10,12, + 12,14,15,15, 9, 5, 4, 5, 8,10,11,13,16,16,10, 7, + 4, 3, 5, 7, 9,11,13,13,10, 9, 7, 4, 4, 6, 8,10, + 12,14,13,11, 9, 6, 5, 5, 6, 8,12,14,13,11,10, 8, + 7, 6, 6, 7,10,14,13,11,12,10, 8, 7, 6, 6, 9,13, + 12,11,14,12,11, 9, 8, 7, 9,11,11,12,14,13,14,11, + 10, 8, 8, 9, +}; + +static const static_codebook _huff_book__44u8__long = { + 2, 100, + (long *)_huff_lengthlist__44u8__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u8__short[] = { + 6,14,18,18,17,17,17,17,17,17, 4, 7, 9, 9,10,13, + 15,17,17,17, 6, 7, 5, 6, 8,11,16,17,16,17, 5, 7, + 5, 4, 6,10,14,17,17,17, 6, 6, 6, 5, 7,10,13,16, + 17,17, 7, 6, 7, 7, 7, 8, 7,10,15,16,12, 9, 9, 6, + 6, 5, 3, 5,11,15,14,14,13, 5, 5, 7, 3, 4, 8,15, + 17,17,13, 7, 7,10, 6, 6,10,15,17,17,16,10,11,14, + 10,10,15,17, +}; + +static const static_codebook _huff_book__44u8__short = { + 2, 100, + (long *)_huff_lengthlist__44u8__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u8_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u8_p1_0[] = { + 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 8, 9, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 8, 9, 9, 5, 7, 7, 7, 9, + 9, 7, 9, 9, 7, 9, 9, 9,10,11, 9,11,10, 7, 9, 9, + 9,11,10, 9,10,11, 5, 7, 7, 7, 9, 9, 7, 9, 9, 7, + 9, 9, 9,11,10, 9,10,10, 8, 9, 9, 9,11,11, 9,11, + 10, +}; + +static const static_codebook _44u8_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u8_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u8_p1_0, + 0 +}; + +static const long _vq_quantlist__44u8_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u8_p2_0[] = { + 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, + 9, 9,11,11, 8, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10,10, + 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, + 10, 9,10, 9,12,11, 9,10,10,12,12, 8, 9, 9,12,11, + 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14,11, + 11,12,13,14, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, + 10,12,12,11,12,11,13,13,11,12,12,14,14, 5, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, + 12, 9,10,10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,11, + 8, 9, 9,11,11,10,11,11,12,13,10,11,11,12,13, 6, + 8, 8,10,10, 8, 9, 8,11,10, 8, 9, 9,11,11,10,11, + 10,13,12,10,11,11,13,13, 9,10,10,12,12,10,11,11, + 13,13,10,11,11,13,13,12,12,13,13,14,12,13,13,14, + 14, 9,10,10,12,12,10,11,10,13,12,10,11,11,13,13, + 11,13,12,14,13,12,13,13,14,14, 5, 7, 7, 9, 9, 7, + 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10, + 10,12,12, 7, 8, 8,10,10, 8, 9, 9,11,11, 8, 8, 9, + 10,11,10,11,11,13,13,10,10,11,12,13, 7, 8, 8,10, + 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,13, + 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,13,10, + 10,11,12,13,12,13,13,14,14,12,12,13,13,14, 9,10, + 10,12,12,10,11,11,13,13,10,11,11,13,13,12,13,13, + 15,14,12,13,13,14,13, 8, 9, 9,11,11, 9,10,10,12, + 12, 9,10,10,12,12,12,12,12,14,13,11,12,12,14,14, + 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, + 13,13,14,15,12,13,13,14,15, 9,10,10,12,12,10,11, + 10,13,12,10,11,11,13,13,12,13,12,15,14,12,13,13, + 14,15,11,12,12,14,14,12,13,13,14,14,12,13,13,15, + 14,14,14,14,14,16,14,14,15,16,16,11,12,12,14,14, + 11,12,12,14,14,12,13,13,14,15,13,14,13,16,14,14, + 14,14,16,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, + 10,12,12,11,12,12,14,13,11,12,12,14,14, 9,10,10, + 12,12,10,11,11,13,13,10,10,11,12,13,12,13,13,15, + 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,13,13, + 10,11,11,13,13,12,13,13,14,14,12,13,13,15,14,11, + 12,12,14,13,12,13,13,15,14,11,12,12,13,14,14,15, + 14,16,15,13,13,14,13,16,11,12,12,14,14,12,13,13, + 14,15,12,13,12,15,14,14,14,14,16,15,14,15,13,16, + 14, +}; + +static const static_codebook _44u8_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44u8_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u8_p2_0, + 0 +}; + +static const long _vq_quantlist__44u8_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u8_p3_0[] = { + 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, + 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, + 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 7, 7, + 8, 8, 9, 9,11,10, 7, 7, 7, 8, 8, 9, 9,10,11, 9, + 9, 9,10,10,11,10,12,11, 9, 9, 9, 9,10,11,11,11, + 12, +}; + +static const static_codebook _44u8_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44u8_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u8_p3_0, + 0 +}; + +static const long _vq_quantlist__44u8_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44u8_p4_0[] = { + 4, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,11,11,11, + 11, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11, + 12,12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11,12,12, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 7, 7, 7, 8, 8, 9, 8,10, 9,10, 9, + 11,10,12,11,13,12, 7, 7, 7, 8, 8, 8, 9, 9,10, 9, + 10,10,11,11,12,12,13, 8, 8, 8, 9, 9, 9, 9,10,10, + 11,10,11,11,12,12,13,13, 8, 8, 8, 9, 9, 9,10,10, + 10,10,11,11,11,12,12,12,13, 8, 9, 9, 9, 9,10, 9, + 11,10,11,11,12,11,13,12,13,13, 8, 9, 9, 9, 9, 9, + 10,10,11,11,11,11,12,12,13,13,13,10,10,10,10,10, + 11,10,11,11,12,11,13,12,13,13,14,13,10,10,10,10, + 10,10,11,11,11,11,12,12,13,13,13,13,14,11,11,11, + 11,11,12,11,12,12,13,12,13,13,14,13,14,14,11,11, + 11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,11, + 12,12,12,12,13,12,13,12,13,13,14,13,14,14,14,14, + 11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14, + 14, +}; + +static const static_codebook _44u8_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__44u8_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44u8_p4_0, + 0 +}; + +static const long _vq_quantlist__44u8_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u8_p5_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8, 9, 9, 7, + 9, 9, 5, 8, 8, 7, 9, 9, 8, 9, 9, 5, 8, 8, 8,10, + 10, 8,10,10, 7,10,10, 9,10,12, 9,12,11, 7,10,10, + 9,11,10, 9,11,12, 5, 8, 8, 8,10,10, 8,10,10, 7, + 10,10, 9,11,11, 9,10,11, 7,10,10, 9,11,11,10,12, + 10, +}; + +static const static_codebook _44u8_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__44u8_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44u8_p5_0, + 0 +}; + +static const long _vq_quantlist__44u8_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u8_p5_1[] = { + 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 5, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, + 8, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 6, 6, 6, 7, + 7, 7, 7, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 7, 8, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 9, +}; + +static const static_codebook _44u8_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__44u8_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u8_p5_1, + 0 +}; + +static const long _vq_quantlist__44u8_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u8_p6_0[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 4, 6, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 6, 7, 7, 7, 8, 8, 8, 8, 9, + 9,10,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 8,10, 9,11, + 10, 7, 8, 8, 8, 8, 8, 9, 9, 9,10,10,11,11, 7, 8, + 8, 8, 8, 9, 8, 9, 9,10,10,11,11, 8, 8, 8, 9, 9, + 9, 9, 9,10,10,10,11,11, 8, 8, 8, 9, 9, 9, 9,10, + 9,10,10,11,11, 9, 9, 9, 9,10,10,10,10,10,10,11, + 11,12, 9, 9, 9,10, 9,10,10,10,10,11,10,12,11,10, + 10,10,10,10,11,11,11,11,11,12,12,12,10,10,10,10, + 11,11,11,11,11,12,11,12,12, +}; + +static const static_codebook _44u8_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u8_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u8_p6_0, + 0 +}; + +static const long _vq_quantlist__44u8_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u8_p6_1[] = { + 3, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44u8_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u8_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u8_p6_1, + 0 +}; + +static const long _vq_quantlist__44u8_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u8_p7_0[] = { + 1, 4, 5, 6, 6, 7, 7, 8, 8,10,10,11,11, 5, 6, 6, + 7, 7, 8, 8, 9, 9,11,10,12,11, 5, 6, 6, 7, 7, 8, + 8, 9, 9,10,11,11,12, 6, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,12, 6, 7, 7, 8, 8, 9, 9,10,10,11,12,13, + 12, 7, 8, 8, 9, 9,10,10,11,11,12,12,13,13, 8, 8, + 8, 9, 9,10,10,11,11,12,12,13,13, 9, 9, 9,10,10, + 11,11,12,12,13,13,14,14, 9, 9, 9,10,10,11,11,12, + 12,13,13,14,14,10,11,11,12,11,13,12,13,13,14,14, + 15,15,10,11,11,11,12,12,13,13,14,14,14,15,15,11, + 12,12,13,13,14,13,15,14,15,15,16,15,11,11,12,13, + 13,13,14,14,14,15,15,15,16, +}; + +static const static_codebook _44u8_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44u8_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__44u8_p7_0, + 0 +}; + +static const long _vq_quantlist__44u8_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u8_p7_1[] = { + 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, + 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 7, 7, 7, + 8, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, + 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44u8_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44u8_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u8_p7_1, + 0 +}; + +static const long _vq_quantlist__44u8_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u8_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 7, 9, 8,10, 9,11,10, 4, + 6, 6, 8, 8,10, 9, 9, 9,10,10,11,10,12,10, 4, 6, + 6, 8, 8,10,10, 9, 9,10,10,11,11,11,12, 7, 8, 8, + 10,10,11,11,11,10,12,11,12,12,13,11, 7, 8, 8,10, + 10,11,11,10,10,11,11,12,12,13,13, 8,10,10,11,11, + 12,11,12,11,13,12,13,12,14,13, 8,10, 9,11,11,12, + 12,12,12,12,12,13,13,14,13, 8, 9, 9,11,10,12,11, + 13,12,13,13,14,13,14,13, 8, 9, 9,10,11,12,12,12, + 12,13,13,14,15,14,14, 9,10,10,12,11,13,12,13,13, + 14,13,14,14,14,14, 9,10,10,12,12,12,12,13,13,14, + 14,14,15,14,14,10,11,11,13,12,13,12,14,14,14,14, + 14,14,15,15,10,11,11,12,12,13,13,14,14,14,15,15, + 14,16,15,11,12,12,13,12,14,14,14,13,15,14,15,15, + 15,17,11,12,12,13,13,14,14,14,15,15,14,15,15,14, + 17, +}; + +static const static_codebook _44u8_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__44u8_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44u8_p8_0, + 0 +}; + +static const long _vq_quantlist__44u8_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44u8_p8_1[] = { + 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 6, 6, 7, 7, 8, + 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10, 8, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, + 10, 9,10, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, + 10,10,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10, 9,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, + 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9,10, 9, + 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, + 10, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, + 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9, 9,10, 9,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, + 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10, 9, 9, 9,10, 9,10, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44u8_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__44u8_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44u8_p8_1, + 0 +}; + +static const long _vq_quantlist__44u8_p9_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u8_p9_0[] = { + 1, 3, 3, 9, 9, 9, 9, 9, 9, 4, 9, 9, 9, 9, 9, 9, + 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, + 8, +}; + +static const static_codebook _44u8_p9_0 = { + 2, 81, + (long *)_vq_lengthlist__44u8_p9_0, + 1, -511895552, 1631393792, 4, 0, + (long *)_vq_quantlist__44u8_p9_0, + 0 +}; + +static const long _vq_quantlist__44u8_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__44u8_p9_1[] = { + 1, 4, 4, 7, 7, 8, 7, 8, 6, 9, 7,10, 8,11,10,11, + 11,11,11, 4, 7, 6, 9, 9,10, 9, 9, 9,10,10,11,10, + 11,10,11,11,13,11, 4, 7, 7, 9, 9, 9, 9, 9, 9,10, + 10,11,10,11,11,11,12,11,12, 7, 9, 8,11,11,11,11, + 10,10,11,11,12,12,12,12,12,12,14,13, 7, 8, 9,10, + 11,11,11,10,10,11,11,11,11,12,12,14,12,13,14, 8, + 9, 9,11,11,11,11,11,11,12,12,14,12,15,14,14,14, + 15,14, 8, 9, 9,11,11,11,11,12,11,12,12,13,13,13, + 13,13,13,14,14, 8, 9, 9,11,10,12,11,12,12,13,13, + 13,13,15,14,14,14,16,16, 8, 9, 9,10,11,11,12,12, + 12,13,13,13,14,14,14,15,16,15,15, 9,10,10,11,12, + 12,13,13,13,14,14,16,14,14,16,16,16,16,15, 9,10, + 10,11,11,12,13,13,14,15,14,16,14,15,16,16,16,16, + 15,10,11,11,12,13,13,14,15,15,15,15,15,16,15,16, + 15,16,15,15,10,11,11,13,13,14,13,13,15,14,15,15, + 16,15,15,15,16,15,16,10,12,12,14,14,14,14,14,16, + 16,15,15,15,16,16,16,16,16,16,11,12,12,14,14,14, + 14,15,15,16,15,16,15,16,15,16,16,16,16,12,12,13, + 14,14,15,16,16,16,16,16,16,15,16,16,16,16,16,16, + 12,13,13,14,14,14,14,15,16,15,16,16,16,16,16,16, + 16,16,16,12,13,14,14,14,16,15,16,15,16,16,16,16, + 16,16,16,16,16,16,12,14,13,14,15,15,15,16,15,16, + 16,15,16,16,16,16,16,16,16, +}; + +static const static_codebook _44u8_p9_1 = { + 2, 361, + (long *)_vq_lengthlist__44u8_p9_1, + 1, -518287360, 1622704128, 5, 0, + (long *)_vq_quantlist__44u8_p9_1, + 0 +}; + +static const long _vq_quantlist__44u8_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44u8_p9_2[] = { + 2, 3, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _44u8_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44u8_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44u8_p9_2, + 0 +}; + +static const long _huff_lengthlist__44u9__long[] = { + 3, 9,13,13,14,15,14,14,15,15, 5, 5, 9,10,12,12, + 13,14,16,15,10, 6, 6, 6, 8,11,12,13,16,15,11, 7, + 5, 3, 5, 8,10,12,15,15,10,10, 7, 4, 3, 5, 8,10, + 12,12,12,12, 9, 7, 5, 4, 6, 8,10,13,13,12,11, 9, + 7, 5, 5, 6, 9,12,14,12,12,10, 8, 6, 6, 6, 7,11, + 13,12,14,13,10, 8, 7, 7, 7,10,11,11,12,13,12,11, + 10, 8, 8, 9, +}; + +static const static_codebook _huff_book__44u9__long = { + 2, 100, + (long *)_huff_lengthlist__44u9__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _huff_lengthlist__44u9__short[] = { + 9,16,18,18,17,17,17,17,17,17, 5, 8,11,12,11,12, + 17,17,16,16, 6, 6, 8, 8, 9,10,14,15,16,16, 6, 7, + 7, 4, 6, 9,13,16,16,16, 6, 6, 7, 4, 5, 8,11,15, + 17,16, 7, 6, 7, 6, 6, 8, 9,10,14,16,11, 8, 8, 7, + 6, 6, 3, 4,10,15,14,12,12,10, 5, 6, 3, 3, 8,13, + 15,17,15,11, 6, 8, 6, 6, 9,14,17,15,15,12, 8,10, + 9, 9,12,15, +}; + +static const static_codebook _huff_book__44u9__short = { + 2, 100, + (long *)_huff_lengthlist__44u9__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44u9_p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u9_p1_0[] = { + 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 9, 9, 7, + 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 9, 5, 7, 7, 7, 9, + 9, 7, 9, 9, 8, 9, 9, 9,10,11, 9,11,11, 7, 9, 9, + 9,11,10, 9,11,11, 5, 7, 7, 7, 9, 9, 8, 9,10, 7, + 9, 9, 9,11,11, 9,10,11, 7, 9,10, 9,11,11, 9,11, + 10, +}; + +static const static_codebook _44u9_p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44u9_p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44u9_p1_0, + 0 +}; + +static const long _vq_quantlist__44u9_p2_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u9_p2_0[] = { + 3, 5, 5, 8, 8, 5, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, + 9, 9,11,10, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, + 8,10,10, 7, 8, 8, 9,10, 9,10,10,11,11, 9, 9,10, + 11,11, 6, 7, 7, 9, 9, 7, 8, 8,10, 9, 7, 8, 8,10, + 10, 9,10, 9,11,11, 9,10,10,11,11, 8, 9, 9,11,11, + 9,10,10,12,11, 9,10,10,11,12,11,11,11,13,13,11, + 11,11,12,13, 8, 9, 9,11,11, 9,10,10,11,11, 9,10, + 10,12,11,11,12,11,13,12,11,11,12,13,13, 6, 7, 7, + 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, + 11, 9,10,10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,11, + 8, 9, 9,10,10,10,11,11,12,12,10,10,11,12,12, 7, + 8, 8,10,10, 8, 9, 8,10,10, 8, 9, 9,10,10,10,11, + 10,12,11,10,10,11,12,12, 9,10,10,11,12,10,11,11, + 12,12,10,11,10,12,12,12,12,12,13,13,11,12,12,13, + 13, 9,10,10,11,11, 9,10,10,12,12,10,11,11,12,13, + 11,12,11,13,12,12,12,12,13,14, 6, 7, 7, 9, 9, 7, + 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,11,11, 9,10, + 10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,10, 8, 8, 9, + 10,10,10,11,10,12,12,10,10,11,11,12, 7, 8, 8,10, + 10, 8, 9, 9,10,10, 8, 9, 9,10,10,10,11,10,12,12, + 10,11,10,12,12, 9,10,10,12,11,10,11,11,12,12, 9, + 10,10,12,12,12,12,12,13,13,11,11,12,12,14, 9,10, + 10,11,12,10,11,11,12,12,10,11,11,12,12,11,12,12, + 14,14,12,12,12,13,13, 8, 9, 9,11,11, 9,10,10,12, + 11, 9,10,10,12,12,11,12,11,13,13,11,11,12,13,13, + 9,10,10,12,12,10,11,11,12,12,10,11,11,12,12,12, + 12,12,14,14,12,12,12,13,13, 9,10,10,12,11,10,11, + 10,12,12,10,11,11,12,12,11,12,12,14,13,12,12,12, + 13,14,11,12,11,13,13,11,12,12,13,13,12,12,12,14, + 14,13,13,13,13,15,13,13,14,15,15,11,11,11,13,13, + 11,12,11,13,13,11,12,12,13,13,12,13,12,15,13,13, + 13,14,14,15, 8, 9, 9,11,11, 9,10,10,11,12, 9,10, + 10,11,12,11,12,11,13,13,11,12,12,13,13, 9,10,10, + 11,12,10,11,10,12,12,10,10,11,12,13,12,12,12,14, + 13,11,12,12,13,14, 9,10,10,12,12,10,11,11,12,12, + 10,11,11,12,12,12,12,12,14,13,12,12,12,14,13,11, + 11,11,13,13,11,12,12,14,13,11,11,12,13,13,13,13, + 13,15,14,12,12,13,13,15,11,12,12,13,13,12,12,12, + 13,14,11,12,12,13,13,13,13,14,14,15,13,13,13,14, + 14, +}; + +static const static_codebook _44u9_p2_0 = { + 4, 625, + (long *)_vq_lengthlist__44u9_p2_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u9_p2_0, + 0 +}; + +static const long _vq_quantlist__44u9_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44u9_p3_0[] = { + 3, 4, 4, 5, 5, 7, 7, 8, 8, 4, 5, 5, 6, 6, 7, 7, + 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, + 8, 8, 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 9, 7, 7, 7, + 8, 8, 9, 9,10,10, 7, 7, 7, 8, 8, 9, 9,10,10, 8, + 9, 9,10, 9,10,10,11,11, 8, 9, 9, 9,10,10,10,11, + 11, +}; + +static const static_codebook _44u9_p3_0 = { + 2, 81, + (long *)_vq_lengthlist__44u9_p3_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44u9_p3_0, + 0 +}; + +static const long _vq_quantlist__44u9_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, +}; + +static const long _vq_lengthlist__44u9_p4_0[] = { + 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, + 11,11, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, + 10,11,11, 6, 6, 6, 7, 6, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,11, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9,10, + 10,11,11,11,12, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, + 10,10,11,11,12,12, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, + 9,10,10,11,11,12,12, 8, 8, 8, 8, 8, 9, 8,10, 9, + 10,10,11,10,12,11,13,12, 8, 8, 8, 8, 8, 9, 9, 9, + 10,10,10,10,11,11,12,12,12, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,10,12,11,12,12,13,12, 8, 8, 8, 9, 9, 9, + 9,10,10,10,11,11,11,12,12,12,13, 9, 9, 9,10,10, + 10,10,11,10,11,11,12,11,13,12,13,13, 9, 9,10,10, + 10,10,10,10,11,11,11,11,12,12,13,13,13,10,11,10, + 11,11,11,11,12,11,12,12,13,12,13,13,14,13,10,10, + 10,11,11,11,11,11,12,12,12,12,13,13,13,13,14,11, + 11,11,12,11,12,12,12,12,13,13,13,13,14,13,14,14, + 11,11,11,11,12,12,12,12,12,12,13,13,13,13,14,14, + 14, +}; + +static const static_codebook _44u9_p4_0 = { + 2, 289, + (long *)_vq_lengthlist__44u9_p4_0, + 1, -529530880, 1611661312, 5, 0, + (long *)_vq_quantlist__44u9_p4_0, + 0 +}; + +static const long _vq_quantlist__44u9_p5_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44u9_p5_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8, 9, 9, 7, + 9, 9, 5, 8, 8, 7, 9, 9, 8, 9, 9, 5, 8, 8, 8,10, + 10, 8,10,10, 7,10,10, 9,10,12, 9,11,11, 7,10,10, + 9,11,10, 9,11,12, 5, 8, 8, 8,10,10, 8,10,10, 7, + 10,10, 9,12,11, 9,10,11, 7,10,10, 9,11,11,10,12, + 10, +}; + +static const static_codebook _44u9_p5_0 = { + 4, 81, + (long *)_vq_lengthlist__44u9_p5_0, + 1, -529137664, 1618345984, 2, 0, + (long *)_vq_quantlist__44u9_p5_0, + 0 +}; + +static const long _vq_quantlist__44u9_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u9_p5_1[] = { + 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, + 7, 7, 7, 7, 8, 7, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, + 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 8, 8, 7, 7, 7, 7, 7, 8, 7, 8, 8, + 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 8, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; + +static const static_codebook _44u9_p5_1 = { + 2, 121, + (long *)_vq_lengthlist__44u9_p5_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u9_p5_1, + 0 +}; + +static const long _vq_quantlist__44u9_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u9_p6_0[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 4, 6, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 5, 6, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 10,10,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, + 10, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, 7, 8, + 8, 8, 8, 9, 9, 9, 9,10,10,11,11, 8, 8, 8, 9, 9, + 9, 9, 9,10,10,10,11,11, 8, 8, 8, 9, 9, 9, 9,10, + 9,10,10,11,11, 9, 9, 9,10,10,10,10,10,11,11,11, + 11,12, 9, 9, 9,10,10,10,10,10,10,11,10,12,11,10, + 10,10,10,10,11,11,11,11,11,12,12,12,10,10,10,10, + 10,11,11,11,11,12,11,12,12, +}; + +static const static_codebook _44u9_p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44u9_p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44u9_p6_0, + 0 +}; + +static const long _vq_quantlist__44u9_p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44u9_p6_1[] = { + 4, 4, 4, 5, 5, 4, 5, 4, 5, 5, 4, 4, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, +}; + +static const static_codebook _44u9_p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44u9_p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44u9_p6_1, + 0 +}; + +static const long _vq_quantlist__44u9_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44u9_p7_0[] = { + 1, 4, 5, 6, 6, 7, 7, 8, 9,10,10,11,11, 5, 6, 6, + 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 6, 6, 7, 7, 8, + 8, 9, 9,10,10,11,11, 6, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,12, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,12, + 12, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13, 8, 8, + 8, 9, 9,10,10,11,11,12,12,13,13, 9, 9, 9,10,10, + 11,11,12,12,13,13,13,13, 9, 9, 9,10,10,11,11,12, + 12,13,13,14,14,10,10,10,11,11,12,12,13,13,14,13, + 15,14,10,10,10,11,11,12,12,13,13,14,14,14,14,11, + 11,12,12,12,13,13,14,14,14,14,15,15,11,11,12,12, + 12,13,13,14,14,14,15,15,15, +}; + +static const static_codebook _44u9_p7_0 = { + 2, 169, + (long *)_vq_lengthlist__44u9_p7_0, + 1, -523206656, 1618345984, 4, 0, + (long *)_vq_quantlist__44u9_p7_0, + 0 +}; + +static const long _vq_quantlist__44u9_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, +}; + +static const long _vq_lengthlist__44u9_p7_1[] = { + 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 8, 8, +}; + +static const static_codebook _44u9_p7_1 = { + 2, 121, + (long *)_vq_lengthlist__44u9_p7_1, + 1, -531365888, 1611661312, 4, 0, + (long *)_vq_quantlist__44u9_p7_1, + 0 +}; + +static const long _vq_quantlist__44u9_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u9_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10, 9,11,10, 4, + 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,10,12,10, 4, 6, + 6, 8, 8, 9,10, 9, 9,10,10,11,11,12,12, 7, 8, 8, + 10,10,11,11,10,10,11,11,12,12,13,12, 7, 8, 8,10, + 10,11,11,10,10,11,11,12,12,12,13, 8,10, 9,11,11, + 12,12,11,11,12,12,13,13,14,13, 8, 9, 9,11,11,12, + 12,11,12,12,12,13,13,14,13, 8, 9, 9,10,10,12,11, + 13,12,13,13,14,13,15,14, 8, 9, 9,10,10,11,12,12, + 12,13,13,13,14,14,14, 9,10,10,12,11,13,12,13,13, + 14,13,14,14,14,15, 9,10,10,11,12,12,12,13,13,14, + 14,14,15,15,15,10,11,11,12,12,13,13,14,14,14,14, + 15,14,16,15,10,11,11,12,12,13,13,13,14,14,14,14, + 14,15,16,11,12,12,13,13,14,13,14,14,15,14,15,16, + 16,16,11,12,12,13,13,14,13,14,14,15,15,15,16,15, + 15, +}; + +static const static_codebook _44u9_p8_0 = { + 2, 225, + (long *)_vq_lengthlist__44u9_p8_0, + 1, -520986624, 1620377600, 4, 0, + (long *)_vq_quantlist__44u9_p8_0, + 0 +}; + +static const long _vq_quantlist__44u9_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, +}; + +static const long _vq_lengthlist__44u9_p8_1[] = { + 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 9,10, 9,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9,10,10, 9,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, + 10,10, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, + 10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 9, 9, 9, 9,10, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9, 9,10, 9,10, 9,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10, +}; + +static const static_codebook _44u9_p8_1 = { + 2, 441, + (long *)_vq_lengthlist__44u9_p8_1, + 1, -529268736, 1611661312, 5, 0, + (long *)_vq_quantlist__44u9_p8_1, + 0 +}; + +static const long _vq_quantlist__44u9_p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, +}; + +static const long _vq_lengthlist__44u9_p9_0[] = { + 1, 3, 3,11,11,11,11,11,11,11,11,11,11,11,11, 4, + 10,11,11,11,11,11,11,11,11,11,11,11,11,11, 4,10, + 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _44u9_p9_0 = { + 2, 225, + (long *)_vq_lengthlist__44u9_p9_0, + 1, -510036736, 1631393792, 4, 0, + (long *)_vq_quantlist__44u9_p9_0, + 0 +}; + +static const long _vq_quantlist__44u9_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, +}; + +static const long _vq_lengthlist__44u9_p9_1[] = { + 1, 4, 4, 7, 7, 8, 7, 8, 7, 9, 8,10, 9,10,10,11, + 11,12,12, 4, 7, 6, 9, 9,10, 9, 9, 8,10,10,11,10, + 12,10,13,12,13,12, 4, 6, 6, 9, 9, 9, 9, 9, 9,10, + 10,11,11,11,12,12,12,12,12, 7, 9, 8,11,10,10,10, + 11,10,11,11,12,12,13,12,13,13,13,13, 7, 8, 9,10, + 10,11,11,10,10,11,11,11,12,13,13,13,13,14,14, 8, + 9, 9,11,11,12,11,12,12,13,12,12,13,13,14,15,14, + 14,14, 8, 9, 9,10,11,11,11,12,12,13,12,13,13,14, + 14,14,15,14,16, 8, 9, 9,11,10,12,12,12,12,15,13, + 13,13,17,14,15,15,15,14, 8, 9, 9,10,11,11,12,13, + 12,13,13,13,14,15,14,14,14,16,15, 9,11,10,12,12, + 13,13,13,13,14,14,16,15,14,14,14,15,15,17, 9,10, + 10,11,11,13,13,13,14,14,13,15,14,15,14,15,16,15, + 16,10,11,11,12,12,13,14,15,14,15,14,14,15,17,16, + 15,15,17,17,10,12,11,13,12,14,14,13,14,15,15,15, + 15,16,17,17,15,17,16,11,12,12,14,13,15,14,15,16, + 17,15,17,15,17,15,15,16,17,15,11,11,12,14,14,14, + 14,14,15,15,16,15,17,17,17,16,17,16,15,12,12,13, + 14,14,14,15,14,15,15,16,16,17,16,17,15,17,17,16, + 12,14,12,14,14,15,15,15,14,14,16,16,16,15,16,16, + 15,17,15,12,13,13,14,15,14,15,17,15,17,16,17,17, + 17,16,17,16,17,17,12,13,13,14,16,15,15,15,16,15, + 17,17,15,17,15,17,16,16,17, +}; + +static const static_codebook _44u9_p9_1 = { + 2, 361, + (long *)_vq_lengthlist__44u9_p9_1, + 1, -518287360, 1622704128, 5, 0, + (long *)_vq_quantlist__44u9_p9_1, + 0 +}; + +static const long _vq_quantlist__44u9_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, +}; + +static const long _vq_lengthlist__44u9_p9_2[] = { + 2, 4, 4, 5, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 6, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, +}; + +static const static_codebook _44u9_p9_2 = { + 1, 49, + (long *)_vq_lengthlist__44u9_p9_2, + 1, -526909440, 1611661312, 6, 0, + (long *)_vq_quantlist__44u9_p9_2, + 0 +}; + +static const long _huff_lengthlist__44un1__long[] = { + 5, 6,12, 9,14, 9, 9,19, 6, 1, 5, 5, 8, 7, 9,19, + 12, 4, 4, 7, 7, 9,11,18, 9, 5, 6, 6, 8, 7, 8,17, + 14, 8, 7, 8, 8,10,12,18, 9, 6, 8, 6, 8, 6, 8,18, + 9, 8,11, 8,11, 7, 5,15,16,18,18,18,17,15,11,18, +}; + +static const static_codebook _huff_book__44un1__long = { + 2, 64, + (long *)_huff_lengthlist__44un1__long, + 0, 0, 0, 0, 0, + NULL, + 0 +}; + +static const long _vq_quantlist__44un1__p1_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44un1__p1_0[] = { + 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, + 10,11, 5, 8, 8, 8,11,10, 8,11,10, 4, 9, 9, 8,11, + 11, 8,11,11, 8,12,11,10,12,14,11,13,13, 7,11,11, + 10,13,11,11,13,14, 4, 8, 9, 8,11,11, 8,11,12, 7, + 11,11,11,14,13,10,11,13, 8,11,12,11,13,13,10,14, + 12, +}; + +static const static_codebook _44un1__p1_0 = { + 4, 81, + (long *)_vq_lengthlist__44un1__p1_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44un1__p1_0, + 0 +}; + +static const long _vq_quantlist__44un1__p2_0[] = { + 1, + 0, + 2, +}; + +static const long _vq_lengthlist__44un1__p2_0[] = { + 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, + 7, 9, 5, 7, 7, 6, 8, 7, 7, 9, 8, 4, 7, 7, 7, 9, + 8, 7, 8, 8, 7, 9, 8, 8, 8,10, 9,10,10, 6, 8, 8, + 7,10, 8, 9,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 9, 6, + 8, 8, 9,10,10, 7, 8,10, 6, 8, 9, 9,10,10, 8,10, + 8, +}; + +static const static_codebook _44un1__p2_0 = { + 4, 81, + (long *)_vq_lengthlist__44un1__p2_0, + 1, -535822336, 1611661312, 2, 0, + (long *)_vq_quantlist__44un1__p2_0, + 0 +}; + +static const long _vq_quantlist__44un1__p3_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44un1__p3_0[] = { + 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, + 10, 9,12,12, 9, 9,10,11,12, 6, 8, 8,10,10, 8,10, + 10,11,11, 8, 9,10,11,11,10,11,11,13,13,10,11,11, + 12,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10,10,11, + 11,10,11,11,13,12,10,11,11,13,12, 9,11,11,15,13, + 10,12,11,15,13,10,11,11,15,14,12,14,13,16,15,12, + 13,13,17,16, 9,11,11,13,15,10,11,12,14,15,10,11, + 12,14,15,12,13,13,15,16,12,13,13,16,16, 5, 8, 8, + 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, + 14,11,12,12,14,14, 8,11,10,13,12,10,11,12,12,13, + 10,12,12,13,13,12,12,13,13,15,11,12,13,15,14, 7, + 10,10,12,12, 9,12,11,13,12,10,12,12,13,14,12,13, + 12,15,13,11,13,12,14,15,10,12,12,16,14,11,12,12, + 16,15,11,13,12,17,16,13,13,15,15,17,13,15,15,20, + 17,10,12,12,14,16,11,12,12,15,15,11,13,13,15,18, + 13,14,13,15,15,13,15,14,16,16, 5, 8, 8,11,11, 8, + 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, + 12,14,15, 7,10,10,13,12,10,12,12,14,13, 9,10,12, + 12,13,11,13,13,15,15,11,12,13,13,15, 8,10,10,12, + 13,10,12,12,13,13,10,12,11,13,13,11,13,12,15,15, + 12,13,12,15,13,10,12,12,16,14,11,12,12,16,15,10, + 12,12,16,14,14,15,14,18,16,13,13,14,15,16,10,12, + 12,14,16,11,13,13,16,16,11,13,12,14,16,13,15,15, + 18,18,13,15,13,16,14, 8,11,11,16,16,10,13,13,17, + 16,10,12,12,16,15,14,16,15,20,17,13,14,14,17,17, + 9,12,12,16,16,11,13,14,16,17,11,13,13,16,16,15, + 15,19,18, 0,14,15,15,18,18, 9,12,12,17,16,11,13, + 12,17,16,11,12,13,15,17,15,16,15, 0,19,14,15,14, + 19,18,12,14,14, 0,16,13,14,14,19,18,13,15,16,17, + 16,15,15,17,18, 0,14,16,16,19, 0,12,14,14,16,18, + 13,15,13,17,18,13,15,14,17,18,15,18,14,18,18,16, + 17,16, 0,17, 8,11,11,15,15,10,12,12,16,16,10,13, + 13,16,16,13,15,14,17,17,14,15,17,17,18, 9,12,12, + 16,15,11,13,13,16,16,11,12,13,17,17,14,14,15,17, + 17,14,15,16, 0,18, 9,12,12,16,17,11,13,13,16,17, + 11,14,13,18,17,14,16,14,17,17,15,17,17,18,18,12, + 14,14, 0,16,13,15,15,19, 0,12,13,15, 0, 0,14,17, + 16,19, 0,16,15,18,18, 0,12,14,14,17, 0,13,14,14, + 17, 0,13,15,14, 0,18,15,16,16, 0,18,15,18,15, 0, + 17, +}; + +static const static_codebook _44un1__p3_0 = { + 4, 625, + (long *)_vq_lengthlist__44un1__p3_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44un1__p3_0, + 0 +}; + +static const long _vq_quantlist__44un1__p4_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44un1__p4_0[] = { + 3, 5, 5, 9, 9, 5, 6, 6,10, 9, 5, 6, 6, 9,10,10, + 10,10,12,11, 9,10,10,12,12, 5, 7, 7,10,10, 7, 7, + 8,10,11, 7, 7, 8,10,11,10,10,11,11,13,10,10,11, + 11,13, 6, 7, 7,10,10, 7, 8, 7,11,10, 7, 8, 7,10, + 10,10,11, 9,13,11,10,11,10,13,11,10,10,10,14,13, + 10,11,11,14,13,10,10,11,13,14,12,12,13,15,15,12, + 12,13,13,14,10,10,10,12,13,10,11,10,13,13,10,11, + 11,13,13,12,13,12,14,13,12,13,13,14,13, 5, 7, 7, + 10,10, 7, 8, 8,11,10, 7, 8, 8,10,10,11,11,11,13, + 13,10,11,11,12,12, 7, 8, 8,11,11, 7, 8, 9,10,12, + 8, 9, 9,11,11,11,10,12,11,14,11,11,12,13,13, 6, + 8, 8,10,11, 7, 9, 7,12,10, 8, 9,10,11,12,10,12, + 10,14,11,11,12,11,13,13,10,11,11,14,14,10,10,11, + 13,14,11,12,12,15,13,12,11,14,12,16,12,13,14,15, + 16,10,10,11,13,14,10,11,10,14,12,11,12,12,13,14, + 12,13,11,15,12,14,14,14,15,15, 5, 7, 7,10,10, 7, + 8, 8,10,10, 7, 8, 8,10,11,10,11,10,12,12,10,11, + 11,12,13, 6, 8, 8,11,11, 8, 9, 9,12,11, 7, 7, 9, + 10,12,11,11,11,12,13,11,10,12,11,15, 7, 8, 8,11, + 11, 8, 9, 9,11,11, 7, 9, 8,12,10,11,12,11,13,12, + 11,12,10,15,11,10,11,10,14,12,11,12,11,14,13,10, + 10,11,13,14,13,13,13,17,15,12,11,14,12,15,10,10, + 11,13,14,11,12,12,14,14,10,11,10,14,13,13,14,13, + 16,17,12,14,11,16,12, 9,10,10,14,13,10,11,10,14, + 14,10,11,11,13,13,13,14,14,16,15,12,13,13,14,14, + 9,11,10,14,13,10,10,12,13,14,11,12,11,14,13,13, + 14,14,14,15,13,14,14,15,15, 9,10,11,13,14,10,11, + 10,15,13,11,11,12,12,15,13,14,12,15,14,13,13,14, + 14,15,12,13,12,16,14,11,11,12,15,14,13,15,13,16, + 14,13,12,15,12,17,15,16,15,16,16,12,12,13,13,15, + 11,13,11,15,14,13,13,14,15,17,13,14,12, 0,13,14, + 15,14,15, 0, 9,10,10,13,13,10,11,11,13,13,10,11, + 11,13,13,12,13,12,14,14,13,14,14,15,17, 9,10,10, + 13,13,11,12,11,15,12,10,10,11,13,16,13,14,13,15, + 14,13,13,14,15,16,10,10,11,13,14,11,11,12,13,14, + 10,12,11,14,14,13,13,13,14,15,13,15,13,16,15,12, + 13,12,15,13,12,15,13,15,15,11,11,13,14,15,15,15, + 15,15,17,13,12,14,13,17,12,12,14,14,15,13,13,14, + 14,16,11,13,11,16,15,14,16,16,17, 0,14,13,11,16, + 12, +}; + +static const static_codebook _44un1__p4_0 = { + 4, 625, + (long *)_vq_lengthlist__44un1__p4_0, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44un1__p4_0, + 0 +}; + +static const long _vq_quantlist__44un1__p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, +}; + +static const long _vq_lengthlist__44un1__p5_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9, 4, 6, 5, 8, 7, 8, 8, + 10, 9, 4, 6, 6, 8, 8, 8, 8,10,10, 7, 8, 7, 9, 9, + 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,11, 8, 8, 8, + 9, 9,10,10,11,11, 8, 8, 8, 9, 9,10,10,11,11, 9, + 10,10,11,10,11,11,12,12, 9,10,10,10,11,11,11,12, + 12, +}; + +static const static_codebook _44un1__p5_0 = { + 2, 81, + (long *)_vq_lengthlist__44un1__p5_0, + 1, -531628032, 1611661312, 4, 0, + (long *)_vq_quantlist__44un1__p5_0, + 0 +}; + +static const long _vq_quantlist__44un1__p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44un1__p6_0[] = { + 1, 4, 4, 6, 6, 8, 8,10,10,11,11,15,15, 4, 5, 5, + 8, 8, 9, 9,11,11,12,12,16,16, 4, 5, 6, 8, 8, 9, + 9,11,11,12,12,14,14, 7, 8, 8, 9, 9,10,10,11,12, + 13,13,16,17, 7, 8, 8, 9, 9,10,10,12,12,12,13,15, + 15, 9,10,10,10,10,11,11,12,12,13,13,15,16, 9, 9, + 9,10,10,11,11,13,12,13,13,17,17,10,11,11,11,12, + 12,12,13,13,14,15, 0,18,10,11,11,12,12,12,13,14, + 13,14,14,17,16,11,12,12,13,13,14,14,14,14,15,16, + 17,16,11,12,12,13,13,14,14,14,14,15,15,17,17,14, + 15,15,16,16,16,17,17,16, 0,17, 0,18,14,15,15,16, + 16, 0,15,18,18, 0,16, 0, 0, +}; + +static const static_codebook _44un1__p6_0 = { + 2, 169, + (long *)_vq_lengthlist__44un1__p6_0, + 1, -526516224, 1616117760, 4, 0, + (long *)_vq_quantlist__44un1__p6_0, + 0 +}; + +static const long _vq_quantlist__44un1__p6_1[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44un1__p6_1[] = { + 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 6, 5, 5, + 6, 5, 6, 6, 5, 6, 6, 6, 6, +}; + +static const static_codebook _44un1__p6_1 = { + 2, 25, + (long *)_vq_lengthlist__44un1__p6_1, + 1, -533725184, 1611661312, 3, 0, + (long *)_vq_quantlist__44un1__p6_1, + 0 +}; + +static const long _vq_quantlist__44un1__p7_0[] = { + 2, + 1, + 3, + 0, + 4, +}; + +static const long _vq_lengthlist__44un1__p7_0[] = { + 1, 5, 3,11,11,11,11,11,11,11, 8,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11, 8,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11, 7,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, +}; + +static const static_codebook _44un1__p7_0 = { + 4, 625, + (long *)_vq_lengthlist__44un1__p7_0, + 1, -518709248, 1626677248, 3, 0, + (long *)_vq_quantlist__44un1__p7_0, + 0 +}; + +static const long _vq_quantlist__44un1__p7_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44un1__p7_1[] = { + 1, 4, 4, 6, 6, 6, 6, 9, 8, 9, 8, 8, 8, 5, 7, 7, + 7, 7, 8, 8, 8,10, 8,10, 8, 9, 5, 7, 7, 8, 7, 7, + 8,10,10,11,10,12,11, 7, 8, 8, 9, 9, 9,10,11,11, + 11,11,11,11, 7, 8, 8, 8, 9, 9, 9,10,10,10,11,11, + 12, 7, 8, 8, 9, 9,10,11,11,12,11,12,11,11, 7, 8, + 8, 9, 9,10,10,11,11,11,12,12,11, 8,10,10,10,10, + 11,11,14,11,12,12,12,13, 9,10,10,10,10,12,11,14, + 11,14,11,12,13,10,11,11,11,11,13,11,14,14,13,13, + 13,14,11,11,11,12,11,12,12,12,13,14,14,13,14,12, + 11,12,12,12,12,13,13,13,14,13,14,14,11,12,12,14, + 12,13,13,12,13,13,14,14,14, +}; + +static const static_codebook _44un1__p7_1 = { + 2, 169, + (long *)_vq_lengthlist__44un1__p7_1, + 1, -523010048, 1618608128, 4, 0, + (long *)_vq_quantlist__44un1__p7_1, + 0 +}; + +static const long _vq_quantlist__44un1__p7_2[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, +}; + +static const long _vq_lengthlist__44un1__p7_2[] = { + 3, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9, 9, 8, 4, 5, 5, + 6, 6, 8, 8, 9, 8, 9, 9, 9, 9, 4, 5, 5, 7, 6, 8, + 8, 8, 8, 9, 8, 9, 8, 6, 7, 7, 7, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 7, 8, 8, 8, 8, 9, 8, 9, 9,10, 9, 9,10, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10, 9,10, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10, 9, 9, 9,10, 9, 9,10, 9, 9,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10, 9, + 9, 9,10, 9, 9,10,10, 9,10,10,10,10, 9, 9, 9,10, + 9, 9, 9,10,10,10,10,10,10, +}; + +static const static_codebook _44un1__p7_2 = { + 2, 169, + (long *)_vq_lengthlist__44un1__p7_2, + 1, -531103744, 1611661312, 4, 0, + (long *)_vq_quantlist__44un1__p7_2, + 0 +}; + +static const long _huff_lengthlist__44un1__short[] = { + 12,12,14,12,14,14,14,14,12, 6, 6, 8, 9, 9,11,14, + 12, 4, 2, 6, 6, 7,11,14,13, 6, 5, 7, 8, 9,11,14, + 13, 8, 5, 8, 6, 8,12,14,12, 7, 7, 8, 8, 8,10,14, + 12, 6, 3, 4, 4, 4, 7,14,11, 7, 4, 6, 6, 6, 8,14, +}; + +static const static_codebook _huff_book__44un1__short = { + 2, 64, + (long *)_huff_lengthlist__44un1__short, + 0, 0, 0, 0, 0, + NULL, + 0 +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c new file mode 100644 index 0000000000..4876970ae8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c @@ -0,0 +1,479 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic codebook pack/unpack/code/decode operations + last mod: $Id: codebook.c 17553 2010-10-21 17:54:26Z tterribe $ + + ********************************************************************/ + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codebook.h" +#include "scales.h" +#include "misc.h" +#include "os.h" + +/* packs the given codebook into the bitstream **************************/ + +int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){ + long i,j; + int ordered=0; + + /* first the basic parameters */ + oggpack_write(opb,0x564342,24); + oggpack_write(opb,c->dim,16); + oggpack_write(opb,c->entries,24); + + /* pack the codewords. There are two packings; length ordered and + length random. Decide between the two now. */ + + for(i=1;ientries;i++) + if(c->lengthlist[i-1]==0 || c->lengthlist[i]lengthlist[i-1])break; + if(i==c->entries)ordered=1; + + if(ordered){ + /* length ordered. We only need to say how many codewords of + each length. The actual codewords are generated + deterministically */ + + long count=0; + oggpack_write(opb,1,1); /* ordered */ + oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */ + + for(i=1;ientries;i++){ + long thisx=c->lengthlist[i]; + long last=c->lengthlist[i-1]; + if(thisx>last){ + for(j=last;jentries-count)); + count=i; + } + } + } + oggpack_write(opb,i-count,_ilog(c->entries-count)); + + }else{ + /* length random. Again, we don't code the codeword itself, just + the length. This time, though, we have to encode each length */ + oggpack_write(opb,0,1); /* unordered */ + + /* algortihmic mapping has use for 'unused entries', which we tag + here. The algorithmic mapping happens as usual, but the unused + entry has no codeword. */ + for(i=0;ientries;i++) + if(c->lengthlist[i]==0)break; + + if(i==c->entries){ + oggpack_write(opb,0,1); /* no unused entries */ + for(i=0;ientries;i++) + oggpack_write(opb,c->lengthlist[i]-1,5); + }else{ + oggpack_write(opb,1,1); /* we have unused entries; thus we tag */ + for(i=0;ientries;i++){ + if(c->lengthlist[i]==0){ + oggpack_write(opb,0,1); + }else{ + oggpack_write(opb,1,1); + oggpack_write(opb,c->lengthlist[i]-1,5); + } + } + } + } + + /* is the entry number the desired return value, or do we have a + mapping? If we have a mapping, what type? */ + oggpack_write(opb,c->maptype,4); + switch(c->maptype){ + case 0: + /* no mapping */ + break; + case 1:case 2: + /* implicitly populated value mapping */ + /* explicitly populated value mapping */ + + if(!c->quantlist){ + /* no quantlist? error */ + return(-1); + } + + /* values that define the dequantization */ + oggpack_write(opb,c->q_min,32); + oggpack_write(opb,c->q_delta,32); + oggpack_write(opb,c->q_quant-1,4); + oggpack_write(opb,c->q_sequencep,1); + + { + int quantvals; + switch(c->maptype){ + case 1: + /* a single column of (c->entries/c->dim) quantized values for + building a full value list algorithmically (square lattice) */ + quantvals=_book_maptype1_quantvals(c); + break; + case 2: + /* every value (c->entries*c->dim total) specified explicitly */ + quantvals=c->entries*c->dim; + break; + default: /* NOT_REACHABLE */ + quantvals=-1; + } + + /* quantized values */ + for(i=0;iquantlist[i]),c->q_quant); + + } + break; + default: + /* error case; we don't have any other map types now */ + return(-1); + } + + return(0); +} + +/* unpacks a codebook from the packet buffer into the codebook struct, + readies the codebook auxiliary structures for decode *************/ +static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){ + long i,j; + static_codebook *s=(static_codebook*)_ogg_calloc(1,sizeof(*s)); + s->allocedp=1; + + /* make sure alignment is correct */ + if(oggpack_read(opb,24)!=0x564342)goto _eofout; + + /* first the basic parameters */ + s->dim=oggpack_read(opb,16); + s->entries=oggpack_read(opb,24); + if(s->entries==-1)goto _eofout; + + if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout; + + /* codeword ordering.... length ordered or unordered? */ + switch((int)oggpack_read(opb,1)){ + case 0:{ + long unused; + /* allocated but unused entries? */ + unused=oggpack_read(opb,1); + if((s->entries*(unused?1:5)+7)>>3>opb->storage-oggpack_bytes(opb)) + goto _eofout; + /* unordered */ + s->lengthlist=(long*)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); + + /* allocated but unused entries? */ + if(unused){ + /* yes, unused entries */ + + for(i=0;ientries;i++){ + if(oggpack_read(opb,1)){ + long num=oggpack_read(opb,5); + if(num==-1)goto _eofout; + s->lengthlist[i]=num+1; + }else + s->lengthlist[i]=0; + } + }else{ + /* all entries used; no tagging */ + for(i=0;ientries;i++){ + long num=oggpack_read(opb,5); + if(num==-1)goto _eofout; + s->lengthlist[i]=num+1; + } + } + + break; + } + case 1: + /* ordered */ + { + long length=oggpack_read(opb,5)+1; + if(length==0)goto _eofout; + s->lengthlist=(long*)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); + + for(i=0;ientries;){ + long num=oggpack_read(opb,_ilog(s->entries-i)); + if(num==-1)goto _eofout; + if(length>32 || num>s->entries-i || + (num>0 && (num-1)>>(length-1)>1)){ + goto _errout; + } + if(length>32)goto _errout; + for(j=0;jlengthlist[i]=length; + length++; + } + } + break; + default: + /* EOF */ + goto _eofout; + } + + /* Do we have a mapping to unpack? */ + switch((s->maptype=oggpack_read(opb,4))){ + case 0: + /* no mapping */ + break; + case 1: case 2: + /* implicitly populated value mapping */ + /* explicitly populated value mapping */ + + s->q_min=oggpack_read(opb,32); + s->q_delta=oggpack_read(opb,32); + s->q_quant=oggpack_read(opb,4)+1; + s->q_sequencep=oggpack_read(opb,1); + if(s->q_sequencep==-1)goto _eofout; + + { + int quantvals=0; + switch(s->maptype){ + case 1: + quantvals=(s->dim==0?0:_book_maptype1_quantvals(s)); + break; + case 2: + quantvals=s->entries*s->dim; + break; + } + + /* quantized values */ + if(((quantvals * s->q_quant + 7) >> 3) > opb->storage-oggpack_bytes(opb)) + goto _eofout; + s->quantlist=(long*)_ogg_malloc(sizeof(*s->quantlist)*quantvals); + for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); + + if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; + } + break; + default: + goto _errout; + } + + /* all set */ + return(s); + + _errout: + _eofout: + vorbis_staticbook_destroy(s); + return(NULL); +} + +/* returns the number of bits ************************************************/ +int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){ + if(a<0 || a>=book->c->entries)return(0); + oggpack_write(b,book->codelist[a],book->c->lengthlist[a]); + return(book->c->lengthlist[a]); +} + +/* the 'eliminate the decode tree' optimization actually requires the + codewords to be MSb first, not LSb. This is an annoying inelegancy + (and one of the first places where carefully thought out design + turned out to be wrong; Vorbis II and future Ogg codecs should go + to an MSb bitpacker), but not actually the huge hit it appears to + be. The first-stage decode table catches most words so that + bitreverse is not in the main execution path. */ + +static ogg_uint32_t bitreverse(ogg_uint32_t x){ + x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); + x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); + x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); + x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); + return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); +} + +STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){ + int read=book->dec_maxlength; + long lo,hi; + long lok = oggpack_look(b,book->dec_firsttablen); + + if (lok >= 0) { + long entry = book->dec_firsttable[lok]; + if(entry&0x80000000UL){ + lo=(entry>>15)&0x7fff; + hi=book->used_entries-(entry&0x7fff); + }else{ + oggpack_adv(b, book->dec_codelengths[entry-1]); + return(entry-1); + } + }else{ + lo=0; + hi=book->used_entries; + } + + lok = oggpack_look(b, read); + + while(lok<0 && read>1) + lok = oggpack_look(b, --read); + if(lok<0)return -1; + + /* bisect search for the codeword in the ordered list */ + { + ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); + + while(hi-lo>1){ + long p=(hi-lo)>>1; + long test=book->codelist[lo+p]>testword; + lo+=p&(test-1); + hi-=p&(-test); + } + + if(book->dec_codelengths[lo]<=read){ + oggpack_adv(b, book->dec_codelengths[lo]); + return(lo); + } + } + + oggpack_adv(b, read); + + return(-1); +} + +/* Decode side is specced and easier, because we don't need to find + matches using different criteria; we simply read and map. There are + two things we need to do 'depending': + + We may need to support interleave. We don't really, but it's + convenient to do it here rather than rebuild the vector later. + + Cascades may be additive or multiplicitive; this is not inherent in + the codebook, but set in the code using the codebook. Like + interleaving, it's easiest to do it here. + addmul==0 -> declarative (set the value) + addmul==1 -> additive + addmul==2 -> multiplicitive */ + +/* returns the [original, not compacted] entry number or -1 on eof *********/ +long vorbis_book_decode(codebook *book, oggpack_buffer *b){ + if(book->used_entries>0){ + long packed_entry=decode_packed_entry_number(book,b); + if(packed_entry>=0) + return(book->dec_index[packed_entry]); + } + + /* if there's no dec_index, the codebook unpacking isn't collapsed */ + return(-1); +} + +/* returns 0 on OK or -1 on eof *************************************/ +long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){ + if(book->used_entries>0){ + int step=n/book->dim; + long *entry = (long*)alloca(sizeof(*entry)*step); + float **t = (float**)alloca(sizeof(*t)*step); + int i,j,o; + + for (i = 0; i < step; i++) { + entry[i]=decode_packed_entry_number(book,b); + if(entry[i]==-1)return(-1); + t[i] = book->valuelist+entry[i]*book->dim; + } + for(i=0,o=0;idim;i++,o+=step) + for (j=0;jused_entries>0){ + int i,j,entry; + float *t; + + if(book->dim>8){ + for(i=0;ivaluelist+entry*book->dim; + for (j=0;jdim;) + a[i++]+=t[j++]; + } + }else{ + for(i=0;ivaluelist+entry*book->dim; + j=0; + switch((int)book->dim){ + case 8: + a[i++]+=t[j++]; + case 7: + a[i++]+=t[j++]; + case 6: + a[i++]+=t[j++]; + case 5: + a[i++]+=t[j++]; + case 4: + a[i++]+=t[j++]; + case 3: + a[i++]+=t[j++]; + case 2: + a[i++]+=t[j++]; + case 1: + a[i++]+=t[j++]; + case 0: + break; + } + } + } + } + return(0); +} + +long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){ + if(book->used_entries>0){ + int i,j,entry; + float *t; + + for(i=0;ivaluelist+entry*book->dim; + for (j=0;jdim;) + a[i++]=t[j++]; + } + }else{ + int i,j; + + for(i=0;idim;) + a[i++]=0.f; + } + } + return(0); +} + +long vorbis_book_decodevv_add(codebook *book,float **a,long offset,int ch, + oggpack_buffer *b,int n){ + + long i,j,entry; + int chptr=0; + if(book->used_entries>0){ + for(i=offset/ch;i<(offset+n)/ch;){ + entry = decode_packed_entry_number(book,b); + if(entry==-1)return(-1); + { + const float *t = book->valuelist+entry*book->dim; + for (j=0;jdim;j++){ + a[chptr++][i]+=t[j]; + if(chptr==ch){ + chptr=0; + i++; + } + } + } + } + } + return(0); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h new file mode 100644 index 0000000000..34765277f2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h @@ -0,0 +1,119 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + last mod: $Id: codebook.h 17030 2010-03-25 06:52:55Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_CODEBOOK_H_ +#define _V_CODEBOOK_H_ + +#include "../../ogg.h" + +/* This structure encapsulates huffman and VQ style encoding books; it + doesn't do anything specific to either. + + valuelist/quantlist are nonNULL (and q_* significant) only if + there's entry->value mapping to be done. + + If encode-side mapping must be done (and thus the entry needs to be + hunted), the auxiliary encode pointer will point to a decision + tree. This is true of both VQ and huffman, but is mostly useful + with VQ. + +*/ + +typedef struct static_codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long *lengthlist; /* codeword lengths in bits */ + + /* mapping ***************************************************************/ + int maptype; /* 0=none + 1=implicitly populated values from map column + 2=listed arbitrary values */ + + /* The below does a linear, single monotonic sequence mapping. */ + long q_min; /* packed 32 bit float; quant value 0 maps to minval */ + long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ + int q_quant; /* bits: 0 < quant <= 16 */ + int q_sequencep; /* bitflag */ + + long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map + map == 2: list of dim*entries quantized entry vals + */ + int allocedp; +} static_codebook; + +typedef struct codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long used_entries; /* populated codebook entries */ + const static_codebook *c; + + /* for encode, the below are entry-ordered, fully populated */ + /* for decode, the below are ordered by bitreversed codeword and only + used entries are populated */ + float *valuelist; /* list of dim*entries actual entry values */ + ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ + + int *dec_index; /* only used if sparseness collapsed */ + char *dec_codelengths; + ogg_uint32_t *dec_firsttable; + int dec_firsttablen; + int dec_maxlength; + + /* The current encoder uses only centered, integer-only lattice books. */ + int quantvals; + int minval; + int delta; +} codebook; + +extern void vorbis_staticbook_destroy(static_codebook *b); +extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source); +extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); +extern void vorbis_book_clear(codebook *b); + +extern float *_book_unquantize(const static_codebook *b,int n,int *map); +extern float *_book_logdist(const static_codebook *b,float *vals); +extern float _float32_unpack(long val); +extern long _float32_pack(float val); +extern int _best(codebook *book, float *a, int step); +extern int _ilog(unsigned int v); +extern long _book_maptype1_quantvals(const static_codebook *b); + +extern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul); +extern long vorbis_book_codeword(codebook *book,int entry); +extern long vorbis_book_codelen(codebook *book,int entry); + + + +extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b); +extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b); + +extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b); + +extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); +extern long vorbis_book_decodevs_add(codebook *book, float *a, + oggpack_buffer *b,int n); +extern long vorbis_book_decodev_set(codebook *book, float *a, + oggpack_buffer *b,int n); +extern long vorbis_book_decodev_add(codebook *book, float *a, + oggpack_buffer *b,int n); +extern long vorbis_book_decodevv_add(codebook *book, float **a, + long off,int ch, + oggpack_buffer *b,int n); + + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h new file mode 100644 index 0000000000..e4664860f3 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h @@ -0,0 +1,187 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis codec headers + last mod: $Id: codec_internal.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_CODECI_H_ +#define _V_CODECI_H_ + +#include "envelope.h" +#include "codebook.h" + +#define BLOCKTYPE_IMPULSE 0 +#define BLOCKTYPE_PADDING 1 +#define BLOCKTYPE_TRANSITION 0 +#define BLOCKTYPE_LONG 1 + +#define PACKETBLOBS 15 + +typedef struct vorbis_block_internal{ + float **pcmdelay; /* this is a pointer into local storage */ + float ampmax; + int blocktype; + + oggpack_buffer *packetblob[PACKETBLOBS]; /* initialized, must be freed; + blob [PACKETBLOBS/2] points to + the oggpack_buffer in the + main vorbis_block */ +} vorbis_block_internal; + +typedef void vorbis_look_floor; +typedef void vorbis_look_residue; +typedef void vorbis_look_transform; + +/* mode ************************************************************/ +typedef struct { + int blockflag; + int windowtype; + int transformtype; + int mapping; +} vorbis_info_mode; + +typedef void vorbis_info_floor; +typedef void vorbis_info_residue; +typedef void vorbis_info_mapping; + +#include "psy.h" +#include "bitrate.h" + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static int ilog2(unsigned int v){ + int ret=0; + if(v)--v; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + + +typedef struct private_state { + /* local lookup storage */ + envelope_lookup *ve; /* envelope lookup */ + int window[2]; + vorbis_look_transform **transform[2]; /* block, type */ + drft_lookup fft_look[2]; + + int modebits; + vorbis_look_floor **flr; + vorbis_look_residue **residue; + vorbis_look_psy *psy; + vorbis_look_psy_global *psy_g_look; + + /* local storage, only used on the encoding side. This way the + application does not need to worry about freeing some packets' + memory and not others'; packet storage is always tracked. + Cleared next call to a _dsp_ function */ + unsigned char *header; + unsigned char *header1; + unsigned char *header2; + + bitrate_manager_state bms; + + ogg_int64_t sample_count; +} private_state; + +/* codec_setup_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). +*********************************************************************/ + +#include "highlevel.h" +typedef struct codec_setup_info { + + /* Vorbis supports only short and long blocks, but allows the + encoder to choose the sizes */ + + long blocksizes[2]; + + /* modes are the primary means of supporting on-the-fly different + blocksizes, different channel mappings (LR or M/A), + different residue backends, etc. Each mode consists of a + blocksize flag and a mapping (along with the mapping setup */ + + int modes; + int maps; + int floors; + int residues; + int books; + int psys; /* encode only */ + + vorbis_info_mode *mode_param[64]; + int map_type[64]; + vorbis_info_mapping *map_param[64]; + int floor_type[64]; + vorbis_info_floor *floor_param[64]; + int residue_type[64]; + vorbis_info_residue *residue_param[64]; + static_codebook *book_param[256]; + codebook *fullbooks; + + vorbis_info_psy *psy_param[4]; /* encode only */ + vorbis_info_psy_global psy_g_param; + + bitrate_manager_info bi; + highlevel_encode_setup hi; /* used only by vorbisenc.c. It's a + highly redundant structure, but + improves clarity of program flow. */ + int halfrate_flag; /* painless downsample for decode */ +} codec_setup_info; + +extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi); +extern void _vp_global_free(vorbis_look_psy_global *look); + + + +typedef struct { + int sorted_index[VIF_POSIT+2]; + int forward_index[VIF_POSIT+2]; + int reverse_index[VIF_POSIT+2]; + + int hineighbor[VIF_POSIT]; + int loneighbor[VIF_POSIT]; + int posts; + + int n; + int quant_q; + vorbis_info_floor1 *vi; + + long phrasebits; + long postbits; + long frames; +} vorbis_look_floor1; + + + +extern int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look, + const float *logmdct, /* in */ + const float *logmask); +extern int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look, + int *A,int *B, + int del); +extern int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, + vorbis_look_floor1 *look, + int *post,int *ilogmask); +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c new file mode 100644 index 0000000000..72c4db642c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c @@ -0,0 +1,375 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: PCM data envelope analysis + last mod: $Id: envelope.c 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" + +#include "os.h" +#include "scales.h" +#include "envelope.h" +#include "mdct.h" +#include "misc.h" + +void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy_global *gi=&ci->psy_g_param; + int ch=vi->channels; + int i,j; + int n=e->winlength=128; + e->searchstep=64; /* not random */ + + e->minenergy=gi->preecho_minenergy; + e->ch=ch; + e->storage=128; + e->cursor=ci->blocksizes[1]/2; + e->mdct_win=(float*)_ogg_calloc(n,sizeof(*e->mdct_win)); + mdct_init(&e->mdct,n); + + for(i=0;imdct_win[i]=sin(i/(n-1.)*M_PI); + e->mdct_win[i]*=e->mdct_win[i]; + } + + /* magic follows */ + e->band[0].begin=2; e->band[0].end=4; + e->band[1].begin=4; e->band[1].end=5; + e->band[2].begin=6; e->band[2].end=6; + e->band[3].begin=9; e->band[3].end=8; + e->band[4].begin=13; e->band[4].end=8; + e->band[5].begin=17; e->band[5].end=8; + e->band[6].begin=22; e->band[6].end=8; + + for(j=0;jband[j].end; + e->band[j].window=(float*)_ogg_malloc(n*sizeof(*e->band[0].window)); + for(i=0;iband[j].window[i]=sin((i+.5)/n*M_PI); + e->band[j].total+=e->band[j].window[i]; + } + e->band[j].total=1./e->band[j].total; + } + + e->filter=(envelope_filter_state*)_ogg_calloc(VE_BANDS*ch,sizeof(*e->filter)); + e->mark=(int*)_ogg_calloc(e->storage,sizeof(*e->mark)); + +} + +void _ve_envelope_clear(envelope_lookup *e){ + int i; + mdct_clear(&e->mdct); + for(i=0;iband[i].window); + _ogg_free(e->mdct_win); + _ogg_free(e->filter); + _ogg_free(e->mark); + memset(e,0,sizeof(*e)); +} + +/* fairly straight threshhold-by-band based until we find something + that works better and isn't patented. */ + +static int _ve_amp(envelope_lookup *ve, + vorbis_info_psy_global *gi, + float *data, + envelope_band *bands, + envelope_filter_state *filters){ + long n=ve->winlength; + int ret=0; + long i,j; + float decay; + + /* we want to have a 'minimum bar' for energy, else we're just + basing blocks on quantization noise that outweighs the signal + itself (for low power signals) */ + + float minV=ve->minenergy; + float *vec=(float*) alloca(n*sizeof(*vec)); + + /* stretch is used to gradually lengthen the number of windows + considered prevoius-to-potential-trigger */ + int stretch=max(VE_MINSTRETCH,ve->stretch/2); + float penalty=gi->stretch_penalty-(ve->stretch/2-VE_MINSTRETCH); + if(penalty<0.f)penalty=0.f; + if(penalty>gi->stretch_penalty)penalty=gi->stretch_penalty; + + /*_analysis_output_always("lpcm",seq2,data,n,0,0, + totalshift+pos*ve->searchstep);*/ + + /* window and transform */ + for(i=0;imdct_win[i]; + mdct_forward(&ve->mdct,vec,vec); + + /*_analysis_output_always("mdct",seq2,vec,n/2,0,1,0); */ + + /* near-DC spreading function; this has nothing to do with + psychoacoustics, just sidelobe leakage and window size */ + { + float temp=vec[0]*vec[0]+.7*vec[1]*vec[1]+.2*vec[2]*vec[2]; + int ptr=filters->nearptr; + + /* the accumulation is regularly refreshed from scratch to avoid + floating point creep */ + if(ptr==0){ + decay=filters->nearDC_acc=filters->nearDC_partialacc+temp; + filters->nearDC_partialacc=temp; + }else{ + decay=filters->nearDC_acc+=temp; + filters->nearDC_partialacc+=temp; + } + filters->nearDC_acc-=filters->nearDC[ptr]; + filters->nearDC[ptr]=temp; + + decay*=(1./(VE_NEARDC+1)); + filters->nearptr++; + if(filters->nearptr>=VE_NEARDC)filters->nearptr=0; + decay=todB(&decay)*.5-15.f; + } + + /* perform spreading and limiting, also smooth the spectrum. yes, + the MDCT results in all real coefficients, but it still *behaves* + like real/imaginary pairs */ + for(i=0;i>1]=val; + decay-=8.; + } + + /*_analysis_output_always("spread",seq2++,vec,n/4,0,0,0);*/ + + /* perform preecho/postecho triggering by band */ + for(j=0;j=VE_AMP)filters[j].ampptr=0; + } + + /* look at min/max, decide trigger */ + if(valmax>gi->preecho_thresh[j]+penalty){ + ret|=1; + ret|=4; + } + if(valminpostecho_thresh[j]-penalty)ret|=2; + } + + return(ret); +} + +#if 0 +static int seq=0; +static ogg_int64_t totalshift=-1024; +#endif + +long _ve_envelope_search(vorbis_dsp_state *v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + vorbis_info_psy_global *gi=&ci->psy_g_param; + envelope_lookup *ve=((private_state *)(v->backend_state))->ve; + long i,j; + + int first=ve->current/ve->searchstep; + int last=v->pcm_current/ve->searchstep-VE_WIN; + if(first<0)first=0; + + /* make sure we have enough storage to match the PCM */ + if(last+VE_WIN+VE_POST>ve->storage){ + ve->storage=last+VE_WIN+VE_POST; /* be sure */ + ve->mark=(int*)_ogg_realloc(ve->mark,ve->storage*sizeof(*ve->mark)); + } + + for(j=first;jstretch++; + if(ve->stretch>VE_MAXSTRETCH*2) + ve->stretch=VE_MAXSTRETCH*2; + + for(i=0;ich;i++){ + float *pcm=v->pcm[i]+ve->searchstep*(j); + ret|=_ve_amp(ve,gi,pcm,ve->band,ve->filter+i*VE_BANDS); + } + + ve->mark[j+VE_POST]=0; + if(ret&1){ + ve->mark[j]=1; + ve->mark[j+1]=1; + } + + if(ret&2){ + ve->mark[j]=1; + if(j>0)ve->mark[j-1]=1; + } + + if(ret&4)ve->stretch=-1; + } + + ve->current=last*ve->searchstep; + + { + long centerW=v->centerW; + long testW= + centerW+ + ci->blocksizes[v->W]/4+ + ci->blocksizes[1]/2+ + ci->blocksizes[0]/4; + + j=ve->cursor; + + while(jcurrent-(ve->searchstep)){/* account for postecho + working back one window */ + if(j>=testW)return(1); + + ve->cursor=j; + + if(ve->mark[j/ve->searchstep]){ + if(j>centerW){ + +#if 0 + if(j>ve->curmark){ + float *marker=(float*)alloca(v->pcm_current*sizeof(*marker)); + int l,m; + memset(marker,0,sizeof(*marker)*v->pcm_current); + fprintf(stderr,"mark! seq=%d, cursor:%fs time:%fs\n", + seq, + (totalshift+ve->cursor)/44100., + (totalshift+j)/44100.); + _analysis_output_always("pcmL",seq,v->pcm[0],v->pcm_current,0,0,totalshift); + _analysis_output_always("pcmR",seq,v->pcm[1],v->pcm_current,0,0,totalshift); + + _analysis_output_always("markL",seq,v->pcm[0],j,0,0,totalshift); + _analysis_output_always("markR",seq,v->pcm[1],j,0,0,totalshift); + + for(m=0;msearchstep]=ve->filter[m].markers[l]*.1; + _analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift); + } + + for(m=0;msearchstep]=ve->filter[m+VE_BANDS].markers[l]*.1; + _analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift); + } + + for(l=0;lsearchstep]=ve->mark[l]*.4; + _analysis_output_always("mark",seq,marker,v->pcm_current,0,0,totalshift); + + + seq++; + + } +#endif + + ve->curmark=j; + if(j>=testW)return(1); + return(0); + } + } + j+=ve->searchstep; + } + } + + return(-1); +} + +int _ve_envelope_mark(vorbis_dsp_state *v){ + envelope_lookup *ve=((private_state *)(v->backend_state))->ve; + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + long centerW=v->centerW; + long beginW=centerW-ci->blocksizes[v->W]/4; + long endW=centerW+ci->blocksizes[v->W]/4; + if(v->W){ + beginW-=ci->blocksizes[v->lW]/4; + endW+=ci->blocksizes[v->nW]/4; + }else{ + beginW-=ci->blocksizes[0]/4; + endW+=ci->blocksizes[0]/4; + } + + if(ve->curmark>=beginW && ve->curmarksearchstep; + long last=endW/ve->searchstep; + long i; + for(i=first;imark[i])return(1); + } + return(0); +} + +void _ve_envelope_shift(envelope_lookup *e,long shift){ + int smallsize=e->current/e->searchstep+VE_POST; /* adjust for placing marks + ahead of ve->current */ + int smallshift=shift/e->searchstep; + + memmove(e->mark,e->mark+smallshift,(smallsize-smallshift)*sizeof(*e->mark)); + +#if 0 + for(i=0;ich;i++) + memmove(e->filter[i].markers, + e->filter[i].markers+smallshift, + (1024-smallshift)*sizeof(*(*e->filter).markers)); + totalshift+=shift; +#endif + + e->current-=shift; + if(e->curmark>=0) + e->curmark-=shift; + e->cursor-=shift; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h new file mode 100644 index 0000000000..8237b90c78 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h @@ -0,0 +1,80 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: PCM data envelope analysis and manipulation + last mod: $Id: envelope.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_ENVELOPE_ +#define _V_ENVELOPE_ + +#include "mdct.h" + +#define VE_PRE 16 +#define VE_WIN 4 +#define VE_POST 2 +#define VE_AMP (VE_PRE+VE_POST-1) + +#define VE_BANDS 7 +#define VE_NEARDC 15 + +#define VE_MINSTRETCH 2 /* a bit less than short block */ +#define VE_MAXSTRETCH 12 /* one-third full block */ + +typedef struct { + float ampbuf[VE_AMP]; + int ampptr; + + float nearDC[VE_NEARDC]; + float nearDC_acc; + float nearDC_partialacc; + int nearptr; + +} envelope_filter_state; + +typedef struct { + int begin; + int end; + float *window; + float total; +} envelope_band; + +typedef struct { + int ch; + int winlength; + int searchstep; + float minenergy; + + mdct_lookup mdct; + float *mdct_win; + + envelope_band band[VE_BANDS]; + envelope_filter_state *filter; + int stretch; + + int *mark; + + long storage; + long current; + long curmark; + long cursor; +} envelope_lookup; + +extern void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi); +extern void _ve_envelope_clear(envelope_lookup *e); +extern long _ve_envelope_search(vorbis_dsp_state *v); +extern void _ve_envelope_shift(envelope_lookup *e,long shift); +extern int _ve_envelope_mark(vorbis_dsp_state *v); + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c new file mode 100644 index 0000000000..4eac09ce03 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c @@ -0,0 +1,223 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: floor backend 0 implementation + last mod: $Id: floor0.c 17558 2010-10-22 00:24:41Z tterribe $ + + ********************************************************************/ + + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "registry.h" +#include "lpc.h" +#include "lsp.h" +#include "codebook.h" +#include "scales.h" +#include "misc.h" +#include "os.h" + +#include "misc.h" +#include + +typedef struct { + int ln; + int m; + int **linearmap; + int n[2]; + + vorbis_info_floor0 *vi; + + long bits; + long frames; +} vorbis_look_floor0; + + +/***********************************************/ + +static void floor0_free_info(vorbis_info_floor *i){ + vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void floor0_free_look(vorbis_look_floor *i){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + if(look){ + + if(look->linearmap){ + + if(look->linearmap[0])_ogg_free(look->linearmap[0]); + if(look->linearmap[1])_ogg_free(look->linearmap[1]); + + _ogg_free(look->linearmap); + } + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int j; + + vorbis_info_floor0 *info=(vorbis_info_floor0*)_ogg_malloc(sizeof(*info)); + info->order=oggpack_read(opb,8); + info->rate=oggpack_read(opb,16); + info->barkmap=oggpack_read(opb,16); + info->ampbits=oggpack_read(opb,6); + info->ampdB=oggpack_read(opb,8); + info->numbooks=oggpack_read(opb,4)+1; + + if(info->order<1)goto err_out; + if(info->rate<1)goto err_out; + if(info->barkmap<1)goto err_out; + if(info->numbooks<1)goto err_out; + + for(j=0;jnumbooks;j++){ + info->books[j]=oggpack_read(opb,8); + if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; + if(ci->book_param[info->books[j]]->maptype==0)goto err_out; + if(ci->book_param[info->books[j]]->dim<1)goto err_out; + } + return(info); + + err_out: + floor0_free_info(info); + return(NULL); +} + +/* initialize Bark scale and normalization lookups. We could do this + with static tables, but Vorbis allows a number of possible + combinations, so it's best to do it computationally. + + The below is authoritative in terms of defining scale mapping. + Note that the scale depends on the sampling rate as well as the + linear block and mapping sizes */ + +static void floor0_map_lazy_init(vorbis_block *vb, + vorbis_info_floor *infoX, + vorbis_look_floor0 *look){ + if(!look->linearmap[vb->W]){ + vorbis_dsp_state *vd=vb->vd; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_floor0 *info=(vorbis_info_floor0 *)infoX; + int W=vb->W; + int n=ci->blocksizes[W]/2,j; + + /* we choose a scaling constant so that: + floor(bark(rate/2-1)*C)=mapped-1 + floor(bark(rate/2)*C)=mapped */ + float scale=look->ln/toBARK(info->rate/2.f); + + /* the mapping from a linear scale to a smaller bark scale is + straightforward. We do *not* make sure that the linear mapping + does not skip bark-scale bins; the decoder simply skips them and + the encoder may do what it wishes in filling them. They're + necessary in some mapping combinations to keep the scale spacing + accurate */ + look->linearmap[W]=(int*)_ogg_malloc((n+1)*sizeof(**look->linearmap)); + for(j=0;jrate/2.f)/n*j) + *scale); /* bark numbers represent band edges */ + if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ + look->linearmap[W][j]=val; + } + look->linearmap[W][j]=-1; + look->n[W]=n; + } +} + +static vorbis_look_floor *floor0_look(vorbis_dsp_state* /* vd */, + vorbis_info_floor *i){ + vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; + vorbis_look_floor0 *look=(vorbis_look_floor0*)_ogg_calloc(1,sizeof(*look)); + look->m=info->order; + look->ln=info->barkmap; + look->vi=info; + + look->linearmap=(int**)_ogg_calloc(2,sizeof(*look->linearmap)); + + return look; +} + +static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + vorbis_info_floor0 *info=look->vi; + int j,k; + + int ampraw=oggpack_read(&vb->opb,info->ampbits); + if(ampraw>0){ /* also handles the -1 out of data case */ + long maxval=(1<ampbits)-1; + float amp=(float)ampraw/maxval*info->ampdB; + int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks)); + + if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + codebook *b=ci->fullbooks+info->books[booknum]; + float last=0.f; + + /* the additional b->dim is a guard against any possible stack + smash; b->dim is provably more than we can overflow the + vector */ + float *lsp=(float*)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1)); + + for(j=0;jm;j+=b->dim) + if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim)==-1)goto eop; + for(j=0;jm;){ + for(k=0;kdim;k++,j++)lsp[j]+=last; + last=lsp[j-1]; + } + + lsp[look->m]=amp; + return(lsp); + } + } + eop: + return(NULL); +} + +static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, + void *memo,float *out){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + vorbis_info_floor0 *info=look->vi; + + floor0_map_lazy_init(vb,info,look); + + if(memo){ + float *lsp=(float *)memo; + float amp=lsp[look->m]; + + /* take the coefficients back to a spectral envelope curve */ + vorbis_lsp_to_curve(out, + look->linearmap[vb->W], + look->n[vb->W], + look->ln, + lsp,look->m,amp,(float)info->ampdB); + return(1); + } + memset(out,0,sizeof(*out)*look->n[vb->W]); + return(0); +} + +/* export hooks */ +const vorbis_func_floor floor0_exportbundle={ + NULL,&floor0_unpack,&floor0_look,&floor0_free_info, + &floor0_free_look,&floor0_inverse1,&floor0_inverse2 +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c new file mode 100644 index 0000000000..8ea1978962 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c @@ -0,0 +1,1080 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: floor backend 1 implementation + last mod: $Id: floor1.c 17555 2010-10-21 18:14:51Z tterribe $ + + ********************************************************************/ + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "scales.h" + +#include + +#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ + +typedef struct lsfit_acc{ + int x0; + int x1; + + int xa; + int ya; + int x2a; + int y2a; + int xya; + int an; + + int xb; + int yb; + int x2b; + int y2b; + int xyb; + int bn; +} lsfit_acc; + +/***********************************************/ + +static void floor1_free_info(vorbis_info_floor *i){ + vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void floor1_free_look(vorbis_look_floor *i){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; + if(look){ + /*fprintf(stderr,"floor 1 bit usage %f:%f (%f total)\n", + (float)look->phrasebits/look->frames, + (float)look->postbits/look->frames, + (float)(look->postbits+look->phrasebits)/look->frames);*/ + + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static void floor1_pack (vorbis_info_floor *i,oggpack_buffer *opb){ + vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; + int j,k; + int count=0; + int rangebits; + int maxposit=info->postlist[1]; + int maxclass=-1; + + /* save out partitions */ + oggpack_write(opb,info->partitions,5); /* only 0 to 31 legal */ + for(j=0;jpartitions;j++){ + oggpack_write(opb,info->partitionclass[j],4); /* only 0 to 15 legal */ + if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; + } + + /* save out partition classes */ + for(j=0;jclass_dim[j]-1,3); /* 1 to 8 */ + oggpack_write(opb,info->class_subs[j],2); /* 0 to 3 */ + if(info->class_subs[j])oggpack_write(opb,info->class_book[j],8); + for(k=0;k<(1<class_subs[j]);k++) + oggpack_write(opb,info->class_subbook[j][k]+1,8); + } + + /* save out the post list */ + oggpack_write(opb,info->mult-1,2); /* only 1,2,3,4 legal now */ + oggpack_write(opb,ilog2(maxposit),4); + rangebits=ilog2(maxposit); + + for(j=0,k=0;jpartitions;j++){ + count+=info->class_dim[info->partitionclass[j]]; + for(;kpostlist[k+2],rangebits); + } +} + +static int icomp(const void *a,const void *b){ + return(**(int **)a-**(int **)b); +} + +static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int j,k,count=0,maxclass=-1,rangebits; + + vorbis_info_floor1 *info=(vorbis_info_floor1*)_ogg_calloc(1,sizeof(*info)); + /* read partitions */ + info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ + for(j=0;jpartitions;j++){ + info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ + if(info->partitionclass[j]<0)goto err_out; + if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; + } + + /* read partition classes */ + for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ + info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ + if(info->class_subs[j]<0) + goto err_out; + if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); + if(info->class_book[j]<0 || info->class_book[j]>=ci->books) + goto err_out; + for(k=0;k<(1<class_subs[j]);k++){ + info->class_subbook[j][k]=oggpack_read(opb,8)-1; + if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) + goto err_out; + } + } + + /* read the post list */ + info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ + rangebits=oggpack_read(opb,4); + if(rangebits<0)goto err_out; + + for(j=0,k=0;jpartitions;j++){ + count+=info->class_dim[info->partitionclass[j]]; + for(;kpostlist[k+2]=oggpack_read(opb,rangebits); + if(t<0 || t>=(1<postlist[0]=0; + info->postlist[1]=1<postlist+j; + qsort(sortpointer,count+2,sizeof(*sortpointer),icomp); + + for(j=1;jvi=info; + look->n=info->postlist[1]; + + /* we drop each position value in-between already decoded values, + and use linear interpolation to predict each new value past the + edges. The positions are read in the order of the position + list... we precompute the bounding positions in the lookup. Of + course, the neighbors can change (if a position is declined), but + this is an initial mapping */ + + for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; + n+=2; + look->posts=n; + + /* also store a sorted position index */ + for(i=0;ipostlist+i; + qsort(sortpointer,n,sizeof(*sortpointer),icomp); + + /* points from sort order back to range number */ + for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; + /* points from range order to sorted position */ + for(i=0;ireverse_index[look->forward_index[i]]=i; + /* we actually need the post values too */ + for(i=0;isorted_index[i]=info->postlist[look->forward_index[i]]; + + /* quantize values to multiplier spec */ + switch(info->mult){ + case 1: /* 1024 -> 256 */ + look->quant_q=256; + break; + case 2: /* 1024 -> 128 */ + look->quant_q=128; + break; + case 3: /* 1024 -> 86 */ + look->quant_q=86; + break; + case 4: /* 1024 -> 64 */ + look->quant_q=64; + break; + } + + /* discover our neighbors for decode where we don't use fit flags + (that would push the neighbors outward) */ + for(i=0;in; + int currentx=info->postlist[i+2]; + for(j=0;jpostlist[j]; + if(x>lx && xcurrentx){ + hi=j; + hx=x; + } + } + look->loneighbor[i]=lo; + look->hineighbor[i]=hi; + } + + return(look); +} + +static int render_point(int x0,int x1,int y0,int y1,int x){ + y0&=0x7fff; /* mask off flag */ + y1&=0x7fff; + + { + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int err=ady*(x-x0); + + int off=err/adx; + if(dy<0)return(y0-off); + return(y0+off); + } +} + +static int vorbis_dBquant(const float *x){ + int i= *x*7.3142857f+1023.5f; + if(i>1023)return(1023); + if(i<0)return(0); + return i; +} + +static const float FLOOR1_fromdB_LOOKUP[256]={ + 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, + 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, + 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, + 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, + 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, + 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, + 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, + 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, + 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, + 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, + 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, + 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, + 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, + 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, + 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, + 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, + 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, + 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, + 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, + 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, + 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, + 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, + 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, + 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, + 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, + 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, + 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, + 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, + 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, + 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, + 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, + 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, + 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, + 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, + 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, + 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, + 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, + 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, + 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, + 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, + 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, + 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, + 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, + 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, + 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, + 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, + 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, + 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, + 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, + 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, + 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, + 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, + 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, + 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, + 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, + 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, + 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, + 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, + 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, + 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, + 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, + 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, + 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, + 0.82788260F, 0.88168307F, 0.9389798F, 1.F, +}; + +static void render_line(int n, int x0,int x1,int y0,int y1,float *d){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + + ady-=abs(base*adx); + + if(n>x1)n=x1; + + if(x=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + d[x]*=FLOOR1_fromdB_LOOKUP[y]; + } +} + +static void render_line0(int n, int x0,int x1,int y0,int y1,int *d){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + + ady-=abs(base*adx); + + if(n>x1)n=x1; + + if(x=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + d[x]=y; + } +} + +/* the floor has already been filtered to only include relevant sections */ +static int accumulate_fit(const float *flr,const float *mdct, + int x0, int x1,lsfit_acc *a, + int n,vorbis_info_floor1 *info){ + long i; + + int xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0; + + memset(a,0,sizeof(*a)); + a->x0=x0; + a->x1=x1; + if(x1>=n)x1=n-1; + + for(i=x0;i<=x1;i++){ + int quantized=vorbis_dBquant(flr+i); + if(quantized){ + if(mdct[i]+info->twofitatten>=flr[i]){ + xa += i; + ya += quantized; + x2a += i*i; + y2a += quantized*quantized; + xya += i*quantized; + na++; + }else{ + xb += i; + yb += quantized; + x2b += i*i; + y2b += quantized*quantized; + xyb += i*quantized; + nb++; + } + } + } + + a->xa=xa; + a->ya=ya; + a->x2a=x2a; + a->y2a=y2a; + a->xya=xya; + a->an=na; + + a->xb=xb; + a->yb=yb; + a->x2b=x2b; + a->y2b=y2b; + a->xyb=xyb; + a->bn=nb; + + return(na); +} + +static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1, + vorbis_info_floor1 *info){ + double xb=0,yb=0,x2b=0,y2b=0,xyb=0,bn=0; + int i; + int x0=a[0].x0; + int x1=a[fits-1].x1; + + for(i=0;itwofitweight/(a[i].an+1)+1.; + + xb+=a[i].xb + a[i].xa * weight; + yb+=a[i].yb + a[i].ya * weight; + x2b+=a[i].x2b + a[i].x2a * weight; + y2b+=a[i].y2b + a[i].y2a * weight; + xyb+=a[i].xyb + a[i].xya * weight; + bn+=a[i].bn + a[i].an * weight; + } + + if(*y0>=0){ + xb+= x0; + yb+= *y0; + x2b+= x0 * x0; + //y2b+= *y0 * *y0; + xyb+= *y0 * x0; + bn++; + } + + if(*y1>=0){ + xb+= x1; + yb+= *y1; + x2b+= x1 * x1; + //y2b+= *y1 * *y1; + xyb+= *y1 * x1; + bn++; + } + + { + double denom=(bn*x2b-xb*xb); + + if(denom>0.){ + double a=(yb*x2b-xyb*xb)/denom; + double b=(bn*xyb-xb*yb)/denom; + *y0=rint(a+b*x0); + *y1=rint(a+b*x1); + + /* limit to our range! */ + if(*y0>1023)*y0=1023; + if(*y1>1023)*y1=1023; + if(*y0<0)*y0=0; + if(*y1<0)*y1=0; + + return 0; + }else{ + *y0=0; + *y1=0; + return 1; + } + } +} + +static int inspect_error(int x0,int x1,int y0,int y1,const float *mask, + const float *mdct, + vorbis_info_floor1 *info){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + int val=vorbis_dBquant(mask+x); + int mse=0; + int n=0; + + ady-=abs(base*adx); + + mse=(y-val); + mse*=mse; + n++; + if(mdct[x]+info->twofitatten>=mask[x]){ + if(y+info->maxovermaxunder>val)return(1); + } + + while(++x=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + + val=vorbis_dBquant(mask+x); + mse+=((y-val)*(y-val)); + n++; + if(mdct[x]+info->twofitatten>=mask[x]){ + if(val){ + if(y+info->maxovermaxunder>val)return(1); + } + } + } + + if(info->maxover*info->maxover/n>info->maxerr)return(0); + if(info->maxunder*info->maxunder/n>info->maxerr)return(0); + if(mse/n>info->maxerr)return(1); + return(0); +} + +static int post_Y(int *A,int *B,int pos){ + if(A[pos]<0) + return B[pos]; + if(B[pos]<0) + return A[pos]; + + return (A[pos]+B[pos])>>1; +} + +int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look, + const float *logmdct, /* in */ + const float *logmask){ + long i,j; + vorbis_info_floor1 *info=look->vi; + long n=look->n; + long posts=look->posts; + long nonzero=0; + lsfit_acc fits[VIF_POSIT+1]; + int fit_valueA[VIF_POSIT+2]; /* index by range list position */ + int fit_valueB[VIF_POSIT+2]; /* index by range list position */ + + int loneighbor[VIF_POSIT+2]; /* sorted index of range list position (+2) */ + int hineighbor[VIF_POSIT+2]; + int *output=NULL; + int memo[VIF_POSIT+2]; + + for(i=0;isorted_index[i], + look->sorted_index[i+1],fits+i, + n,info); + } + + if(nonzero){ + /* start by fitting the implicit base case.... */ + int y0=-200; + int y1=-200; + fit_line(fits,posts-1,&y0,&y1,info); + + fit_valueA[0]=y0; + fit_valueB[0]=y0; + fit_valueB[1]=y1; + fit_valueA[1]=y1; + + /* Non degenerate case */ + /* start progressive splitting. This is a greedy, non-optimal + algorithm, but simple and close enough to the best + answer. */ + for(i=2;ireverse_index[i]; + int ln=loneighbor[sortpos]; + int hn=hineighbor[sortpos]; + + /* eliminate repeat searches of a particular range with a memo */ + if(memo[ln]!=hn){ + /* haven't performed this error search yet */ + int lsortpos=look->reverse_index[ln]; + int hsortpos=look->reverse_index[hn]; + memo[ln]=hn; + + { + /* A note: we want to bound/minimize *local*, not global, error */ + int lx=info->postlist[ln]; + int hx=info->postlist[hn]; + int ly=post_Y(fit_valueA,fit_valueB,ln); + int hy=post_Y(fit_valueA,fit_valueB,hn); + + if(ly==-1 || hy==-1){ + exit(1); + } + + if(inspect_error(lx,hx,ly,hy,logmask,logmdct,info)){ + /* outside error bounds/begin search area. Split it. */ + int ly0=-200; + int ly1=-200; + int hy0=-200; + int hy1=-200; + int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1,info); + int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1,info); + + if(ret0){ + ly0=ly; + ly1=hy0; + } + if(ret1){ + hy0=ly1; + hy1=hy; + } + + if(ret0 && ret1){ + fit_valueA[i]=-200; + fit_valueB[i]=-200; + }else{ + /* store new edge values */ + fit_valueB[ln]=ly0; + if(ln==0)fit_valueA[ln]=ly0; + fit_valueA[i]=ly1; + fit_valueB[i]=hy0; + fit_valueA[hn]=hy1; + if(hn==1)fit_valueB[hn]=hy1; + + if(ly1>=0 || hy0>=0){ + /* store new neighbor values */ + for(j=sortpos-1;j>=0;j--) + if(hineighbor[j]==hn) + hineighbor[j]=i; + else + break; + for(j=sortpos+1;jloneighbor[i-2]; + int hn=look->hineighbor[i-2]; + int x0=info->postlist[ln]; + int x1=info->postlist[hn]; + int y0=output[ln]; + int y1=output[hn]; + + int predicted=render_point(x0,x1,y0,y1,info->postlist[i]); + int vx=post_Y(fit_valueA,fit_valueB,i); + + if(vx>=0 && predicted!=vx){ + output[i]=vx; + }else{ + output[i]= predicted|0x8000; + } + } + } + + return(output); + +} + +int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look, + int *A,int *B, + int del){ + + long i; + long posts=look->posts; + int *output=NULL; + + if(A && B){ + output=(int*)_vorbis_block_alloc(vb,sizeof(*output)*posts); + + /* overly simpleminded--- look again post 1.2 */ + for(i=0;i>16; + if(A[i]&0x8000 && B[i]&0x8000)output[i]|=0x8000; + } + } + + return(output); +} + + +int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, + vorbis_look_floor1 *look, + int *post,int *ilogmask){ + + long i,j; + vorbis_info_floor1 *info=look->vi; + long posts=look->posts; + codec_setup_info *ci=(codec_setup_info*)vb->vd->vi->codec_setup; + int out[VIF_POSIT+2]; + static_codebook **sbooks=ci->book_param; + codebook *books=ci->fullbooks; + + /* quantize values to multiplier spec */ + if(post){ + for(i=0;imult){ + case 1: /* 1024 -> 256 */ + val>>=2; + break; + case 2: /* 1024 -> 128 */ + val>>=3; + break; + case 3: /* 1024 -> 86 */ + val/=12; + break; + case 4: /* 1024 -> 64 */ + val>>=4; + break; + } + post[i]=val | (post[i]&0x8000); + } + + out[0]=post[0]; + out[1]=post[1]; + + /* find prediction values for each post and subtract them */ + for(i=2;iloneighbor[i-2]; + int hn=look->hineighbor[i-2]; + int x0=info->postlist[ln]; + int x1=info->postlist[hn]; + int y0=post[ln]; + int y1=post[hn]; + + int predicted=render_point(x0,x1,y0,y1,info->postlist[i]); + + if((post[i]&0x8000) || (predicted==post[i])){ + post[i]=predicted|0x8000; /* in case there was roundoff jitter + in interpolation */ + out[i]=0; + }else{ + int headroom=(look->quant_q-predictedquant_q-predicted:predicted); + + int val=post[i]-predicted; + + /* at this point the 'deviation' value is in the range +/- max + range, but the real, unique range can always be mapped to + only [0-maxrange). So we want to wrap the deviation into + this limited range, but do it in the way that least screws + an essentially gaussian probability distribution. */ + + if(val<0) + if(val<-headroom) + val=headroom-val-1; + else + val=-1-(val<<1); + else + if(val>=headroom) + val= val+headroom; + else + val<<=1; + + out[i]=val; + post[ln]&=0x7fff; + post[hn]&=0x7fff; + } + } + + /* we have everything we need. pack it out */ + /* mark nontrivial floor */ + oggpack_write(opb,1,1); + + /* beginning/end post */ + look->frames++; + look->postbits+=ilog(look->quant_q-1)*2; + oggpack_write(opb,out[0],ilog(look->quant_q-1)); + oggpack_write(opb,out[1],ilog(look->quant_q-1)); + + + /* partition by partition */ + for(i=0,j=2;ipartitions;i++){ + int classx=info->partitionclass[i]; + int cdim=info->class_dim[classx]; + int csubbits=info->class_subs[classx]; + int csub=1<class_subbook[classx][k]; + if(booknum<0){ + maxval[k]=1; + }else{ + maxval[k]=sbooks[info->class_subbook[classx][k]]->entries; + } + } + for(k=0;kphrasebits+= + vorbis_book_encode(books+info->class_book[classx],cval,opb); + +#ifdef TRAIN_FLOOR1 + { + FILE *of; + char buffer[80]; + sprintf(buffer,"line_%dx%ld_class%d.vqd", + vb->pcmend/2,posts-2,class); + of=fopen(buffer,"a"); + fprintf(of,"%d\n",cval); + fclose(of); + } +#endif + } + + /* write post values */ + for(k=0;kclass_subbook[classx][bookas[k]]; + if(book>=0){ + /* hack to allow training with 'bad' books */ + if(out[j+k]<(books+book)->entries) + look->postbits+=vorbis_book_encode(books+book, + out[j+k],opb); + /*else + fprintf(stderr,"+!");*/ + +#ifdef TRAIN_FLOOR1 + { + FILE *of; + char buffer[80]; + sprintf(buffer,"line_%dx%ld_%dsub%d.vqd", + vb->pcmend/2,posts-2,class,bookas[k]); + of=fopen(buffer,"a"); + fprintf(of,"%d\n",out[j+k]); + fclose(of); + } +#endif + } + } + j+=cdim; + } + + { + /* generate quantized floor equivalent to what we'd unpack in decode */ + /* render the lines */ + int hx=0; + int lx=0; + int ly=post[0]*info->mult; + int n=ci->blocksizes[vb->W]/2; + + for(j=1;jposts;j++){ + int current=look->forward_index[j]; + int hy=post[current]&0x7fff; + if(hy==post[current]){ + + hy*=info->mult; + hx=info->postlist[current]; + + render_line0(n,lx,hx,ly,hy,ilogmask); + + lx=hx; + ly=hy; + } + } + for(j=hx;jpcmend/2;j++)ilogmask[j]=ly; /* be certain */ + return(1); + } + }else{ + oggpack_write(opb,0,1); + memset(ilogmask,0,vb->pcmend/2*sizeof(*ilogmask)); + return(0); + } +} + +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + codec_setup_info *ci=(codec_setup_info*)vb->vd->vi->codec_setup; + + int i,j,k; + codebook *books=ci->fullbooks; + + /* unpack wrapped/predicted values from stream */ + if(oggpack_read(&vb->opb,1)==1){ + int *fit_value=(int*)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); + + fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); + fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); + + /* partition by partition */ + for(i=0,j=2;ipartitions;i++){ + int classx=info->partitionclass[i]; + int cdim=info->class_dim[classx]; + int csubbits=info->class_subs[classx]; + int csub=1<class_book[classx],&vb->opb); + + if(cval==-1)goto eop; + } + + for(k=0;kclass_subbook[classx][cval&(csub-1)]; + cval>>=csubbits; + if(book>=0){ + if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) + goto eop; + }else{ + fit_value[j+k]=0; + } + } + j+=cdim; + } + + /* unwrap positive values and reconsitute via linear interpolation */ + for(i=2;iposts;i++){ + int predicted=render_point(info->postlist[look->loneighbor[i-2]], + info->postlist[look->hineighbor[i-2]], + fit_value[look->loneighbor[i-2]], + fit_value[look->hineighbor[i-2]], + info->postlist[i]); + int hiroom=look->quant_q-predicted; + int loroom=predicted; + int room=(hiroom=room){ + if(hiroom>loroom){ + val = val-loroom; + }else{ + val = -1-(val-hiroom); + } + }else{ + if(val&1){ + val= -((val+1)>>1); + }else{ + val>>=1; + } + } + + fit_value[i] = (val + predicted) & 0x7fff; + fit_value[look->loneighbor[i-2]]&=0x7fff; + fit_value[look->hineighbor[i-2]]&=0x7fff; + + }else{ + fit_value[i]=predicted|0x8000; + } + + } + + return(fit_value); + } + eop: + return(NULL); +} + +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, + float *out){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + + codec_setup_info *ci=(codec_setup_info*)vb->vd->vi->codec_setup; + int n=ci->blocksizes[vb->W]/2; + int j; + + if(memo){ + /* render the lines */ + int *fit_value=(int *)memo; + int hx=0; + int lx=0; + int ly=fit_value[0]*info->mult; + /* guard lookup against out-of-range values */ + ly=(ly<0?0:ly>255?255:ly); + + for(j=1;jposts;j++){ + int current=look->forward_index[j]; + int hy=fit_value[current]&0x7fff; + if(hy==fit_value[current]){ + + hx=info->postlist[current]; + hy*=info->mult; + /* guard lookup against out-of-range values */ + hy=(hy<0?0:hy>255?255:hy); + + render_line(n,lx,hx,ly,hy,out); + + lx=hx; + ly=hy; + } + } + for(j=hx;j header packets + last mod: $Id: info.c 17584 2010-11-01 19:26:16Z xiphmont $ + + ********************************************************************/ + +/* general handling of the header and the vorbis_info structure (and + substructures) */ + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "codebook.h" +#include "registry.h" +#include "window.h" +#include "psy.h" +#include "misc.h" +#include "os.h" + +#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.2" +#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20101101 (Schaufenugget)" + +/* helpers */ + +static void _v_writestring(oggpack_buffer *o,const char *s, int bytes){ + + while(bytes--){ + oggpack_write(o,*s++,8); + } +} + +static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ + while(bytes--){ + *buf++=oggpack_read(o,8); + } +} + +void vorbis_comment_init(vorbis_comment *vc){ + memset(vc,0,sizeof(*vc)); +} + +void vorbis_comment_add(vorbis_comment *vc,const char *comment){ + vc->user_comments=(char**)_ogg_realloc(vc->user_comments, + (vc->comments+2)*sizeof(*vc->user_comments)); + vc->comment_lengths=(int*)_ogg_realloc(vc->comment_lengths, + (vc->comments+2)*sizeof(*vc->comment_lengths)); + vc->comment_lengths[vc->comments]=strlen(comment); + vc->user_comments[vc->comments]=(char*)_ogg_malloc(vc->comment_lengths[vc->comments]+1); + strcpy(vc->user_comments[vc->comments], comment); + vc->comments++; + vc->user_comments[vc->comments]=NULL; +} + +void vorbis_comment_add_tag(vorbis_comment *vc, const char *tag, const char *contents){ + char *comment=(char*)alloca(strlen(tag)+strlen(contents)+2); /* +2 for = and \0 */ + strcpy(comment, tag); + strcat(comment, "="); + strcat(comment, contents); + vorbis_comment_add(vc, comment); +} + +/* This is more or less the same as strncasecmp - but that doesn't exist + * everywhere, and this is a fairly trivial function, so we include it */ +static int tagcompare(const char *s1, const char *s2, int n){ + int c=0; + while(c < n){ + if(toupper(s1[c]) != toupper(s2[c])) + return !0; + c++; + } + return 0; +} + +char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count){ + long i; + int found = 0; + int taglen = strlen(tag)+1; /* +1 for the = we append */ + char *fulltag = (char*)alloca(taglen+ 1); + + strcpy(fulltag, tag); + strcat(fulltag, "="); + + for(i=0;icomments;i++){ + if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ + if(count == found) + /* We return a pointer to the data, not a copy */ + return vc->user_comments[i] + taglen; + else + found++; + } + } + return NULL; /* didn't find anything */ +} + +int vorbis_comment_query_count(vorbis_comment *vc, const char *tag){ + int i,count=0; + int taglen = strlen(tag)+1; /* +1 for the = we append */ + char *fulltag = (char*)alloca(taglen+1); + strcpy(fulltag,tag); + strcat(fulltag, "="); + + for(i=0;icomments;i++){ + if(!tagcompare(vc->user_comments[i], fulltag, taglen)) + count++; + } + + return count; +} + +void vorbis_comment_clear(vorbis_comment *vc){ + if(vc){ + long i; + if(vc->user_comments){ + for(i=0;icomments;i++) + if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); + _ogg_free(vc->user_comments); + } + if(vc->comment_lengths)_ogg_free(vc->comment_lengths); + if(vc->vendor)_ogg_free(vc->vendor); + memset(vc,0,sizeof(*vc)); + } +} + +/* blocksize 0 is guaranteed to be short, 1 is guaranteed to be long. + They may be equal, but short will never ge greater than long */ +int vorbis_info_blocksize(vorbis_info *vi,int zo){ + codec_setup_info *ci = (codec_setup_info*)vi->codec_setup; + return ci ? ci->blocksizes[zo] : -1; +} + +/* used by synthesis, which has a full, alloced vi */ +void vorbis_info_init(vorbis_info *vi){ + memset(vi,0,sizeof(*vi)); + vi->codec_setup=_ogg_calloc(1,sizeof(codec_setup_info)); +} + +void vorbis_info_clear(vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int i; + + if(ci){ + + for(i=0;imodes;i++) + if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); + + for(i=0;imaps;i++) /* unpack does the range checking */ + if(ci->map_param[i]) /* this may be cleaning up an aborted + unpack, in which case the below type + cannot be trusted */ + _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); + + for(i=0;ifloors;i++) /* unpack does the range checking */ + if(ci->floor_param[i]) /* this may be cleaning up an aborted + unpack, in which case the below type + cannot be trusted */ + _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); + + for(i=0;iresidues;i++) /* unpack does the range checking */ + if(ci->residue_param[i]) /* this may be cleaning up an aborted + unpack, in which case the below type + cannot be trusted */ + _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); + + for(i=0;ibooks;i++){ + if(ci->book_param[i]){ + /* knows if the book was not alloced */ + vorbis_staticbook_destroy(ci->book_param[i]); + } + if(ci->fullbooks) + vorbis_book_clear(ci->fullbooks+i); + } + if(ci->fullbooks) + _ogg_free(ci->fullbooks); + + for(i=0;ipsys;i++) + _vi_psy_free(ci->psy_param[i]); + + _ogg_free(ci); + } + + memset(vi,0,sizeof(*vi)); +} + +/* Header packing/unpacking ********************************************/ + +static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + if(!ci)return(OV_EFAULT); + + vi->version=oggpack_read(opb,32); + if(vi->version!=0)return(OV_EVERSION); + + vi->channels=oggpack_read(opb,8); + vi->rate=oggpack_read(opb,32); + + vi->bitrate_upper=oggpack_read(opb,32); + vi->bitrate_nominal=oggpack_read(opb,32); + vi->bitrate_lower=oggpack_read(opb,32); + + ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; + if(vi->channels<1)goto err_out; + if(ci->blocksizes[0]<64)goto err_out; + if(ci->blocksizes[1]blocksizes[0])goto err_out; + if(ci->blocksizes[1]>8192)goto err_out; + + if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ + + return(0); + err_out: + vorbis_info_clear(vi); + return(OV_EBADHEADER); +} + +static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ + int i; + int vendorlen=oggpack_read(opb,32); + if(vendorlen<0)goto err_out; + if(vendorlen>opb->storage-8)goto err_out; + vc->vendor=(char*)_ogg_calloc(vendorlen+1,1); + _v_readstring(opb,vc->vendor,vendorlen); + i=oggpack_read(opb,32); + if(i<0)goto err_out; + if(i>((opb->storage-oggpack_bytes(opb))>>2))goto err_out; + vc->comments=i; + vc->user_comments=(char**)_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments)); + vc->comment_lengths=(int*)_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths)); + + for(i=0;icomments;i++){ + int len=oggpack_read(opb,32); + if(len<0)goto err_out; + if(len>opb->storage-oggpack_bytes(opb))goto err_out; + vc->comment_lengths[i]=len; + vc->user_comments[i]=(char*)_ogg_calloc(len+1,1); + _v_readstring(opb,vc->user_comments[i],len); + } + if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ + + return(0); + err_out: + vorbis_comment_clear(vc); + return(OV_EBADHEADER); +} + +/* all of the real encoding details are here. The modes, books, + everything */ +static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int i; + if(!ci)return(OV_EFAULT); + + /* codebooks */ + ci->books=oggpack_read(opb,8)+1; + if(ci->books<=0)goto err_out; + for(i=0;ibooks;i++){ + ci->book_param[i]=vorbis_staticbook_unpack(opb); + if(!ci->book_param[i])goto err_out; + } + + /* time backend settings; hooks are unused */ + { + int times=oggpack_read(opb,6)+1; + if(times<=0)goto err_out; + for(i=0;i=VI_TIMEB)goto err_out; + } + } + + /* floor backend settings */ + ci->floors=oggpack_read(opb,6)+1; + if(ci->floors<=0)goto err_out; + for(i=0;ifloors;i++){ + ci->floor_type[i]=oggpack_read(opb,16); + if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; + ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); + if(!ci->floor_param[i])goto err_out; + } + + /* residue backend settings */ + ci->residues=oggpack_read(opb,6)+1; + if(ci->residues<=0)goto err_out; + for(i=0;iresidues;i++){ + ci->residue_type[i]=oggpack_read(opb,16); + if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; + ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); + if(!ci->residue_param[i])goto err_out; + } + + /* map backend settings */ + ci->maps=oggpack_read(opb,6)+1; + if(ci->maps<=0)goto err_out; + for(i=0;imaps;i++){ + ci->map_type[i]=oggpack_read(opb,16); + if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; + ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); + if(!ci->map_param[i])goto err_out; + } + + /* mode settings */ + ci->modes=oggpack_read(opb,6)+1; + if(ci->modes<=0)goto err_out; + for(i=0;imodes;i++){ + ci->mode_param[i]=(vorbis_info_mode*)_ogg_calloc(1,sizeof(*ci->mode_param[i])); + ci->mode_param[i]->blockflag=oggpack_read(opb,1); + ci->mode_param[i]->windowtype=oggpack_read(opb,16); + ci->mode_param[i]->transformtype=oggpack_read(opb,16); + ci->mode_param[i]->mapping=oggpack_read(opb,8); + + if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; + if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; + if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; + if(ci->mode_param[i]->mapping<0)goto err_out; + } + + if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ + + return(0); + err_out: + vorbis_info_clear(vi); + return(OV_EBADHEADER); +} + +/* Is this packet a vorbis ID header? */ +int vorbis_synthesis_idheader(ogg_packet *op){ + oggpack_buffer opb; + char buffer[6]; + + if(op){ + oggpack_readinit(&opb,op->packet,op->bytes); + + if(!op->b_o_s) + return(0); /* Not the initial packet */ + + if(oggpack_read(&opb,8) != 1) + return 0; /* not an ID header */ + + memset(buffer,0,6); + _v_readstring(&opb,buffer,6); + if(memcmp(buffer,"vorbis",6)) + return 0; /* not vorbis */ + + return 1; + } + + return 0; +} + +/* The Vorbis header is in three packets; the initial small packet in + the first page that identifies basic parameters, a second packet + with bitstream comments and a third packet that holds the + codebook. */ + +int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ + oggpack_buffer opb; + + if(op){ + oggpack_readinit(&opb,op->packet,op->bytes); + + /* Which of the three types of header is this? */ + /* Also verify header-ness, vorbis */ + { + char buffer[6]; + int packtype=oggpack_read(&opb,8); + memset(buffer,0,6); + _v_readstring(&opb,buffer,6); + if(memcmp(buffer,"vorbis",6)){ + /* not a vorbis header */ + return(OV_ENOTVORBIS); + } + switch(packtype){ + case 0x01: /* least significant *bit* is read first */ + if(!op->b_o_s){ + /* Not the initial packet */ + return(OV_EBADHEADER); + } + if(vi->rate!=0){ + /* previously initialized info header */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_info(vi,&opb)); + + case 0x03: /* least significant *bit* is read first */ + if(vi->rate==0){ + /* um... we didn't get the initial header */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_comment(vc,&opb)); + + case 0x05: /* least significant *bit* is read first */ + if(vi->rate==0 || vc->vendor==NULL){ + /* um... we didn;t get the initial header or comments yet */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_books(vi,&opb)); + + default: + /* Not a valid vorbis header type */ + return(OV_EBADHEADER); + break; + } + } + } + return(OV_EBADHEADER); +} + +/* pack side **********************************************************/ + +static int _vorbis_pack_info(oggpack_buffer *opb,vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + if(!ci)return(OV_EFAULT); + + /* preamble */ + oggpack_write(opb,0x01,8); + _v_writestring(opb,"vorbis", 6); + + /* basic information about the stream */ + oggpack_write(opb,0x00,32); + oggpack_write(opb,vi->channels,8); + oggpack_write(opb,vi->rate,32); + + oggpack_write(opb,vi->bitrate_upper,32); + oggpack_write(opb,vi->bitrate_nominal,32); + oggpack_write(opb,vi->bitrate_lower,32); + + oggpack_write(opb,ilog2(ci->blocksizes[0]),4); + oggpack_write(opb,ilog2(ci->blocksizes[1]),4); + oggpack_write(opb,1,1); + + return(0); +} + +static int _vorbis_pack_comment(oggpack_buffer *opb,vorbis_comment *vc){ + int bytes = strlen(ENCODE_VENDOR_STRING); + + /* preamble */ + oggpack_write(opb,0x03,8); + _v_writestring(opb,"vorbis", 6); + + /* vendor */ + oggpack_write(opb,bytes,32); + _v_writestring(opb,ENCODE_VENDOR_STRING, bytes); + + /* comments */ + + oggpack_write(opb,vc->comments,32); + if(vc->comments){ + int i; + for(i=0;icomments;i++){ + if(vc->user_comments[i]){ + oggpack_write(opb,vc->comment_lengths[i],32); + _v_writestring(opb,vc->user_comments[i], vc->comment_lengths[i]); + }else{ + oggpack_write(opb,0,32); + } + } + } + oggpack_write(opb,1,1); + + return(0); +} + +static int _vorbis_pack_books(oggpack_buffer *opb,vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int i; + if(!ci)return(OV_EFAULT); + + oggpack_write(opb,0x05,8); + _v_writestring(opb,"vorbis", 6); + + /* books */ + oggpack_write(opb,ci->books-1,8); + for(i=0;ibooks;i++) + if(vorbis_staticbook_pack(ci->book_param[i],opb))goto err_out; + + /* times; hook placeholders */ + oggpack_write(opb,0,6); + oggpack_write(opb,0,16); + + /* floors */ + oggpack_write(opb,ci->floors-1,6); + for(i=0;ifloors;i++){ + oggpack_write(opb,ci->floor_type[i],16); + if(_floor_P[ci->floor_type[i]]->pack) + _floor_P[ci->floor_type[i]]->pack(ci->floor_param[i],opb); + else + goto err_out; + } + + /* residues */ + oggpack_write(opb,ci->residues-1,6); + for(i=0;iresidues;i++){ + oggpack_write(opb,ci->residue_type[i],16); + _residue_P[ci->residue_type[i]]->pack(ci->residue_param[i],opb); + } + + /* maps */ + oggpack_write(opb,ci->maps-1,6); + for(i=0;imaps;i++){ + oggpack_write(opb,ci->map_type[i],16); + _mapping_P[ci->map_type[i]]->pack(vi,ci->map_param[i],opb); + } + + /* modes */ + oggpack_write(opb,ci->modes-1,6); + for(i=0;imodes;i++){ + oggpack_write(opb,ci->mode_param[i]->blockflag,1); + oggpack_write(opb,ci->mode_param[i]->windowtype,16); + oggpack_write(opb,ci->mode_param[i]->transformtype,16); + oggpack_write(opb,ci->mode_param[i]->mapping,8); + } + oggpack_write(opb,1,1); + + return(0); +err_out: + return(-1); +} + +int vorbis_commentheader_out(vorbis_comment *vc, + ogg_packet *op){ + + oggpack_buffer opb; + + oggpack_writeinit(&opb); + if(_vorbis_pack_comment(&opb,vc)) return OV_EIMPL; + + op->packet = (unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); + memcpy(op->packet, opb.buffer, oggpack_bytes(&opb)); + + op->bytes=oggpack_bytes(&opb); + op->b_o_s=0; + op->e_o_s=0; + op->granulepos=0; + op->packetno=1; + + return 0; +} + +int vorbis_analysis_headerout(vorbis_dsp_state *v, + vorbis_comment *vc, + ogg_packet *op, + ogg_packet *op_comm, + ogg_packet *op_code){ + int ret=OV_EIMPL; + vorbis_info *vi=v->vi; + oggpack_buffer opb; + private_state *b=(private_state*)v->backend_state; + + if(!b){ + ret=OV_EFAULT; + goto err_out; + } + + /* first header packet **********************************************/ + + oggpack_writeinit(&opb); + if(_vorbis_pack_info(&opb,vi))goto err_out; + + /* build the packet */ + if(b->header)_ogg_free(b->header); + b->header=(unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); + memcpy(b->header,opb.buffer,oggpack_bytes(&opb)); + op->packet=b->header; + op->bytes=oggpack_bytes(&opb); + op->b_o_s=1; + op->e_o_s=0; + op->granulepos=0; + op->packetno=0; + + /* second header packet (comments) **********************************/ + + oggpack_reset(&opb); + if(_vorbis_pack_comment(&opb,vc))goto err_out; + + if(b->header1)_ogg_free(b->header1); + b->header1=(unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); + memcpy(b->header1,opb.buffer,oggpack_bytes(&opb)); + op_comm->packet=b->header1; + op_comm->bytes=oggpack_bytes(&opb); + op_comm->b_o_s=0; + op_comm->e_o_s=0; + op_comm->granulepos=0; + op_comm->packetno=1; + + /* third header packet (modes/codebooks) ****************************/ + + oggpack_reset(&opb); + if(_vorbis_pack_books(&opb,vi))goto err_out; + + if(b->header2)_ogg_free(b->header2); + b->header2=(unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); + memcpy(b->header2,opb.buffer,oggpack_bytes(&opb)); + op_code->packet=b->header2; + op_code->bytes=oggpack_bytes(&opb); + op_code->b_o_s=0; + op_code->e_o_s=0; + op_code->granulepos=0; + op_code->packetno=2; + + oggpack_writeclear(&opb); + return(0); + err_out: + memset(op,0,sizeof(*op)); + memset(op_comm,0,sizeof(*op_comm)); + memset(op_code,0,sizeof(*op_code)); + + if(b){ + oggpack_writeclear(&opb); + if(b->header)_ogg_free(b->header); + if(b->header1)_ogg_free(b->header1); + if(b->header2)_ogg_free(b->header2); + b->header=NULL; + b->header1=NULL; + b->header2=NULL; + } + return(ret); +} + +double vorbis_granule_time(vorbis_dsp_state *v,ogg_int64_t granulepos){ + if(granulepos == -1) return -1; + + /* We're not guaranteed a 64 bit unsigned type everywhere, so we + have to put the unsigned granpo in a signed type. */ + if(granulepos>=0){ + return((double)granulepos/v->vi->rate); + }else{ + ogg_int64_t granuleoff=0xffffffff; + granuleoff<<=31; + +#ifdef __GNUC__ + granuleoff |= 0x7ffffffffLL; +#else + granuleoff |= 0x7ffffffff; +#endif + return(((double)granulepos+2+granuleoff+granuleoff)/v->vi->rate); + } +} + +const char *vorbis_version_string(void){ + return GENERAL_VENDOR_STRING; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c new file mode 100644 index 0000000000..953e71a1f6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c @@ -0,0 +1,94 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: lookup based functions + last mod: $Id: lookup.c 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#include +#include "lookup.h" +#include "lookup_data.h" +#include "os.h" +#include "misc.h" + +#ifdef FLOAT_LOOKUP + +/* interpolated lookup based cos function, domain 0 to PI only */ +float vorbis_coslook(float a){ + double d=a*(.31830989*(float)COS_LOOKUP_SZ); + int i=vorbis_ftoi(d-.5); + + return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); +} + +/* interpolated 1./sqrt(p) where .5 <= p < 1. */ +float vorbis_invsqlook(float a){ + double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; + int i=vorbis_ftoi(d-.5f); + return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); +} + +/* interpolated 1./sqrt(p) where .5 <= p < 1. */ +float vorbis_invsq2explook(int a){ + return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; +} + +#include +/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ +float vorbis_fromdBlook(float a){ + int i=vorbis_ftoi(a*((float)(-(1<=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); +} + +#endif + +#ifdef INT_LOOKUP +/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in + 16.16 format + + returns in m.8 format */ +long vorbis_invsqlook_i(long a,long e){ + long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); + long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT); /* 0.16 */ + long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ + (((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])* /* 0.16 */ + d)>>16); /* result 1.16 */ + + e+=32; + if(e&1)val=(val*5792)>>13; /* multiply val by 1/sqrt(2) */ + e=(e>>1)-8; + + return(val>>e); +} + +/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ +/* a is in n.12 format */ +float vorbis_fromdBlook_i(long a){ + int i=(-a)>>(12-FROMdB2_SHIFT); + return (i<0)?1.f: + ((i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); +} + +/* interpolated lookup based cos function, domain 0 to PI only */ +/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ +long vorbis_coslook_i(long a){ + int i=a>>COS_LOOKUP_I_SHIFT; + int d=a&COS_LOOKUP_I_MASK; + return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> + COS_LOOKUP_I_SHIFT); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h new file mode 100644 index 0000000000..0f8fdf4caa --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h @@ -0,0 +1,32 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: lookup based functions + last mod: $Id: lookup.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_LOOKUP_H_ + +#ifdef FLOAT_LOOKUP +extern float vorbis_coslook(float a); +extern float vorbis_invsqlook(float a); +extern float vorbis_invsq2explook(int a); +extern float vorbis_fromdBlook(float a); +#endif +#ifdef INT_LOOKUP +extern long vorbis_invsqlook_i(long a,long e); +extern long vorbis_coslook_i(long a); +extern float vorbis_fromdBlook_i(long a); +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h new file mode 100644 index 0000000000..b12d79a9c4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h @@ -0,0 +1,192 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: lookup data; generated by lookups.pl; edit there + last mod: $Id: lookup_data.h 16037 2009-05-26 21:10:58Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_LOOKUP_DATA_H_ + +#ifdef FLOAT_LOOKUP +#define COS_LOOKUP_SZ 128 +static const float COS_LOOKUP[COS_LOOKUP_SZ+1]={ + +1.0000000000000f,+0.9996988186962f,+0.9987954562052f,+0.9972904566787f, + +0.9951847266722f,+0.9924795345987f,+0.9891765099648f,+0.9852776423889f, + +0.9807852804032f,+0.9757021300385f,+0.9700312531945f,+0.9637760657954f, + +0.9569403357322f,+0.9495281805930f,+0.9415440651830f,+0.9329927988347f, + +0.9238795325113f,+0.9142097557035f,+0.9039892931234f,+0.8932243011955f, + +0.8819212643484f,+0.8700869911087f,+0.8577286100003f,+0.8448535652497f, + +0.8314696123025f,+0.8175848131516f,+0.8032075314806f,+0.7883464276266f, + +0.7730104533627f,+0.7572088465065f,+0.7409511253550f,+0.7242470829515f, + +0.7071067811865f,+0.6895405447371f,+0.6715589548470f,+0.6531728429538f, + +0.6343932841636f,+0.6152315905806f,+0.5956993044924f,+0.5758081914178f, + +0.5555702330196f,+0.5349976198871f,+0.5141027441932f,+0.4928981922298f, + +0.4713967368260f,+0.4496113296546f,+0.4275550934303f,+0.4052413140050f, + +0.3826834323651f,+0.3598950365350f,+0.3368898533922f,+0.3136817403989f, + +0.2902846772545f,+0.2667127574749f,+0.2429801799033f,+0.2191012401569f, + +0.1950903220161f,+0.1709618887603f,+0.1467304744554f,+0.1224106751992f, + +0.0980171403296f,+0.0735645635997f,+0.0490676743274f,+0.0245412285229f, + +0.0000000000000f,-0.0245412285229f,-0.0490676743274f,-0.0735645635997f, + -0.0980171403296f,-0.1224106751992f,-0.1467304744554f,-0.1709618887603f, + -0.1950903220161f,-0.2191012401569f,-0.2429801799033f,-0.2667127574749f, + -0.2902846772545f,-0.3136817403989f,-0.3368898533922f,-0.3598950365350f, + -0.3826834323651f,-0.4052413140050f,-0.4275550934303f,-0.4496113296546f, + -0.4713967368260f,-0.4928981922298f,-0.5141027441932f,-0.5349976198871f, + -0.5555702330196f,-0.5758081914178f,-0.5956993044924f,-0.6152315905806f, + -0.6343932841636f,-0.6531728429538f,-0.6715589548470f,-0.6895405447371f, + -0.7071067811865f,-0.7242470829515f,-0.7409511253550f,-0.7572088465065f, + -0.7730104533627f,-0.7883464276266f,-0.8032075314806f,-0.8175848131516f, + -0.8314696123025f,-0.8448535652497f,-0.8577286100003f,-0.8700869911087f, + -0.8819212643484f,-0.8932243011955f,-0.9039892931234f,-0.9142097557035f, + -0.9238795325113f,-0.9329927988347f,-0.9415440651830f,-0.9495281805930f, + -0.9569403357322f,-0.9637760657954f,-0.9700312531945f,-0.9757021300385f, + -0.9807852804032f,-0.9852776423889f,-0.9891765099648f,-0.9924795345987f, + -0.9951847266722f,-0.9972904566787f,-0.9987954562052f,-0.9996988186962f, + -1.0000000000000f, +}; + +#define INVSQ_LOOKUP_SZ 32 +static const float INVSQ_LOOKUP[INVSQ_LOOKUP_SZ+1]={ + 1.414213562373f,1.392621247646f,1.371988681140f,1.352246807566f, + 1.333333333333f,1.315191898443f,1.297771369046f,1.281025230441f, + 1.264911064067f,1.249390095109f,1.234426799697f,1.219988562661f, + 1.206045378311f,1.192569588000f,1.179535649239f,1.166919931983f, + 1.154700538379f,1.142857142857f,1.131370849898f,1.120224067222f, + 1.109400392450f,1.098884511590f,1.088662107904f,1.078719779941f, + 1.069044967650f,1.059625885652f,1.050451462878f,1.041511287847f, + 1.032795558989f,1.024295039463f,1.016001016002f,1.007905261358f, + 1.000000000000f, +}; + +#define INVSQ2EXP_LOOKUP_MIN (-32) +#define INVSQ2EXP_LOOKUP_MAX 32 +static const float INVSQ2EXP_LOOKUP[INVSQ2EXP_LOOKUP_MAX-\ + INVSQ2EXP_LOOKUP_MIN+1]={ + 65536.f, 46340.95001f, 32768.f, 23170.47501f, + 16384.f, 11585.2375f, 8192.f, 5792.618751f, + 4096.f, 2896.309376f, 2048.f, 1448.154688f, + 1024.f, 724.0773439f, 512.f, 362.038672f, + 256.f, 181.019336f, 128.f, 90.50966799f, + 64.f, 45.254834f, 32.f, 22.627417f, + 16.f, 11.3137085f, 8.f, 5.656854249f, + 4.f, 2.828427125f, 2.f, 1.414213562f, + 1.f, 0.7071067812f, 0.5f, 0.3535533906f, + 0.25f, 0.1767766953f, 0.125f, 0.08838834765f, + 0.0625f, 0.04419417382f, 0.03125f, 0.02209708691f, + 0.015625f, 0.01104854346f, 0.0078125f, 0.005524271728f, + 0.00390625f, 0.002762135864f, 0.001953125f, 0.001381067932f, + 0.0009765625f, 0.000690533966f, 0.00048828125f, 0.000345266983f, + 0.000244140625f,0.0001726334915f,0.0001220703125f,8.631674575e-05f, + 6.103515625e-05f,4.315837288e-05f,3.051757812e-05f,2.157918644e-05f, + 1.525878906e-05f, +}; + +#endif + +#define FROMdB_LOOKUP_SZ 35 +#define FROMdB2_LOOKUP_SZ 32 +#define FROMdB_SHIFT 5 +#define FROMdB2_SHIFT 3 +#define FROMdB2_MASK 31 + +#ifdef FLOAT_LOOKUP +static const float FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ + 1.f, 0.6309573445f, 0.3981071706f, 0.2511886432f, + 0.1584893192f, 0.1f, 0.06309573445f, 0.03981071706f, + 0.02511886432f, 0.01584893192f, 0.01f, 0.006309573445f, + 0.003981071706f, 0.002511886432f, 0.001584893192f, 0.001f, + 0.0006309573445f,0.0003981071706f,0.0002511886432f,0.0001584893192f, + 0.0001f,6.309573445e-05f,3.981071706e-05f,2.511886432e-05f, + 1.584893192e-05f, 1e-05f,6.309573445e-06f,3.981071706e-06f, + 2.511886432e-06f,1.584893192e-06f, 1e-06f,6.309573445e-07f, + 3.981071706e-07f,2.511886432e-07f,1.584893192e-07f, +}; + +static const float FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ + 0.9928302478f, 0.9786445908f, 0.9646616199f, 0.9508784391f, + 0.9372921937f, 0.92390007f, 0.9106992942f, 0.8976871324f, + 0.8848608897f, 0.8722179097f, 0.8597555737f, 0.8474713009f, + 0.835362547f, 0.8234268041f, 0.8116616003f, 0.8000644989f, + 0.7886330981f, 0.7773650302f, 0.7662579617f, 0.755309592f, + 0.7445176537f, 0.7338799116f, 0.7233941627f, 0.7130582353f, + 0.7028699885f, 0.6928273125f, 0.6829281272f, 0.6731703824f, + 0.6635520573f, 0.6540711597f, 0.6447257262f, 0.6355138211f, +}; +#endif + +#ifdef INT_LOOKUP + +#define INVSQ_LOOKUP_I_SHIFT 10 +#define INVSQ_LOOKUP_I_MASK 1023 +static const long INVSQ_LOOKUP_I[64+1]={ + 92682l, 91966l, 91267l, 90583l, + 89915l, 89261l, 88621l, 87995l, + 87381l, 86781l, 86192l, 85616l, + 85051l, 84497l, 83953l, 83420l, + 82897l, 82384l, 81880l, 81385l, + 80899l, 80422l, 79953l, 79492l, + 79039l, 78594l, 78156l, 77726l, + 77302l, 76885l, 76475l, 76072l, + 75674l, 75283l, 74898l, 74519l, + 74146l, 73778l, 73415l, 73058l, + 72706l, 72359l, 72016l, 71679l, + 71347l, 71019l, 70695l, 70376l, + 70061l, 69750l, 69444l, 69141l, + 68842l, 68548l, 68256l, 67969l, + 67685l, 67405l, 67128l, 66855l, + 66585l, 66318l, 66054l, 65794l, + 65536l, +}; + +#define COS_LOOKUP_I_SHIFT 9 +#define COS_LOOKUP_I_MASK 511 +#define COS_LOOKUP_I_SZ 128 +static const long COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ + 16384l, 16379l, 16364l, 16340l, + 16305l, 16261l, 16207l, 16143l, + 16069l, 15986l, 15893l, 15791l, + 15679l, 15557l, 15426l, 15286l, + 15137l, 14978l, 14811l, 14635l, + 14449l, 14256l, 14053l, 13842l, + 13623l, 13395l, 13160l, 12916l, + 12665l, 12406l, 12140l, 11866l, + 11585l, 11297l, 11003l, 10702l, + 10394l, 10080l, 9760l, 9434l, + 9102l, 8765l, 8423l, 8076l, + 7723l, 7366l, 7005l, 6639l, + 6270l, 5897l, 5520l, 5139l, + 4756l, 4370l, 3981l, 3590l, + 3196l, 2801l, 2404l, 2006l, + 1606l, 1205l, 804l, 402l, + 0l, -401l, -803l, -1204l, + -1605l, -2005l, -2403l, -2800l, + -3195l, -3589l, -3980l, -4369l, + -4755l, -5138l, -5519l, -5896l, + -6269l, -6638l, -7004l, -7365l, + -7722l, -8075l, -8422l, -8764l, + -9101l, -9433l, -9759l, -10079l, + -10393l, -10701l, -11002l, -11296l, + -11584l, -11865l, -12139l, -12405l, + -12664l, -12915l, -13159l, -13394l, + -13622l, -13841l, -14052l, -14255l, + -14448l, -14634l, -14810l, -14977l, + -15136l, -15285l, -15425l, -15556l, + -15678l, -15790l, -15892l, -15985l, + -16068l, -16142l, -16206l, -16260l, + -16304l, -16339l, -16363l, -16378l, + -16383l, +}; + +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c new file mode 100644 index 0000000000..a2325e6ef1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c @@ -0,0 +1,160 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: LPC low level routines + last mod: $Id: lpc.c 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +/* Some of these routines (autocorrelator, LPC coefficient estimator) + are derived from code written by Jutta Degener and Carsten Bormann; + thus we include their copyright below. The entirety of this file + is freely redistributable on the condition that both of these + copyright notices are preserved without modification. */ + +/* Preserved Copyright: *********************************************/ + +/* Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, +Technische Universita"t Berlin + +Any use of this software is permitted provided that this notice is not +removed and that neither the authors nor the Technische Universita"t +Berlin are deemed to have made any representations as to the +suitability of this software for any purpose nor are held responsible +for any defects of this software. THERE IS ABSOLUTELY NO WARRANTY FOR +THIS SOFTWARE. + +As a matter of courtesy, the authors request to be informed about uses +this software has found, about bugs in this software, and about any +improvements that may be of general interest. + +Berlin, 28.11.1994 +Jutta Degener +Carsten Bormann + +*********************************************************************/ + +#include +#include +#include +#include "os.h" +#include "smallft.h" +#include "lpc.h" +#include "scales.h" +#include "misc.h" + +/* Autocorrelation LPC coeff generation algorithm invented by + N. Levinson in 1947, modified by J. Durbin in 1959. */ + +/* Input : n elements of time doamin data + Output: m lpc coefficients, excitation energy */ + +float vorbis_lpc_from_data(float *data,float *lpci,int n,int m){ + double *aut=(double*)alloca(sizeof(*aut)*(m+1)); + double *lpc=(double*)alloca(sizeof(*lpc)*(m)); + double error; + double epsilon; + int i,j; + + /* autocorrelation, p+1 lag coefficients */ + j=m+1; + while(j--){ + double d=0; /* double needed for accumulator depth */ + for(i=j;i +#include +#include +#include "lsp.h" +#include "os.h" +#include "misc.h" +#include "lookup.h" +#include "scales.h" + +/* three possible LSP to f curve functions; the exact computation + (float), a lookup based float implementation, and an integer + implementation. The float lookup is likely the optimal choice on + any machine with an FPU. The integer implementation is *not* fixed + point (due to the need for a large dynamic range and thus a + separately tracked exponent) and thus much more complex than the + relatively simple float implementations. It's mostly for future + work on a fully fixed point implementation for processors like the + ARM family. */ + +/* define either of these (preferably FLOAT_LOOKUP) to have faster + but less precise implementation. */ +#undef FLOAT_LOOKUP +#undef INT_LOOKUP + +#ifdef FLOAT_LOOKUP +#include "lookup.c" /* catch this in the build system; we #include for + compilers (like gcc) that can't inline across + modules */ + +/* side effect: changes *lsp to cosines of lsp */ +void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, + float amp,float ampoffset){ + int i; + float wdel=M_PI/ln; + vorbis_fpu_control fpu; + + vorbis_fpu_setround(&fpu); + for(i=0;i>1; + + while(c--){ + q*=ftmp[0]-w; + p*=ftmp[1]-w; + ftmp+=2; + } + + if(m&1){ + /* odd order filter; slightly assymetric */ + /* the last coefficient */ + q*=ftmp[0]-w; + q*=q; + p*=p*(1.f-w*w); + }else{ + /* even order filter; still symmetric */ + q*=q*(1.f+w); + p*=p*(1.f-w); + } + + q=frexp(p+q,&qexp); + q=vorbis_fromdBlook(amp* + vorbis_invsqlook(q)* + vorbis_invsq2explook(qexp+m)- + ampoffset); + + do{ + curve[i++]*=q; + }while(map[i]==k); + } + vorbis_fpu_restore(fpu); +} + +#else + +#ifdef INT_LOOKUP +#include "lookup.c" /* catch this in the build system; we #include for + compilers (like gcc) that can't inline across + modules */ + +static const int MLOOP_1[64]={ + 0,10,11,11, 12,12,12,12, 13,13,13,13, 13,13,13,13, + 14,14,14,14, 14,14,14,14, 14,14,14,14, 14,14,14,14, + 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, + 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, +}; + +static const int MLOOP_2[64]={ + 0,4,5,5, 6,6,6,6, 7,7,7,7, 7,7,7,7, + 8,8,8,8, 8,8,8,8, 8,8,8,8, 8,8,8,8, + 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, + 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, +}; + +static const int MLOOP_3[8]={0,1,2,2,3,3,3,3}; + + +/* side effect: changes *lsp to cosines of lsp */ +void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, + float amp,float ampoffset){ + + /* 0 <= m < 256 */ + + /* set up for using all int later */ + int i; + int ampoffseti=rint(ampoffset*4096.f); + int ampi=rint(amp*16.f); + long *ilsp=(long*)alloca(m*sizeof(*ilsp)); + for(i=0;i>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + qi=(qi>>shift)*labs(ilsp[j-1]-wi); + pi=(pi>>shift)*labs(ilsp[j]-wi); + qexp+=shift; + } + if(!(shift=MLOOP_1[(pi|qi)>>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + + /* pi,qi normalized collectively, both tracked using qexp */ + + if(m&1){ + /* odd order filter; slightly assymetric */ + /* the last coefficient */ + qi=(qi>>shift)*labs(ilsp[j-1]-wi); + pi=(pi>>shift)<<14; + qexp+=shift; + + if(!(shift=MLOOP_1[(pi|qi)>>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + + pi>>=shift; + qi>>=shift; + qexp+=shift-14*((m+1)>>1); + + pi=((pi*pi)>>16); + qi=((qi*qi)>>16); + qexp=qexp*2+m; + + pi*=(1<<14)-((wi*wi)>>14); + qi+=pi>>14; + + }else{ + /* even order filter; still symmetric */ + + /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't + worth tracking step by step */ + + pi>>=shift; + qi>>=shift; + qexp+=shift-7*m; + + pi=((pi*pi)>>16); + qi=((qi*qi)>>16); + qexp=qexp*2+m; + + pi*=(1<<14)-wi; + qi*=(1<<14)+wi; + qi=(qi+pi)>>14; + + } + + + /* we've let the normalization drift because it wasn't important; + however, for the lookup, things must be normalized again. We + need at most one right shift or a number of left shifts */ + + if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ + qi>>=1; qexp++; + }else + while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ + qi<<=1; qexp--; + } + + amp=vorbis_fromdBlook_i(ampi* /* n.4 */ + vorbis_invsqlook_i(qi,qexp)- + /* m.8, m+n<=8 */ + ampoffseti); /* 8.12[0] */ + + curve[i]*=amp; + while(map[++i]==k)curve[i]*=amp; + } +} + +#else + +/* old, nonoptimized but simple version for any poor sap who needs to + figure out what the hell this code does, or wants the other + fraction of a dB precision */ + +/* side effect: changes *lsp to cosines of lsp */ +void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, + float amp,float ampoffset){ + int i; + float wdel=M_PI/ln; + for(i=0;i= i; j--) { + g[j-2] -= g[j]; + g[j] += g[j]; + } + } +} + +static int JUCE_CDECL comp(const void *a,const void *b){ + return (*(float *)a<*(float *)b)-(*(float *)a>*(float *)b); +} + +/* Newton-Raphson-Maehly actually functioned as a decent root finder, + but there are root sets for which it gets into limit cycles + (exacerbated by zero suppression) and fails. We can't afford to + fail, even if the failure is 1 in 100,000,000, so we now use + Laguerre and later polish with Newton-Raphson (which can then + afford to fail) */ + +#define EPSILON 10e-7 +static int Laguerre_With_Deflation(float *a,int ord,float *r){ + int i,m; + double *defl=(double*)alloca(sizeof(*defl)*(ord+1)); + for(i=0;i<=ord;i++)defl[i]=a[i]; + + for(m=ord;m>0;m--){ + double newx=0.f,delta; + + /* iterate a root */ + while(1){ + double p=defl[m],pp=0.f,ppp=0.f,denom; + + /* eval the polynomial and its first two derivatives */ + for(i=m;i>0;i--){ + ppp = newx*ppp + pp; + pp = newx*pp + p; + p = newx*p + defl[i-1]; + } + + /* Laguerre's method */ + denom=(m-1) * ((m-1)*pp*pp - m*p*ppp); + if(denom<0) + return(-1); /* complex root! The LPC generator handed us a bad filter */ + + if(pp>0){ + denom = pp + sqrt(denom); + if(denom-(EPSILON))denom=-(EPSILON); + } + + delta = m*p/denom; + newx -= delta; + + if(delta<0.f)delta*=-1; + + if(fabs(delta/newx)<10e-12)break; + } + + r[m-1]=newx; + + /* forward deflation */ + + for(i=m;i>0;i--) + defl[i-1]+=newx*defl[i]; + defl++; + + } + return(0); +} + + +/* for spit-and-polish only */ +static int Newton_Raphson(float *a,int ord,float *r){ + int i, k, count=0; + double error=1.f; + double *root=(double*)alloca(ord*sizeof(*root)); + + for(i=0; i1e-20){ + error=0; + + for(i=0; i= 0; k--) { + + pp= pp* rooti + p; + p = p * rooti + a[k]; + } + + delta = p/pp; + root[i] -= delta; + error+= delta*delta; + } + + if(count>40)return(-1); + + count++; + } + + /* Replaced the original bubble sort with a real sort. With your + help, we can eliminate the bubble sort in our lifetime. --Monty */ + + for(i=0; i>1; + int g1_order,g2_order; + float *g1=(float*)alloca(sizeof(*g1)*(order2+1)); + float *g2=(float*)alloca(sizeof(*g2)*(order2+1)); + float *g1r=(float*)alloca(sizeof(*g1r)*(order2+1)); + float *g2r=(float*)alloca(sizeof(*g2r)*(order2+1)); + int i; + + /* even and odd are slightly different base cases */ + g1_order=(m+1)>>1; + g2_order=(m) >>1; + + /* Compute the lengths of the x polynomials. */ + /* Compute the first half of K & R F1 & F2 polynomials. */ + /* Compute half of the symmetric and antisymmetric polynomials. */ + /* Remove the roots at +1 and -1. */ + + g1[g1_order] = 1.f; + for(i=1;i<=g1_order;i++) g1[g1_order-i] = lpc[i-1]+lpc[m-i]; + g2[g2_order] = 1.f; + for(i=1;i<=g2_order;i++) g2[g2_order-i] = lpc[i-1]-lpc[m-i]; + + if(g1_order>g2_order){ + for(i=2; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+2]; + }else{ + for(i=1; i<=g1_order;i++) g1[g1_order-i] -= g1[g1_order-i+1]; + for(i=1; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+1]; + } + + /* Convert into polynomials in cos(alpha) */ + cheby(g1,g1_order); + cheby(g2,g2_order); + + /* Find the roots of the 2 even polynomials.*/ + if(Laguerre_With_Deflation(g1,g1_order,g1r) || + Laguerre_With_Deflation(g2,g2_order,g2r)) + return(-1); + + Newton_Raphson(g1,g1_order,g1r); /* if it fails, it leaves g1r alone */ + Newton_Raphson(g2,g2_order,g2r); /* if it fails, it leaves g2r alone */ + + qsort(g1r,g1_order,sizeof(*g1r),comp); + qsort(g2r,g2_order,sizeof(*g2r),comp); + + for(i=0;i +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "codebook.h" +#include "window.h" +#include "registry.h" +#include "psy.h" +#include "misc.h" + +/* simplistic, wasteful way of doing this (unique lookup for each + mode/submapping); there should be a central repository for + identical lookups. That will require minor work, so I'm putting it + off as low priority. + + Why a lookup for each backend in a given mode? Because the + blocksize is set by the mode, and low backend lookups may require + parameters from other areas of the mode/mapping */ + +static void mapping0_free_info(vorbis_info_mapping *i){ + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static int ilog3(unsigned int v){ + int ret=0; + if(v)--v; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static void mapping0_pack(vorbis_info *vi,vorbis_info_mapping *vm, + oggpack_buffer *opb){ + int i; + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)vm; + + /* another 'we meant to do it this way' hack... up to beta 4, we + packed 4 binary zeros here to signify one submapping in use. We + now redefine that to mean four bitflags that indicate use of + deeper features; bit0:submappings, bit1:coupling, + bit2,3:reserved. This is backward compatable with all actual uses + of the beta code. */ + + if(info->submaps>1){ + oggpack_write(opb,1,1); + oggpack_write(opb,info->submaps-1,4); + }else + oggpack_write(opb,0,1); + + if(info->coupling_steps>0){ + oggpack_write(opb,1,1); + oggpack_write(opb,info->coupling_steps-1,8); + + for(i=0;icoupling_steps;i++){ + oggpack_write(opb,info->coupling_mag[i],ilog3(vi->channels)); + oggpack_write(opb,info->coupling_ang[i],ilog3(vi->channels)); + } + }else + oggpack_write(opb,0,1); + + oggpack_write(opb,0,2); /* 2,3:reserved */ + + /* we don't write the channel submappings if we only have one... */ + if(info->submaps>1){ + for(i=0;ichannels;i++) + oggpack_write(opb,info->chmuxlist[i],4); + } + for(i=0;isubmaps;i++){ + oggpack_write(opb,0,8); /* time submap unused */ + oggpack_write(opb,info->floorsubmap[i],8); + oggpack_write(opb,info->residuesubmap[i],8); + } +} + +/* also responsible for range checking */ +static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ + int i,b; + vorbis_info_mapping0 *info=(vorbis_info_mapping0*)_ogg_calloc(1,sizeof(*info)); + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + memset(info,0,sizeof(*info)); + + b=oggpack_read(opb,1); + if(b<0)goto err_out; + if(b){ + info->submaps=oggpack_read(opb,4)+1; + if(info->submaps<=0)goto err_out; + }else + info->submaps=1; + + b=oggpack_read(opb,1); + if(b<0)goto err_out; + if(b){ + info->coupling_steps=oggpack_read(opb,8)+1; + if(info->coupling_steps<=0)goto err_out; + for(i=0;icoupling_steps;i++){ + int testM=info->coupling_mag[i]=oggpack_read(opb,ilog3(vi->channels)); + int testA=info->coupling_ang[i]=oggpack_read(opb,ilog3(vi->channels)); + + if(testM<0 || + testA<0 || + testM==testA || + testM>=vi->channels || + testA>=vi->channels) goto err_out; + } + + } + + if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */ + + if(info->submaps>1){ + for(i=0;ichannels;i++){ + info->chmuxlist[i]=oggpack_read(opb,4); + if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out; + } + } + for(i=0;isubmaps;i++){ + oggpack_read(opb,8); /* time submap unused */ + info->floorsubmap[i]=oggpack_read(opb,8); + if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out; + info->residuesubmap[i]=oggpack_read(opb,8); + if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0)goto err_out; + } + + return info; + + err_out: + mapping0_free_info(info); + return(NULL); +} + +#include "os.h" +#include "lpc.h" +#include "lsp.h" +#include "envelope.h" +#include "mdct.h" +#include "psy.h" +#include "scales.h" + +#if 0 +static long seq=0; +static ogg_int64_t total=0; +static float FLOOR1_fromdB_LOOKUP[256]={ + 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, + 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, + 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, + 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, + 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, + 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, + 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, + 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, + 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, + 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, + 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, + 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, + 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, + 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, + 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, + 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, + 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, + 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, + 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, + 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, + 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, + 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, + 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, + 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, + 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, + 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, + 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, + 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, + 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, + 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, + 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, + 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, + 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, + 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, + 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, + 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, + 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, + 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, + 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, + 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, + 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, + 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, + 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, + 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, + 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, + 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, + 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, + 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, + 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, + 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, + 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, + 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, + 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, + 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, + 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, + 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, + 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, + 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, + 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, + 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, + 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, + 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, + 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, + 0.82788260F, 0.88168307F, 0.9389798F, 1.F, +}; + +#endif + + +static int mapping0_forward(vorbis_block *vb){ + vorbis_dsp_state *vd=vb->vd; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + private_state *b=(private_state*)vb->vd->backend_state; + vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; + int n=vb->pcmend; + int i,j,k; + + int *nonzero = (int*)alloca(sizeof(*nonzero)*vi->channels); + float **gmdct = (float**)_vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct)); + int **iwork = (int**)_vorbis_block_alloc(vb,vi->channels*sizeof(*iwork)); + int ***floor_posts = (int***)_vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts)); + + float global_ampmax=vbi->ampmax; + float *local_ampmax=(float*)alloca(sizeof(*local_ampmax)*vi->channels); + int blocktype=vbi->blocktype; + + int modenumber=vb->W; + vorbis_info_mapping0 *info=(vorbis_info_mapping0*)ci->map_param[modenumber]; + vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0); + + vb->mode=modenumber; + + for(i=0;ichannels;i++){ + float scale=4.f/n; + float scale_dB; + + float *pcm =vb->pcm[i]; + float *logfft =pcm; + + iwork[i]=(int*)_vorbis_block_alloc(vb,n/2*sizeof(**iwork)); + gmdct[i]=(float*)_vorbis_block_alloc(vb,n/2*sizeof(**gmdct)); + + scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original + todB estimation used on IEEE 754 + compliant machines had a bug that + returned dB values about a third + of a decibel too high. The bug + was harmless because tunings + implicitly took that into + account. However, fixing the bug + in the estimator requires + changing all the tunings as well. + For now, it's easier to sync + things back up here, and + recalibrate the tunings in the + next major model upgrade. */ + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("pcmL",seq,pcm,n,0,0,total-n/2); + else + _analysis_output("pcmR",seq,pcm,n,0,0,total-n/2); + }else{ + _analysis_output("pcm",seq,pcm,n,0,0,total-n/2); + } +#endif + + /* window the PCM data */ + _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("windowedL",seq,pcm,n,0,0,total-n/2); + else + _analysis_output("windowedR",seq,pcm,n,0,0,total-n/2); + }else{ + _analysis_output("windowed",seq,pcm,n,0,0,total-n/2); + } +#endif + + /* transform the PCM data */ + /* only MDCT right now.... */ + mdct_forward((mdct_lookup*) b->transform[vb->W][0],pcm,gmdct[i]); + + /* FFT yields more accurate tonal estimation (not phase sensitive) */ + drft_forward(&b->fft_look[vb->W],pcm); + logfft[0]=scale_dB+todB(pcm) + .345; /* + .345 is a hack; the + original todB estimation used on + IEEE 754 compliant machines had a + bug that returned dB values about + a third of a decibel too high. + The bug was harmless because + tunings implicitly took that into + account. However, fixing the bug + in the estimator requires + changing all the tunings as well. + For now, it's easier to sync + things back up here, and + recalibrate the tunings in the + next major model upgrade. */ + local_ampmax[i]=logfft[0]; + for(j=1;j>1]=scale_dB+.5f*todB(&temp) + .345; /* + + .345 is a hack; the original todB + estimation used on IEEE 754 + compliant machines had a bug that + returned dB values about a third + of a decibel too high. The bug + was harmless because tunings + implicitly took that into + account. However, fixing the bug + in the estimator requires + changing all the tunings as well. + For now, it's easier to sync + things back up here, and + recalibrate the tunings in the + next major model upgrade. */ + if(temp>local_ampmax[i])local_ampmax[i]=temp; + } + + if(local_ampmax[i]>0.f)local_ampmax[i]=0.f; + if(local_ampmax[i]>global_ampmax)global_ampmax=local_ampmax[i]; + +#if 0 + if(vi->channels==2){ + if(i==0){ + _analysis_output("fftL",seq,logfft,n/2,1,0,0); + }else{ + _analysis_output("fftR",seq,logfft,n/2,1,0,0); + } + }else{ + _analysis_output("fft",seq,logfft,n/2,1,0,0); + } +#endif + + } + + { + float *noise = (float*)_vorbis_block_alloc(vb,n/2*sizeof(*noise)); + float *tone = (float*)_vorbis_block_alloc(vb,n/2*sizeof(*tone)); + + for(i=0;ichannels;i++){ + /* the encoder setup assumes that all the modes used by any + specific bitrate tweaking use the same floor */ + + int submap=info->chmuxlist[i]; + + /* the following makes things clearer to *me* anyway */ + float *mdct =gmdct[i]; + float *logfft =vb->pcm[i]; + + float *logmdct =logfft+n/2; + float *logmask =logfft; + + vb->mode=modenumber; + + floor_posts[i]=(int**)_vorbis_block_alloc(vb,PACKETBLOBS*sizeof(**floor_posts)); + memset(floor_posts[i],0,sizeof(**floor_posts)*PACKETBLOBS); + + for(j=0;jchannels==2){ + if(i==0) + _analysis_output("mdctL",seq,logmdct,n/2,1,0,0); + else + _analysis_output("mdctR",seq,logmdct,n/2,1,0,0); + }else{ + _analysis_output("mdct",seq,logmdct,n/2,1,0,0); + } +#endif + + /* first step; noise masking. Not only does 'noise masking' + give us curves from which we can decide how much resolution + to give noise parts of the spectrum, it also implicitly hands + us a tonality estimate (the larger the value in the + 'noise_depth' vector, the more tonal that area is) */ + + _vp_noisemask(psy_look, + logmdct, + noise); /* noise does not have by-frequency offset + bias applied yet */ +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("noiseL",seq,noise,n/2,1,0,0); + else + _analysis_output("noiseR",seq,noise,n/2,1,0,0); + }else{ + _analysis_output("noise",seq,noise,n/2,1,0,0); + } +#endif + + /* second step: 'all the other crap'; all the stuff that isn't + computed/fit for bitrate management goes in the second psy + vector. This includes tone masking, peak limiting and ATH */ + + _vp_tonemask(psy_look, + logfft, + tone, + global_ampmax, + local_ampmax[i]); + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("toneL",seq,tone,n/2,1,0,0); + else + _analysis_output("toneR",seq,tone,n/2,1,0,0); + }else{ + _analysis_output("tone",seq,tone,n/2,1,0,0); + } +#endif + + /* third step; we offset the noise vectors, overlay tone + masking. We then do a floor1-specific line fit. If we're + performing bitrate management, the line fit is performed + multiple times for up/down tweakage on demand. */ + +#if 0 + { + float aotuv[psy_look->n]; +#endif + + _vp_offset_and_mix(psy_look, + noise, + tone, + 1, + logmask, + mdct, + logmdct); + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("aotuvM1_L",seq,aotuv,psy_look->n,1,1,0); + else + _analysis_output("aotuvM1_R",seq,aotuv,psy_look->n,1,1,0); + }else{ + _analysis_output("aotuvM1",seq,aotuv,psy_look->n,1,1,0); + } + } +#endif + + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("mask1L",seq,logmask,n/2,1,0,0); + else + _analysis_output("mask1R",seq,logmask,n/2,1,0,0); + }else{ + _analysis_output("mask1",seq,logmask,n/2,1,0,0); + } +#endif + + /* this algorithm is hardwired to floor 1 for now; abort out if + we're *not* floor1. This won't happen unless someone has + broken the encode setup lib. Guard it anyway. */ + if(ci->floor_type[info->floorsubmap[submap]]!=1)return(-1); + + floor_posts[i][PACKETBLOBS/2]= + floor1_fit(vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), + logmdct, + logmask); + + /* are we managing bitrate? If so, perform two more fits for + later rate tweaking (fits represent hi/lo) */ + if(vorbis_bitrate_managed(vb) && floor_posts[i][PACKETBLOBS/2]){ + /* higher rate by way of lower noise curve */ + + _vp_offset_and_mix(psy_look, + noise, + tone, + 2, + logmask, + mdct, + logmdct); + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("mask2L",seq,logmask,n/2,1,0,0); + else + _analysis_output("mask2R",seq,logmask,n/2,1,0,0); + }else{ + _analysis_output("mask2",seq,logmask,n/2,1,0,0); + } +#endif + + floor_posts[i][PACKETBLOBS-1]= + floor1_fit(vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), + logmdct, + logmask); + + /* lower rate by way of higher noise curve */ + _vp_offset_and_mix(psy_look, + noise, + tone, + 0, + logmask, + mdct, + logmdct); + +#if 0 + if(vi->channels==2){ + if(i==0) + _analysis_output("mask0L",seq,logmask,n/2,1,0,0); + else + _analysis_output("mask0R",seq,logmask,n/2,1,0,0); + }else{ + _analysis_output("mask0",seq,logmask,n/2,1,0,0); + } +#endif + + floor_posts[i][0]= + floor1_fit(vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), + logmdct, + logmask); + + /* we also interpolate a range of intermediate curves for + intermediate rates */ + for(k=1;kflr[info->floorsubmap[submap]]), + floor_posts[i][0], + floor_posts[i][PACKETBLOBS/2], + k*65536/(PACKETBLOBS/2)); + for(k=PACKETBLOBS/2+1;kflr[info->floorsubmap[submap]]), + floor_posts[i][PACKETBLOBS/2], + floor_posts[i][PACKETBLOBS-1], + (k-PACKETBLOBS/2)*65536/(PACKETBLOBS/2)); + } + } + } + vbi->ampmax=global_ampmax; + + /* + the next phases are performed once for vbr-only and PACKETBLOB + times for bitrate managed modes. + + 1) encode actual mode being used + 2) encode the floor for each channel, compute coded mask curve/res + 3) normalize and couple. + 4) encode residue + 5) save packet bytes to the packetblob vector + + */ + + /* iterate over the many masking curve fits we've created */ + + { + int **couple_bundle=(int**)alloca(sizeof(*couple_bundle)*vi->channels); + int *zerobundle=(int*)alloca(sizeof(*zerobundle)*vi->channels); + + for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2); + k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2); + k++){ + oggpack_buffer *opb=vbi->packetblob[k]; + + /* start out our new packet blob with packet type and mode */ + /* Encode the packet type */ + oggpack_write(opb,0,1); + /* Encode the modenumber */ + /* Encode frame mode, pre,post windowsize, then dispatch */ + oggpack_write(opb,modenumber,b->modebits); + if(vb->W){ + oggpack_write(opb,vb->lW,1); + oggpack_write(opb,vb->nW,1); + } + + /* encode floor, compute masking curve, sep out residue */ + for(i=0;ichannels;i++){ + int submap=info->chmuxlist[i]; + int *ilogmask=iwork[i]; + + nonzero[i]=floor1_encode(opb,vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), + floor_posts[i][k], + ilogmask); +#if 0 + { + char buf[80]; + sprintf(buf,"maskI%c%d",i?'R':'L',k); + float work[n/2]; + for(j=0;jpsy_g_param, + psy_look, + info, + gmdct, + iwork, + nonzero, + ci->psy_g_param.sliding_lowpass[vb->W][k], + vi->channels); + +#if 0 + for(i=0;ichannels;i++){ + char buf[80]; + sprintf(buf,"res%c%d",i?'R':'L',k); + float work[n/2]; + for(j=0;jsubmaps;i++){ + int ch_in_bundle=0; + long **classifications; + int resnum=info->residuesubmap[i]; + + for(j=0;jchannels;j++){ + if(info->chmuxlist[j]==i){ + zerobundle[ch_in_bundle]=0; + if(nonzero[j])zerobundle[ch_in_bundle]=1; + couple_bundle[ch_in_bundle++]=iwork[j]; + } + } + + classifications=_residue_P[ci->residue_type[resnum]]-> + classx(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle); + + ch_in_bundle=0; + for(j=0;jchannels;j++) + if(info->chmuxlist[j]==i) + couple_bundle[ch_in_bundle++]=iwork[j]; + + _residue_P[ci->residue_type[resnum]]-> + forward(opb,vb,b->residue[resnum], + couple_bundle,zerobundle,ch_in_bundle,classifications,i); + } + + /* ok, done encoding. Next protopacket. */ + } + + } + +#if 0 + seq++; + total+=ci->blocksizes[vb->W]/4+ci->blocksizes[vb->nW]/4; +#endif + return(0); +} + +static int mapping0_inverse(vorbis_block *vb,vorbis_info_mapping *l){ + vorbis_dsp_state *vd=vb->vd; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + private_state *b=(private_state*)vd->backend_state; + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)l; + + int i,j; + long n=vb->pcmend=ci->blocksizes[vb->W]; + + float **pcmbundle=(float**) alloca(sizeof(*pcmbundle)*vi->channels); + int *zerobundle=(int*) alloca(sizeof(*zerobundle)*vi->channels); + + int *nonzero =(int*) alloca(sizeof(*nonzero)*vi->channels); + void **floormemo=(void**) alloca(sizeof(*floormemo)*vi->channels); + + /* recover the spectral envelope; store it in the PCM vector for now */ + for(i=0;ichannels;i++){ + int submap=info->chmuxlist[i]; + floormemo[i]=_floor_P[ci->floor_type[info->floorsubmap[submap]]]-> + inverse1(vb,b->flr[info->floorsubmap[submap]]); + if(floormemo[i]) + nonzero[i]=1; + else + nonzero[i]=0; + memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); + } + + /* channel coupling can 'dirty' the nonzero listing */ + for(i=0;icoupling_steps;i++){ + if(nonzero[info->coupling_mag[i]] || + nonzero[info->coupling_ang[i]]){ + nonzero[info->coupling_mag[i]]=1; + nonzero[info->coupling_ang[i]]=1; + } + } + + /* recover the residue into our working vectors */ + for(i=0;isubmaps;i++){ + int ch_in_bundle=0; + for(j=0;jchannels;j++){ + if(info->chmuxlist[j]==i){ + if(nonzero[j]) + zerobundle[ch_in_bundle]=1; + else + zerobundle[ch_in_bundle]=0; + pcmbundle[ch_in_bundle++]=vb->pcm[j]; + } + } + + _residue_P[ci->residue_type[info->residuesubmap[i]]]-> + inverse(vb,b->residue[info->residuesubmap[i]], + pcmbundle,zerobundle,ch_in_bundle); + } + + /* channel coupling */ + for(i=info->coupling_steps-1;i>=0;i--){ + float *pcmM=vb->pcm[info->coupling_mag[i]]; + float *pcmA=vb->pcm[info->coupling_ang[i]]; + + for(j=0;j0) + if(ang>0){ + pcmM[j]=mag; + pcmA[j]=mag-ang; + }else{ + pcmA[j]=mag; + pcmM[j]=mag+ang; + } + else + if(ang>0){ + pcmM[j]=mag; + pcmA[j]=mag+ang; + }else{ + pcmA[j]=mag; + pcmM[j]=mag-ang; + } + } + } + + /* compute and apply spectral envelope */ + for(i=0;ichannels;i++){ + float *pcm=vb->pcm[i]; + int submap=info->chmuxlist[i]; + _floor_P[ci->floor_type[info->floorsubmap[submap]]]-> + inverse2(vb,b->flr[info->floorsubmap[submap]], + floormemo[i],pcm); + } + + /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ + /* only MDCT right now.... */ + for(i=0;ichannels;i++){ + float *pcm=vb->pcm[i]; + mdct_backward((mdct_lookup*) b->transform[vb->W][0],pcm,pcm); + } + + /* all done! */ + return(0); +} + +/* export hooks */ +const vorbis_func_mapping mapping0_exportbundle={ + &mapping0_pack, + &mapping0_unpack, + &mapping0_free_info, + &mapping0_forward, + &mapping0_inverse +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h new file mode 100644 index 0000000000..31c825fa7c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h @@ -0,0 +1,785 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: masking curve data for psychoacoustics + last mod: $Id: masking.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_MASKING_H_ +#define _V_MASKING_H_ + +/* more detailed ATH; the bass if flat to save stressing the floor + overly for only a bin or two of savings. */ + +#define MAX_ATH 88 +static const float ATH[]={ + /*15*/ -51, -52, -53, -54, -55, -56, -57, -58, + /*31*/ -59, -60, -61, -62, -63, -64, -65, -66, + /*63*/ -67, -68, -69, -70, -71, -72, -73, -74, + /*125*/ -75, -76, -77, -78, -80, -81, -82, -83, + /*250*/ -84, -85, -86, -87, -88, -88, -89, -89, + /*500*/ -90, -91, -91, -92, -93, -94, -95, -96, + /*1k*/ -96, -97, -98, -98, -99, -99,-100,-100, + /*2k*/ -101,-102,-103,-104,-106,-107,-107,-107, + /*4k*/ -107,-105,-103,-102,-101, -99, -98, -96, + /*8k*/ -95, -95, -96, -97, -96, -95, -93, -90, + /*16k*/ -80, -70, -50, -40, -30, -30, -30, -30 +}; + +/* The tone masking curves from Ehmer's and Fielder's papers have been + replaced by an empirically collected data set. The previously + published values were, far too often, simply on crack. */ + +#define EHMER_OFFSET 16 +#define EHMER_MAX 56 + +/* masking tones from -50 to 0dB, 62.5 through 16kHz at half octaves + test tones from -2 octaves to +5 octaves sampled at eighth octaves */ +/* (Vorbis 0dB, the loudest possible tone, is assumed to be ~100dB SPL + for collection of these curves) */ + +static const float tonemasks[P_BANDS][6][EHMER_MAX]={ + /* 62.5 Hz */ + {{ -60, -60, -60, -60, -60, -60, -60, -60, + -60, -60, -60, -60, -62, -62, -65, -73, + -69, -68, -68, -67, -70, -70, -72, -74, + -75, -79, -79, -80, -83, -88, -93, -100, + -110, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -53, -61, -66, + -66, -68, -67, -70, -76, -76, -72, -73, + -75, -76, -78, -79, -83, -88, -93, -100, + -110, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -37, -37, -37, -37, -37, -37, -37, -37, + -38, -40, -42, -46, -48, -53, -55, -62, + -65, -58, -56, -56, -61, -60, -65, -67, + -69, -71, -77, -77, -78, -80, -82, -84, + -88, -93, -98, -106, -112, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -25, -25, -25, -25, -25, -25, -25, -25, + -25, -26, -27, -29, -32, -38, -48, -52, + -52, -50, -48, -48, -51, -52, -54, -60, + -67, -67, -66, -68, -69, -73, -73, -76, + -80, -81, -81, -85, -85, -86, -88, -93, + -100, -110, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -16, -16, -16, -16, -16, -16, -16, -16, + -17, -19, -20, -22, -26, -28, -31, -40, + -47, -39, -39, -40, -42, -43, -47, -51, + -57, -52, -55, -55, -60, -58, -62, -63, + -70, -67, -69, -72, -73, -77, -80, -82, + -83, -87, -90, -94, -98, -104, -115, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -10, -11, -15, -19, -25, -30, + -34, -31, -30, -31, -29, -32, -35, -42, + -48, -42, -44, -46, -50, -50, -51, -52, + -59, -54, -55, -55, -58, -62, -63, -66, + -72, -73, -76, -75, -78, -80, -80, -81, + -84, -88, -90, -94, -98, -101, -106, -110}}, + /* 88Hz */ + {{ -66, -66, -66, -66, -66, -66, -66, -66, + -66, -66, -66, -66, -66, -67, -67, -67, + -76, -72, -71, -74, -76, -76, -75, -78, + -79, -79, -81, -83, -86, -89, -93, -97, + -100, -105, -110, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -47, -47, -47, -47, -47, -47, -47, -47, + -47, -47, -47, -48, -51, -55, -59, -66, + -66, -66, -67, -66, -68, -69, -70, -74, + -79, -77, -77, -78, -80, -81, -82, -84, + -86, -88, -91, -95, -100, -108, -116, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -36, -36, -36, -36, -36, -36, -36, -36, + -36, -37, -37, -41, -44, -48, -51, -58, + -62, -60, -57, -59, -59, -60, -63, -65, + -72, -71, -70, -72, -74, -77, -76, -78, + -81, -81, -80, -83, -86, -91, -96, -100, + -105, -110, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -28, -28, -28, -28, -28, -28, -28, -28, + -28, -30, -32, -32, -33, -35, -41, -49, + -50, -49, -47, -48, -48, -52, -51, -57, + -65, -61, -59, -61, -64, -69, -70, -74, + -77, -77, -78, -81, -84, -85, -87, -90, + -92, -96, -100, -107, -112, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -19, -19, -19, -19, -19, -19, -19, -19, + -20, -21, -23, -27, -30, -35, -36, -41, + -46, -44, -42, -40, -41, -41, -43, -48, + -55, -53, -52, -53, -56, -59, -58, -60, + -67, -66, -69, -71, -72, -75, -79, -81, + -84, -87, -90, -93, -97, -101, -107, -114, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -9, -9, -9, -9, -9, -9, -9, -9, + -11, -12, -12, -15, -16, -20, -23, -30, + -37, -34, -33, -34, -31, -32, -32, -38, + -47, -44, -41, -40, -47, -49, -46, -46, + -58, -50, -50, -54, -58, -62, -64, -67, + -67, -70, -72, -76, -79, -83, -87, -91, + -96, -100, -104, -110, -999, -999, -999, -999}}, + /* 125 Hz */ + {{ -62, -62, -62, -62, -62, -62, -62, -62, + -62, -62, -63, -64, -66, -67, -66, -68, + -75, -72, -76, -75, -76, -78, -79, -82, + -84, -85, -90, -94, -101, -110, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, -60, -60, -61, -63, -66, + -71, -68, -70, -70, -71, -72, -72, -75, + -81, -78, -79, -82, -83, -86, -90, -97, + -103, -113, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -53, -53, -53, -53, -53, -53, -53, -53, + -53, -54, -55, -57, -56, -57, -55, -61, + -65, -60, -60, -62, -63, -63, -66, -68, + -74, -73, -75, -75, -78, -80, -80, -82, + -85, -90, -96, -101, -108, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -46, -46, -46, -46, -46, -46, -46, -46, + -46, -46, -47, -47, -47, -47, -48, -51, + -57, -51, -49, -50, -51, -53, -54, -59, + -66, -60, -62, -67, -67, -70, -72, -75, + -76, -78, -81, -85, -88, -94, -97, -104, + -112, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -36, -36, -36, -36, -36, -36, -36, -36, + -39, -41, -42, -42, -39, -38, -41, -43, + -52, -44, -40, -39, -37, -37, -40, -47, + -54, -50, -48, -50, -55, -61, -59, -62, + -66, -66, -66, -69, -69, -73, -74, -74, + -75, -77, -79, -82, -87, -91, -95, -100, + -108, -115, -999, -999, -999, -999, -999, -999}, + { -28, -26, -24, -22, -20, -20, -23, -29, + -30, -31, -28, -27, -28, -28, -28, -35, + -40, -33, -32, -29, -30, -30, -30, -37, + -45, -41, -37, -38, -45, -47, -47, -48, + -53, -49, -48, -50, -49, -49, -51, -52, + -58, -56, -57, -56, -60, -61, -62, -70, + -72, -74, -78, -83, -88, -93, -100, -106}}, + /* 177 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -110, -105, -100, -95, -91, -87, -83, + -80, -78, -76, -78, -78, -81, -83, -85, + -86, -85, -86, -87, -90, -97, -107, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -110, -105, -100, -95, -90, + -85, -81, -77, -73, -70, -67, -67, -68, + -75, -73, -70, -69, -70, -72, -75, -79, + -84, -83, -84, -86, -88, -89, -89, -93, + -98, -105, -112, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-105, -100, -95, -90, -85, -80, -76, -71, + -68, -68, -65, -63, -63, -62, -62, -64, + -65, -64, -61, -62, -63, -64, -66, -68, + -73, -73, -74, -75, -76, -81, -83, -85, + -88, -89, -92, -95, -100, -108, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -80, -75, -71, -68, -65, -63, -62, -61, + -61, -61, -61, -59, -56, -57, -53, -50, + -58, -52, -50, -50, -52, -53, -54, -58, + -67, -63, -67, -68, -72, -75, -78, -80, + -81, -81, -82, -85, -89, -90, -93, -97, + -101, -107, -114, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + { -65, -61, -59, -57, -56, -55, -55, -56, + -56, -57, -55, -53, -52, -47, -44, -44, + -50, -44, -41, -39, -39, -42, -40, -46, + -51, -49, -50, -53, -54, -63, -60, -61, + -62, -66, -66, -66, -70, -73, -74, -75, + -76, -75, -79, -85, -89, -91, -96, -102, + -110, -999, -999, -999, -999, -999, -999, -999}, + { -52, -50, -49, -49, -48, -48, -48, -49, + -50, -50, -49, -46, -43, -39, -35, -33, + -38, -36, -32, -29, -32, -32, -32, -35, + -44, -39, -38, -38, -46, -50, -45, -46, + -53, -50, -50, -50, -54, -54, -53, -53, + -56, -57, -59, -66, -70, -72, -74, -79, + -83, -85, -90, -97, -114, -999, -999, -999}}, + /* 250 Hz */ + {{-999, -999, -999, -999, -999, -999, -110, -105, + -100, -95, -90, -86, -80, -75, -75, -79, + -80, -79, -80, -81, -82, -88, -95, -103, + -110, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -108, -103, -98, -93, + -88, -83, -79, -78, -75, -71, -67, -68, + -73, -73, -72, -73, -75, -77, -80, -82, + -88, -93, -100, -107, -114, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -110, -105, -101, -96, -90, + -86, -81, -77, -73, -69, -66, -61, -62, + -66, -64, -62, -65, -66, -70, -72, -76, + -81, -80, -84, -90, -95, -102, -110, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -107, -103, -97, -92, -88, + -83, -79, -74, -70, -66, -59, -53, -58, + -62, -55, -54, -54, -54, -58, -61, -62, + -72, -70, -72, -75, -78, -80, -81, -80, + -83, -83, -88, -93, -100, -107, -115, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -105, -100, -95, -90, -85, + -80, -75, -70, -66, -62, -56, -48, -44, + -48, -46, -46, -43, -46, -48, -48, -51, + -58, -58, -59, -60, -62, -62, -61, -61, + -65, -64, -65, -68, -70, -74, -75, -78, + -81, -86, -95, -110, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -105, -100, -95, -90, -85, -80, + -75, -70, -65, -61, -55, -49, -39, -33, + -40, -35, -32, -38, -40, -33, -35, -37, + -46, -41, -45, -44, -46, -42, -45, -46, + -52, -50, -50, -50, -54, -54, -55, -57, + -62, -64, -66, -68, -70, -76, -81, -90, + -100, -110, -999, -999, -999, -999, -999, -999}}, + /* 354 hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -105, -98, -90, -85, -82, -83, -80, -78, + -84, -79, -80, -83, -87, -89, -91, -93, + -99, -106, -117, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -105, -98, -90, -85, -80, -75, -70, -68, + -74, -72, -74, -77, -80, -82, -85, -87, + -92, -89, -91, -95, -100, -106, -112, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -105, -98, -90, -83, -75, -71, -63, -64, + -67, -62, -64, -67, -70, -73, -77, -81, + -84, -83, -85, -89, -90, -93, -98, -104, + -109, -114, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -103, -96, -88, -81, -75, -68, -58, -54, + -56, -54, -56, -56, -58, -60, -63, -66, + -74, -69, -72, -72, -75, -74, -77, -81, + -81, -82, -84, -87, -93, -96, -99, -104, + -110, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -108, -102, -96, + -91, -85, -80, -74, -68, -60, -51, -46, + -48, -46, -43, -45, -47, -47, -49, -48, + -56, -53, -55, -58, -57, -63, -58, -60, + -66, -64, -67, -70, -70, -74, -77, -84, + -86, -89, -91, -93, -94, -101, -109, -118, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -108, -103, -98, -93, -88, + -83, -78, -73, -68, -60, -53, -44, -35, + -38, -38, -34, -34, -36, -40, -41, -44, + -51, -45, -46, -47, -46, -54, -50, -49, + -50, -50, -50, -51, -54, -57, -58, -60, + -66, -66, -66, -64, -65, -68, -77, -82, + -87, -95, -110, -999, -999, -999, -999, -999}}, + /* 500 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -107, -102, -97, -92, -87, -83, -78, -75, + -82, -79, -83, -85, -89, -92, -95, -98, + -101, -105, -109, -113, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -106, + -100, -95, -90, -86, -81, -78, -74, -69, + -74, -74, -76, -79, -83, -84, -86, -89, + -92, -97, -93, -100, -103, -107, -110, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -106, -100, + -95, -90, -87, -83, -80, -75, -69, -60, + -66, -66, -68, -70, -74, -78, -79, -81, + -81, -83, -84, -87, -93, -96, -99, -103, + -107, -110, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -108, -103, -98, + -93, -89, -85, -82, -78, -71, -62, -55, + -58, -58, -54, -54, -55, -59, -61, -62, + -70, -66, -66, -67, -70, -72, -75, -78, + -84, -84, -84, -88, -91, -90, -95, -98, + -102, -103, -106, -110, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -108, -103, -98, -94, + -90, -87, -82, -79, -73, -67, -58, -47, + -50, -45, -41, -45, -48, -44, -44, -49, + -54, -51, -48, -47, -49, -50, -51, -57, + -58, -60, -63, -69, -70, -69, -71, -74, + -78, -82, -90, -95, -101, -105, -110, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -105, -101, -97, -93, -90, + -85, -80, -77, -72, -65, -56, -48, -37, + -40, -36, -34, -40, -50, -47, -38, -41, + -47, -38, -35, -39, -38, -43, -40, -45, + -50, -45, -44, -47, -50, -55, -48, -48, + -52, -66, -70, -76, -82, -90, -97, -105, + -110, -999, -999, -999, -999, -999, -999, -999}}, + /* 707 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -108, -103, -98, -93, -86, -79, -76, + -83, -81, -85, -87, -89, -93, -98, -102, + -107, -112, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -108, -103, -98, -93, -86, -79, -71, + -77, -74, -77, -79, -81, -84, -85, -90, + -92, -93, -92, -98, -101, -108, -112, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -108, -103, -98, -93, -87, -78, -68, -65, + -66, -62, -65, -67, -70, -73, -75, -78, + -82, -82, -83, -84, -91, -93, -98, -102, + -106, -110, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -105, -100, -95, -90, -82, -74, -62, -57, + -58, -56, -51, -52, -52, -54, -54, -58, + -66, -59, -60, -63, -66, -69, -73, -79, + -83, -84, -80, -81, -81, -82, -88, -92, + -98, -105, -113, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -107, + -102, -97, -92, -84, -79, -69, -57, -47, + -52, -47, -44, -45, -50, -52, -42, -42, + -53, -43, -43, -48, -51, -56, -55, -52, + -57, -59, -61, -62, -67, -71, -78, -83, + -86, -94, -98, -103, -110, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -105, -100, + -95, -90, -84, -78, -70, -61, -51, -41, + -40, -38, -40, -46, -52, -51, -41, -40, + -46, -40, -38, -38, -41, -46, -41, -46, + -47, -43, -43, -45, -41, -45, -56, -67, + -68, -83, -87, -90, -95, -102, -107, -113, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 1000 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -109, -105, -101, -96, -91, -84, -77, + -82, -82, -85, -89, -94, -100, -106, -110, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -106, -103, -98, -92, -85, -80, -71, + -75, -72, -76, -80, -84, -86, -89, -93, + -100, -107, -113, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -107, + -104, -101, -97, -92, -88, -84, -80, -64, + -66, -63, -64, -66, -69, -73, -77, -83, + -83, -86, -91, -98, -104, -111, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -107, + -104, -101, -97, -92, -90, -84, -74, -57, + -58, -52, -55, -54, -50, -52, -50, -52, + -63, -62, -69, -76, -77, -78, -78, -79, + -82, -88, -94, -100, -106, -111, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -106, -102, + -98, -95, -90, -85, -83, -78, -70, -50, + -50, -41, -44, -49, -47, -50, -50, -44, + -55, -46, -47, -48, -48, -54, -49, -49, + -58, -62, -71, -81, -87, -92, -97, -102, + -108, -114, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -106, -102, + -98, -95, -90, -85, -83, -78, -70, -45, + -43, -41, -47, -50, -51, -50, -49, -45, + -47, -41, -44, -41, -39, -43, -38, -37, + -40, -41, -44, -50, -58, -65, -73, -79, + -85, -92, -97, -101, -105, -109, -113, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 1414 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -107, -100, -95, -87, -81, + -85, -83, -88, -93, -100, -107, -114, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -107, -101, -95, -88, -83, -76, + -73, -72, -79, -84, -90, -95, -100, -105, + -110, -115, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -104, -98, -92, -87, -81, -70, + -65, -62, -67, -71, -74, -80, -85, -91, + -95, -99, -103, -108, -111, -114, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -103, -97, -90, -85, -76, -60, + -56, -54, -60, -62, -61, -56, -63, -65, + -73, -74, -77, -75, -78, -81, -86, -87, + -88, -91, -94, -98, -103, -110, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -105, + -100, -97, -92, -86, -81, -79, -70, -57, + -51, -47, -51, -58, -60, -56, -53, -50, + -58, -52, -50, -50, -53, -55, -64, -69, + -71, -85, -82, -78, -81, -85, -95, -102, + -112, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -105, + -100, -97, -92, -85, -83, -79, -72, -49, + -40, -43, -43, -54, -56, -51, -50, -40, + -43, -38, -36, -35, -37, -38, -37, -44, + -54, -60, -57, -60, -70, -75, -84, -92, + -103, -112, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 2000 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -102, -95, -89, -82, + -83, -84, -90, -92, -99, -107, -113, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -107, -101, -95, -89, -83, -72, + -74, -78, -85, -88, -88, -90, -92, -98, + -105, -111, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -109, -103, -97, -93, -87, -81, -70, + -70, -67, -75, -73, -76, -79, -81, -83, + -88, -89, -97, -103, -110, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -107, -100, -94, -88, -83, -75, -63, + -59, -59, -63, -66, -60, -62, -67, -67, + -77, -76, -81, -88, -86, -92, -96, -102, + -109, -116, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -105, -98, -92, -86, -81, -73, -56, + -52, -47, -55, -60, -58, -52, -51, -45, + -49, -50, -53, -54, -61, -71, -70, -69, + -78, -79, -87, -90, -96, -104, -112, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -103, -96, -90, -86, -78, -70, -51, + -42, -47, -48, -55, -54, -54, -53, -42, + -35, -28, -33, -38, -37, -44, -47, -49, + -54, -63, -68, -78, -82, -89, -94, -99, + -104, -109, -114, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 2828 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -110, -100, -90, -79, + -85, -81, -82, -82, -89, -94, -99, -103, + -109, -115, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -105, -97, -85, -72, + -74, -70, -70, -70, -76, -85, -91, -93, + -97, -103, -109, -115, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -112, -93, -81, -68, + -62, -60, -60, -57, -63, -70, -77, -82, + -90, -93, -98, -104, -109, -113, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -113, -100, -93, -84, -63, + -58, -48, -53, -54, -52, -52, -57, -64, + -66, -76, -83, -81, -85, -85, -90, -95, + -98, -101, -103, -106, -108, -111, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -105, -95, -86, -74, -53, + -50, -38, -43, -49, -43, -42, -39, -39, + -46, -52, -57, -56, -72, -69, -74, -81, + -87, -92, -94, -97, -99, -102, -105, -108, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -108, -99, -90, -76, -66, -45, + -43, -41, -44, -47, -43, -47, -40, -30, + -31, -31, -39, -33, -40, -41, -43, -53, + -59, -70, -73, -77, -79, -82, -84, -87, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 4000 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -110, -91, -76, + -75, -85, -93, -98, -104, -110, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -110, -91, -70, + -70, -75, -86, -89, -94, -98, -101, -106, + -110, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -110, -95, -80, -60, + -65, -64, -74, -83, -88, -91, -95, -99, + -103, -107, -110, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -110, -95, -80, -58, + -55, -49, -66, -68, -71, -78, -78, -80, + -88, -85, -89, -97, -100, -105, -110, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -110, -95, -80, -53, + -52, -41, -59, -59, -49, -58, -56, -63, + -86, -79, -90, -93, -98, -103, -107, -112, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -97, -91, -73, -45, + -40, -33, -53, -61, -49, -54, -50, -50, + -60, -52, -67, -74, -81, -92, -96, -100, + -105, -110, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 5657 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -113, -106, -99, -92, -77, + -80, -88, -97, -106, -115, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -116, -109, -102, -95, -89, -74, + -72, -88, -87, -95, -102, -109, -116, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -116, -109, -102, -95, -89, -75, + -66, -74, -77, -78, -86, -87, -90, -96, + -105, -115, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -115, -108, -101, -94, -88, -66, + -56, -61, -70, -65, -78, -72, -83, -84, + -93, -98, -105, -110, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -110, -105, -95, -89, -82, -57, + -52, -52, -59, -56, -59, -58, -69, -67, + -88, -82, -82, -89, -94, -100, -108, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -110, -101, -96, -90, -83, -77, -54, + -43, -38, -50, -48, -52, -48, -42, -42, + -51, -52, -53, -59, -65, -71, -78, -85, + -95, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 8000 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -120, -105, -86, -68, + -78, -79, -90, -100, -110, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -120, -105, -86, -66, + -73, -77, -88, -96, -105, -115, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -120, -105, -92, -80, -61, + -64, -68, -80, -87, -92, -100, -110, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -120, -104, -91, -79, -52, + -60, -54, -64, -69, -77, -80, -82, -84, + -85, -87, -88, -90, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -118, -100, -87, -77, -49, + -50, -44, -58, -61, -61, -67, -65, -62, + -62, -62, -65, -68, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -115, -98, -84, -62, -49, + -44, -38, -46, -49, -49, -46, -39, -37, + -39, -40, -42, -43, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 11314 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -110, -88, -74, + -77, -82, -82, -85, -90, -94, -99, -104, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -110, -88, -66, + -70, -81, -80, -81, -84, -88, -91, -93, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -110, -88, -61, + -63, -70, -71, -74, -77, -80, -83, -85, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -110, -86, -62, + -63, -62, -62, -58, -52, -50, -50, -52, + -54, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -118, -108, -84, -53, + -50, -50, -50, -55, -47, -45, -40, -40, + -40, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -118, -100, -73, -43, + -37, -42, -43, -53, -38, -37, -35, -35, + -38, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}}, + /* 16000 Hz */ + {{-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -100, -91, -84, -74, + -80, -80, -80, -80, -80, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -100, -91, -84, -74, + -68, -68, -68, -68, -68, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -100, -86, -78, -70, + -60, -45, -30, -21, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -100, -87, -78, -67, + -48, -38, -29, -21, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -100, -86, -69, -56, + -45, -35, -33, -29, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}, + {-999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -110, -100, -83, -71, -48, + -27, -38, -37, -34, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999, + -999, -999, -999, -999, -999, -999, -999, -999}} +}; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c new file mode 100644 index 0000000000..d41dc86f60 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c @@ -0,0 +1,563 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: normalized modified discrete cosine transform + power of two length transform only [64 <= n ] + last mod: $Id: mdct.c 16227 2009-07-08 06:58:46Z xiphmont $ + + Original algorithm adapted long ago from _The use of multirate filter + banks for coding of high quality digital audio_, by T. Sporer, + K. Brandenburg and B. Edler, collection of the European Signal + Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp + 211-214 + + The below code implements an algorithm that no longer looks much like + that presented in the paper, but the basic structure remains if you + dig deep enough to see it. + + This module DOES NOT INCLUDE code to generate/apply the window + function. Everybody has their own weird favorite including me... I + happen to like the properties of y=sin(.5PI*sin^2(x)), but others may + vehemently disagree. + + ********************************************************************/ + +/* this can also be run as an integer transform by uncommenting a + define in mdct.h; the integerization is a first pass and although + it's likely stable for Vorbis, the dynamic range is constrained and + roundoff isn't done (so it's noisy). Consider it functional, but + only a starting point. There's no point on a machine with an FPU */ + +#include +#include +#include +#include +#include "../../codec.h" +#include "mdct.h" +#include "os.h" +#include "misc.h" + +/* build lookups for trig functions; also pre-figure scaling and + some window function algebra. */ + +void mdct_init(mdct_lookup *lookup,int n){ + int *bitrev=(int*) _ogg_malloc(sizeof(*bitrev)*(n/4)); + DATA_TYPE *T=(DATA_TYPE*) _ogg_malloc(sizeof(*T)*(n+n/4)); + + int i; + int n2=n>>1; + int log2n=lookup->log2n=rint(log((float)n)/log(2.f)); + lookup->n=n; + lookup->trig=T; + lookup->bitrev=bitrev; + +/* trig lookups... */ + + for(i=0;i>j;j++) + if((msb>>j)&i)acc|=1<scale=FLOAT_CONV(4.f/n); +} + +/* 8 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_8(DATA_TYPE *x){ + REG_TYPE r0 = x[6] + x[2]; + REG_TYPE r1 = x[6] - x[2]; + REG_TYPE r2 = x[4] + x[0]; + REG_TYPE r3 = x[4] - x[0]; + + x[6] = r0 + r2; + x[4] = r0 - r2; + + r0 = x[5] - x[1]; + r2 = x[7] - x[3]; + x[0] = r1 + r0; + x[2] = r1 - r0; + + r0 = x[5] + x[1]; + r1 = x[7] + x[3]; + x[3] = r2 + r3; + x[1] = r2 - r3; + x[7] = r1 + r0; + x[5] = r1 - r0; + +} + +/* 16 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_16(DATA_TYPE *x){ + REG_TYPE r0 = x[1] - x[9]; + REG_TYPE r1 = x[0] - x[8]; + + x[8] += x[0]; + x[9] += x[1]; + x[0] = MULT_NORM((r0 + r1) * cPI2_8); + x[1] = MULT_NORM((r0 - r1) * cPI2_8); + + r0 = x[3] - x[11]; + r1 = x[10] - x[2]; + x[10] += x[2]; + x[11] += x[3]; + x[2] = r0; + x[3] = r1; + + r0 = x[12] - x[4]; + r1 = x[13] - x[5]; + x[12] += x[4]; + x[13] += x[5]; + x[4] = MULT_NORM((r0 - r1) * cPI2_8); + x[5] = MULT_NORM((r0 + r1) * cPI2_8); + + r0 = x[14] - x[6]; + r1 = x[15] - x[7]; + x[14] += x[6]; + x[15] += x[7]; + x[6] = r0; + x[7] = r1; + + mdct_butterfly_8(x); + mdct_butterfly_8(x+8); +} + +/* 32 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_32(DATA_TYPE *x){ + REG_TYPE r0 = x[30] - x[14]; + REG_TYPE r1 = x[31] - x[15]; + + x[30] += x[14]; + x[31] += x[15]; + x[14] = r0; + x[15] = r1; + + r0 = x[28] - x[12]; + r1 = x[29] - x[13]; + x[28] += x[12]; + x[29] += x[13]; + x[12] = MULT_NORM( r0 * cPI1_8 - r1 * cPI3_8 ); + x[13] = MULT_NORM( r0 * cPI3_8 + r1 * cPI1_8 ); + + r0 = x[26] - x[10]; + r1 = x[27] - x[11]; + x[26] += x[10]; + x[27] += x[11]; + x[10] = MULT_NORM(( r0 - r1 ) * cPI2_8); + x[11] = MULT_NORM(( r0 + r1 ) * cPI2_8); + + r0 = x[24] - x[8]; + r1 = x[25] - x[9]; + x[24] += x[8]; + x[25] += x[9]; + x[8] = MULT_NORM( r0 * cPI3_8 - r1 * cPI1_8 ); + x[9] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 ); + + r0 = x[22] - x[6]; + r1 = x[7] - x[23]; + x[22] += x[6]; + x[23] += x[7]; + x[6] = r1; + x[7] = r0; + + r0 = x[4] - x[20]; + r1 = x[5] - x[21]; + x[20] += x[4]; + x[21] += x[5]; + x[4] = MULT_NORM( r1 * cPI1_8 + r0 * cPI3_8 ); + x[5] = MULT_NORM( r1 * cPI3_8 - r0 * cPI1_8 ); + + r0 = x[2] - x[18]; + r1 = x[3] - x[19]; + x[18] += x[2]; + x[19] += x[3]; + x[2] = MULT_NORM(( r1 + r0 ) * cPI2_8); + x[3] = MULT_NORM(( r1 - r0 ) * cPI2_8); + + r0 = x[0] - x[16]; + r1 = x[1] - x[17]; + x[16] += x[0]; + x[17] += x[1]; + x[0] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 ); + x[1] = MULT_NORM( r1 * cPI1_8 - r0 * cPI3_8 ); + + mdct_butterfly_16(x); + mdct_butterfly_16(x+16); + +} + +/* N point first stage butterfly (in place, 2 register) */ +STIN void mdct_butterfly_first(DATA_TYPE *T, + DATA_TYPE *x, + int points){ + + DATA_TYPE *x1 = x + points - 8; + DATA_TYPE *x2 = x + (points>>1) - 8; + REG_TYPE r0; + REG_TYPE r1; + + do{ + + r0 = x1[6] - x2[6]; + r1 = x1[7] - x2[7]; + x1[6] += x2[6]; + x1[7] += x2[7]; + x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]); + x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]); + + r0 = x1[4] - x2[4]; + r1 = x1[5] - x2[5]; + x1[4] += x2[4]; + x1[5] += x2[5]; + x2[4] = MULT_NORM(r1 * T[5] + r0 * T[4]); + x2[5] = MULT_NORM(r1 * T[4] - r0 * T[5]); + + r0 = x1[2] - x2[2]; + r1 = x1[3] - x2[3]; + x1[2] += x2[2]; + x1[3] += x2[3]; + x2[2] = MULT_NORM(r1 * T[9] + r0 * T[8]); + x2[3] = MULT_NORM(r1 * T[8] - r0 * T[9]); + + r0 = x1[0] - x2[0]; + r1 = x1[1] - x2[1]; + x1[0] += x2[0]; + x1[1] += x2[1]; + x2[0] = MULT_NORM(r1 * T[13] + r0 * T[12]); + x2[1] = MULT_NORM(r1 * T[12] - r0 * T[13]); + + x1-=8; + x2-=8; + T+=16; + + }while(x2>=x); +} + +/* N/stage point generic N stage butterfly (in place, 2 register) */ +STIN void mdct_butterfly_generic(DATA_TYPE *T, + DATA_TYPE *x, + int points, + int trigint){ + + DATA_TYPE *x1 = x + points - 8; + DATA_TYPE *x2 = x + (points>>1) - 8; + REG_TYPE r0; + REG_TYPE r1; + + do{ + + r0 = x1[6] - x2[6]; + r1 = x1[7] - x2[7]; + x1[6] += x2[6]; + x1[7] += x2[7]; + x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]); + x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]); + + T+=trigint; + + r0 = x1[4] - x2[4]; + r1 = x1[5] - x2[5]; + x1[4] += x2[4]; + x1[5] += x2[5]; + x2[4] = MULT_NORM(r1 * T[1] + r0 * T[0]); + x2[5] = MULT_NORM(r1 * T[0] - r0 * T[1]); + + T+=trigint; + + r0 = x1[2] - x2[2]; + r1 = x1[3] - x2[3]; + x1[2] += x2[2]; + x1[3] += x2[3]; + x2[2] = MULT_NORM(r1 * T[1] + r0 * T[0]); + x2[3] = MULT_NORM(r1 * T[0] - r0 * T[1]); + + T+=trigint; + + r0 = x1[0] - x2[0]; + r1 = x1[1] - x2[1]; + x1[0] += x2[0]; + x1[1] += x2[1]; + x2[0] = MULT_NORM(r1 * T[1] + r0 * T[0]); + x2[1] = MULT_NORM(r1 * T[0] - r0 * T[1]); + + T+=trigint; + x1-=8; + x2-=8; + + }while(x2>=x); +} + +STIN void mdct_butterflies(mdct_lookup *init, + DATA_TYPE *x, + int points){ + + DATA_TYPE *T=init->trig; + int stages=init->log2n-5; + int i,j; + + if(--stages>0){ + mdct_butterfly_first(T,x,points); + } + + for(i=1;--stages>0;i++){ + for(j=0;j<(1<>i)*j,points>>i,4<trig)_ogg_free(l->trig); + if(l->bitrev)_ogg_free(l->bitrev); + memset(l,0,sizeof(*l)); + } +} + +STIN void mdct_bitreverse(mdct_lookup *init, + DATA_TYPE *x){ + int n = init->n; + int *bit = init->bitrev; + DATA_TYPE *w0 = x; + DATA_TYPE *w1 = x = w0+(n>>1); + DATA_TYPE *T = init->trig+n; + + do{ + DATA_TYPE *x0 = x+bit[0]; + DATA_TYPE *x1 = x+bit[1]; + + REG_TYPE r0 = x0[1] - x1[1]; + REG_TYPE r1 = x0[0] + x1[0]; + REG_TYPE r2 = MULT_NORM(r1 * T[0] + r0 * T[1]); + REG_TYPE r3 = MULT_NORM(r1 * T[1] - r0 * T[0]); + + w1 -= 4; + + r0 = HALVE(x0[1] + x1[1]); + r1 = HALVE(x0[0] - x1[0]); + + w0[0] = r0 + r2; + w1[2] = r0 - r2; + w0[1] = r1 + r3; + w1[3] = r3 - r1; + + x0 = x+bit[2]; + x1 = x+bit[3]; + + r0 = x0[1] - x1[1]; + r1 = x0[0] + x1[0]; + r2 = MULT_NORM(r1 * T[2] + r0 * T[3]); + r3 = MULT_NORM(r1 * T[3] - r0 * T[2]); + + r0 = HALVE(x0[1] + x1[1]); + r1 = HALVE(x0[0] - x1[0]); + + w0[2] = r0 + r2; + w1[0] = r0 - r2; + w0[3] = r1 + r3; + w1[1] = r3 - r1; + + T += 4; + bit += 4; + w0 += 4; + + }while(w0n; + int n2=n>>1; + int n4=n>>2; + + /* rotate */ + + DATA_TYPE *iX = in+n2-7; + DATA_TYPE *oX = out+n2+n4; + DATA_TYPE *T = init->trig+n4; + + do{ + oX -= 4; + oX[0] = MULT_NORM(-iX[2] * T[3] - iX[0] * T[2]); + oX[1] = MULT_NORM (iX[0] * T[3] - iX[2] * T[2]); + oX[2] = MULT_NORM(-iX[6] * T[1] - iX[4] * T[0]); + oX[3] = MULT_NORM (iX[4] * T[1] - iX[6] * T[0]); + iX -= 8; + T += 4; + }while(iX>=in); + + iX = in+n2-8; + oX = out+n2+n4; + T = init->trig+n4; + + do{ + T -= 4; + oX[0] = MULT_NORM (iX[4] * T[3] + iX[6] * T[2]); + oX[1] = MULT_NORM (iX[4] * T[2] - iX[6] * T[3]); + oX[2] = MULT_NORM (iX[0] * T[1] + iX[2] * T[0]); + oX[3] = MULT_NORM (iX[0] * T[0] - iX[2] * T[1]); + iX -= 8; + oX += 4; + }while(iX>=in); + + mdct_butterflies(init,out+n2,n2); + mdct_bitreverse(init,out); + + /* roatate + window */ + + { + DATA_TYPE *oX1=out+n2+n4; + DATA_TYPE *oX2=out+n2+n4; + DATA_TYPE *iX =out; + T =init->trig+n2; + + do{ + oX1-=4; + + oX1[3] = MULT_NORM (iX[0] * T[1] - iX[1] * T[0]); + oX2[0] = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]); + + oX1[2] = MULT_NORM (iX[2] * T[3] - iX[3] * T[2]); + oX2[1] = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]); + + oX1[1] = MULT_NORM (iX[4] * T[5] - iX[5] * T[4]); + oX2[2] = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]); + + oX1[0] = MULT_NORM (iX[6] * T[7] - iX[7] * T[6]); + oX2[3] = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]); + + oX2+=4; + iX += 8; + T += 8; + }while(iXoX2); + } +} + +void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){ + int n=init->n; + int n2=n>>1; + int n4=n>>2; + int n8=n>>3; + DATA_TYPE *w=(DATA_TYPE*) alloca(n*sizeof(*w)); /* forward needs working space */ + DATA_TYPE *w2=w+n2; + + /* rotate */ + + /* window + rotate + step 1 */ + + REG_TYPE r0; + REG_TYPE r1; + DATA_TYPE *x0=in+n2+n4; + DATA_TYPE *x1=x0+1; + DATA_TYPE *T=init->trig+n2; + + int i=0; + + for(i=0;itrig+n2; + x0=out+n2; + + for(i=0;iscale); + x0[0] =MULT_NORM((w[0]*T[1]-w[1]*T[0])*init->scale); + w+=2; + T+=2; + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h new file mode 100644 index 0000000000..af3e49ec6c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h @@ -0,0 +1,71 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: modified discrete cosine transform prototypes + last mod: $Id: mdct.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _OGG_mdct_H_ +#define _OGG_mdct_H_ + +#include "../../codec.h" + + + + + +/*#define MDCT_INTEGERIZED <- be warned there could be some hurt left here*/ +#ifdef MDCT_INTEGERIZED + +#define DATA_TYPE int +#define REG_TYPE register int +#define TRIGBITS 14 +#define cPI3_8 6270 +#define cPI2_8 11585 +#define cPI1_8 15137 + +#define FLOAT_CONV(x) ((int)((x)*(1<>TRIGBITS) +#define HALVE(x) ((x)>>1) + +#else + +#define DATA_TYPE float +#define REG_TYPE float +#define cPI3_8 .38268343236508977175F +#define cPI2_8 .70710678118654752441F +#define cPI1_8 .92387953251128675613F + +#define FLOAT_CONV(x) (x) +#define MULT_NORM(x) (x) +#define HALVE(x) ((x)*.5f) + +#endif + + +typedef struct { + int n; + int log2n; + + DATA_TYPE *trig; + int *bitrev; + + DATA_TYPE scale; +} mdct_lookup; + +extern void mdct_init(mdct_lookup *lookup,int n); +extern void mdct_clear(mdct_lookup *l); +extern void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); +extern void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h new file mode 100644 index 0000000000..044a5436a2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h @@ -0,0 +1,53 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: miscellaneous prototypes + last mod: $Id: misc.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_RANDOM_H_ +#define _V_RANDOM_H_ +#include "../../codec.h" + +extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes); +extern void _vorbis_block_ripcord(vorbis_block *vb); + +#ifdef ANALYSIS +extern int analysis_noisy; +extern void _analysis_output(char *base,int i,float *v,int n,int bark,int dB, + ogg_int64_t off); +extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB, + ogg_int64_t off); +#endif + +#ifdef DEBUG_MALLOC + +#define _VDBG_GRAPHFILE "malloc.m" +#undef _VDBG_GRAPHFILE +extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line); +extern void _VDBG_free(void *ptr,char *file,long line); + +#ifndef MISC_C +#undef _ogg_malloc +#undef _ogg_calloc +#undef _ogg_realloc +#undef _ogg_free + +#define _ogg_malloc(x) _VDBG_malloc(NULL,(x),__FILE__,__LINE__) +#define _ogg_calloc(x,y) _VDBG_malloc(NULL,(x)*(y),__FILE__,__LINE__) +#define _ogg_realloc(x,y) _VDBG_malloc((x),(y),__FILE__,__LINE__) +#define _ogg_free(x) _VDBG_free((x),__FILE__,__LINE__) +#endif +#endif + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h new file mode 100644 index 0000000000..e1c80e2809 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h @@ -0,0 +1,260 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: key floor settings + last mod: $Id: floor_all.h 17050 2010-03-26 01:34:42Z xiphmont $ + + ********************************************************************/ + +#include "../../../codec.h" +#include "../backends.h" +#include "../books/floor/floor_books.h" + +static const static_codebook*const _floor_128x4_books[]={ + &_huff_book_line_128x4_class0, + &_huff_book_line_128x4_0sub0, + &_huff_book_line_128x4_0sub1, + &_huff_book_line_128x4_0sub2, + &_huff_book_line_128x4_0sub3, +}; +static const static_codebook*const _floor_256x4_books[]={ + &_huff_book_line_256x4_class0, + &_huff_book_line_256x4_0sub0, + &_huff_book_line_256x4_0sub1, + &_huff_book_line_256x4_0sub2, + &_huff_book_line_256x4_0sub3, +}; +static const static_codebook*const _floor_128x7_books[]={ + &_huff_book_line_128x7_class0, + &_huff_book_line_128x7_class1, + + &_huff_book_line_128x7_0sub1, + &_huff_book_line_128x7_0sub2, + &_huff_book_line_128x7_0sub3, + &_huff_book_line_128x7_1sub1, + &_huff_book_line_128x7_1sub2, + &_huff_book_line_128x7_1sub3, +}; +static const static_codebook*const _floor_256x7_books[]={ + &_huff_book_line_256x7_class0, + &_huff_book_line_256x7_class1, + + &_huff_book_line_256x7_0sub1, + &_huff_book_line_256x7_0sub2, + &_huff_book_line_256x7_0sub3, + &_huff_book_line_256x7_1sub1, + &_huff_book_line_256x7_1sub2, + &_huff_book_line_256x7_1sub3, +}; +static const static_codebook*const _floor_128x11_books[]={ + &_huff_book_line_128x11_class1, + &_huff_book_line_128x11_class2, + &_huff_book_line_128x11_class3, + + &_huff_book_line_128x11_0sub0, + &_huff_book_line_128x11_1sub0, + &_huff_book_line_128x11_1sub1, + &_huff_book_line_128x11_2sub1, + &_huff_book_line_128x11_2sub2, + &_huff_book_line_128x11_2sub3, + &_huff_book_line_128x11_3sub1, + &_huff_book_line_128x11_3sub2, + &_huff_book_line_128x11_3sub3, +}; +static const static_codebook*const _floor_128x17_books[]={ + &_huff_book_line_128x17_class1, + &_huff_book_line_128x17_class2, + &_huff_book_line_128x17_class3, + + &_huff_book_line_128x17_0sub0, + &_huff_book_line_128x17_1sub0, + &_huff_book_line_128x17_1sub1, + &_huff_book_line_128x17_2sub1, + &_huff_book_line_128x17_2sub2, + &_huff_book_line_128x17_2sub3, + &_huff_book_line_128x17_3sub1, + &_huff_book_line_128x17_3sub2, + &_huff_book_line_128x17_3sub3, +}; +static const static_codebook*const _floor_256x4low_books[]={ + &_huff_book_line_256x4low_class0, + &_huff_book_line_256x4low_0sub0, + &_huff_book_line_256x4low_0sub1, + &_huff_book_line_256x4low_0sub2, + &_huff_book_line_256x4low_0sub3, +}; +static const static_codebook*const _floor_1024x27_books[]={ + &_huff_book_line_1024x27_class1, + &_huff_book_line_1024x27_class2, + &_huff_book_line_1024x27_class3, + &_huff_book_line_1024x27_class4, + + &_huff_book_line_1024x27_0sub0, + &_huff_book_line_1024x27_1sub0, + &_huff_book_line_1024x27_1sub1, + &_huff_book_line_1024x27_2sub0, + &_huff_book_line_1024x27_2sub1, + &_huff_book_line_1024x27_3sub1, + &_huff_book_line_1024x27_3sub2, + &_huff_book_line_1024x27_3sub3, + &_huff_book_line_1024x27_4sub1, + &_huff_book_line_1024x27_4sub2, + &_huff_book_line_1024x27_4sub3, +}; +static const static_codebook*const _floor_2048x27_books[]={ + &_huff_book_line_2048x27_class1, + &_huff_book_line_2048x27_class2, + &_huff_book_line_2048x27_class3, + &_huff_book_line_2048x27_class4, + + &_huff_book_line_2048x27_0sub0, + &_huff_book_line_2048x27_1sub0, + &_huff_book_line_2048x27_1sub1, + &_huff_book_line_2048x27_2sub0, + &_huff_book_line_2048x27_2sub1, + &_huff_book_line_2048x27_3sub1, + &_huff_book_line_2048x27_3sub2, + &_huff_book_line_2048x27_3sub3, + &_huff_book_line_2048x27_4sub1, + &_huff_book_line_2048x27_4sub2, + &_huff_book_line_2048x27_4sub3, +}; + +static const static_codebook*const _floor_512x17_books[]={ + &_huff_book_line_512x17_class1, + &_huff_book_line_512x17_class2, + &_huff_book_line_512x17_class3, + + &_huff_book_line_512x17_0sub0, + &_huff_book_line_512x17_1sub0, + &_huff_book_line_512x17_1sub1, + &_huff_book_line_512x17_2sub1, + &_huff_book_line_512x17_2sub2, + &_huff_book_line_512x17_2sub3, + &_huff_book_line_512x17_3sub1, + &_huff_book_line_512x17_3sub2, + &_huff_book_line_512x17_3sub3, +}; + +static const static_codebook*const _floor_Xx0_books[]={ + 0 +}; + +static const static_codebook*const *const _floor_books[11]={ + _floor_128x4_books, + _floor_256x4_books, + _floor_128x7_books, + _floor_256x7_books, + _floor_128x11_books, + _floor_128x17_books, + _floor_256x4low_books, + _floor_1024x27_books, + _floor_2048x27_books, + _floor_512x17_books, + _floor_Xx0_books, +}; + +static const vorbis_info_floor1 _floor[11]={ + /* 0: 128 x 4 */ + { + 1,{0},{4},{2},{0}, + {{1,2,3,4}}, + 4,{0,128, 33,8,16,70}, + + 60,30,500, 1.,18., 128 + }, + /* 1: 256 x 4 */ + { + 1,{0},{4},{2},{0}, + {{1,2,3,4}}, + 4,{0,256, 66,16,32,140}, + + 60,30,500, 1.,18., 256 + }, + /* 2: 128 x 7 */ + { + 2,{0,1},{3,4},{2,2},{0,1}, + {{-1,2,3,4},{-1,5,6,7}}, + 4,{0,128, 14,4,58, 2,8,28,90}, + + 60,30,500, 1.,18., 128 + }, + /* 3: 256 x 7 */ + { + 2,{0,1},{3,4},{2,2},{0,1}, + {{-1,2,3,4},{-1,5,6,7}}, + 4,{0,256, 28,8,116, 4,16,56,180}, + + 60,30,500, 1.,18., 256 + }, + /* 4: 128 x 11 */ + { + 4,{0,1,2,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + + 2,{0,128, 8,33, 4,16,70, 2,6,12, 23,46,90}, + + 60,30,500, 1,18., 128 + }, + /* 5: 128 x 17 */ + { + 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + 2,{0,128, 12,46, 4,8,16, 23,33,70, 2,6,10, 14,19,28, 39,58,90}, + + 60,30,500, 1,18., 128 + }, + /* 6: 256 x 4 (low bitrate version) */ + { + 1,{0},{4},{2},{0}, + {{1,2,3,4}}, + 4,{0,256, 66,16,32,140}, + + 60,30,500, 1.,18., 256 + }, + /* 7: 1024 x 27 */ + { + 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, + {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, + 2,{0,1024, 93,23,372, 6,46,186,750, 14,33,65, 130,260,556, + 3,10,18,28, 39,55,79,111, 158,220,312, 464,650,850}, + + 60,30,500, 3,18., 1024 + }, + /* 8: 2048 x 27 */ + { + 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, + {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, + 2,{0,2048, 186,46,744, 12,92,372,1500, 28,66,130, 260,520,1112, + 6,20,36,56, 78,110,158,222, 316,440,624, 928,1300,1700}, + + 60,30,500, 3,18., 2048 + }, + /* 9: 512 x 17 */ + { + 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + 2,{0,512, 46,186, 16,33,65, 93,130,278, + 7,23,39, 55,79,110, 156,232,360}, + + 60,30,500, 1,18., 512 + }, + + /* 10: X x 0 (LFE floor; edge posts only) */ + { + 0,{0}, {0},{0},{-1}, + {{-1}}, + 2,{0,12}, + 60,30,500, 1.,18., 10 + }, + +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h new file mode 100644 index 0000000000..0d0d2aee2d --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h @@ -0,0 +1,50 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 11kHz settings + last mod: $Id: psych_11.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +static const double _psy_lowpass_11[3]={4.5,5.5,30.,}; + +static const att3 _psy_tone_masteratt_11[3]={ + {{ 30, 25, 12}, 0, 0}, /* 0 */ + {{ 30, 25, 12}, 0, 0}, /* 0 */ + {{ 20, 0, -14}, 0, 0}, /* 0 */ +}; + +static const vp_adjblock _vp_tonemask_adj_11[3]={ + /* adjust for mode zero */ + /* 63 125 250 500 1 2 4 8 16 */ + {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 2, 0,99,99,99}}, /* 0 */ + {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 5, 0, 0,99,99,99}}, /* 1 */ + {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 2 */ +}; + + +static const noise3 _psy_noisebias_11[3]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99}, + {-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 4, 5, 5, 10, 99, 99, 99}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, + + {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99}, + {-15,-15,-15,-15,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99}, + {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}}, +}; + +static const double _noise_thresh_11[3]={ .3,.5,.5 }; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h new file mode 100644 index 0000000000..0c6593b487 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h @@ -0,0 +1,133 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 16kHz settings + last mod: $Id: psych_16.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +/* stereo mode by base quality level */ +static const adj_stereo _psy_stereo_modes_16[4]={ + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ + {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + {{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, +}; + +static const double _psy_lowpass_16[4]={6.5,8,30.,99.}; + +static const att3 _psy_tone_masteratt_16[4]={ + {{ 30, 25, 12}, 0, 0}, /* 0 */ + {{ 25, 22, 12}, 0, 0}, /* 0 */ + {{ 20, 12, 0}, 0, 0}, /* 0 */ + {{ 15, 0, -14}, 0, 0}, /* 0 */ +}; + +static const vp_adjblock _vp_tonemask_adj_16[4]={ + /* adjust for mode zero */ + /* 63 125 250 500 1 2 4 8 16 */ + {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 0 */ + {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 1 */ + {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ + {{-30,-30,-30,-30,-30,-26,-20,-10, -5, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ +}; + + +static const noise3 _psy_noisebias_16_short[4]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20}, + {-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, + + {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 6, 6, 6, 6, 8, 10, 12, 20}, + {-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 4, 5, 6, 8, 8, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12}, + {-20,-20,-20,-20,-16,-12,-20,-14,-10,-10, -8, 0, 0, 0, 0, 2, 5}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, +}; + +static const noise3 _psy_noisebias_16_impulse[4]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20}, + {-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, + + {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 4, 4, 4, 5, 5, 6, 8, 15}, + {-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 0, 0, 0, 0, 4, 10}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 4, 10}, + {-20,-20,-20,-20,-16,-12,-20,-14,-10,-10,-10,-10,-10,-10,-10, -7, -5}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, + {-30,-30,-30,-30,-26,-22,-20,-18,-18,-18,-20,-20,-20,-20,-20,-20,-16}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, +}; + +static const noise3 _psy_noisebias_16[4]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 8, 8, 10, 10, 10, 14, 20}, + {-10,-10,-10,-10,-10, -5, -2, -2, 0, 0, 0, 4, 5, 6, 8, 8, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, + + {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 6, 6, 6, 8, 10, 12, 20}, + {-15,-15,-15,-15,-15,-10, -5, -5, 0, 0, 0, 4, 5, 6, 8, 8, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12}, + {-20,-20,-20,-20,-16,-12,-20,-10, -5, -5, 0, 0, 0, 0, 0, 2, 5}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, +}; + +static const noiseguard _psy_noiseguards_16[4]={ + {10,10,-1}, + {10,10,-1}, + {20,20,-1}, + {20,20,-1}, +}; + +static const double _noise_thresh_16[4]={ .3,.5,.5,.5 }; + +static const int _noise_start_16[3]={ 256,256,9999 }; +static const int _noise_part_16[4]={ 8,8,8,8 }; + +static const int _psy_ath_floater_16[4]={ + -100,-100,-100,-105, +}; + +static const int _psy_ath_abs_16[4]={ + -130,-130,-130,-140, +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h new file mode 100644 index 0000000000..d0cbb60cff --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h @@ -0,0 +1,642 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: key psychoacoustic settings for 44.1/48kHz + last mod: $Id: psych_44.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + + +/* preecho trigger settings *****************************************/ + +static const vorbis_info_psy_global _psy_global_44[5]={ + + {8, /* lines per eighth octave */ + {20.f,14.f,12.f,12.f,12.f,12.f,12.f}, + {-60.f,-30.f,-40.f,-40.f,-40.f,-40.f,-40.f}, 2,-75.f, + -6.f, + {99},{{99},{99}},{0},{0},{{0},{0}} + }, + {8, /* lines per eighth octave */ + {14.f,10.f,10.f,10.f,10.f,10.f,10.f}, + {-40.f,-30.f,-25.f,-25.f,-25.f,-25.f,-25.f}, 2,-80.f, + -6.f, + {99},{{99},{99}},{0},{0},{{0},{0}} + }, + {8, /* lines per eighth octave */ + {12.f,10.f,10.f,10.f,10.f,10.f,10.f}, + {-20.f,-20.f,-15.f,-15.f,-15.f,-15.f,-15.f}, 0,-80.f, + -6.f, + {99},{{99},{99}},{0},{0},{{0},{0}} + }, + {8, /* lines per eighth octave */ + {10.f,8.f,8.f,8.f,8.f,8.f,8.f}, + {-20.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-80.f, + -6.f, + {99},{{99},{99}},{0},{0},{{0},{0}} + }, + {8, /* lines per eighth octave */ + {10.f,6.f,6.f,6.f,6.f,6.f,6.f}, + {-15.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-85.f, + -6.f, + {99},{{99},{99}},{0},{0},{{0},{0}} + }, +}; + +/* noise compander lookups * low, mid, high quality ****************/ +static const compandblock _psy_compand_44[6]={ + /* sub-mode Z short */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 9,10,11,12,13,14, 15, /* 15dB */ + 16,17,18,19,20,21,22, 23, /* 23dB */ + 24,25,26,27,28,29,30, 31, /* 31dB */ + 32,33,34,35,36,37,38, 39, /* 39dB */ + }}, + /* mode_Z nominal short */ + {{ + 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ + 7, 7, 7, 7, 6, 6, 6, 7, /* 15dB */ + 7, 8, 9,10,11,12,13, 14, /* 23dB */ + 15,16,17,17,17,18,18, 19, /* 31dB */ + 19,19,20,21,22,23,24, 25, /* 39dB */ + }}, + /* mode A short */ + {{ + 0, 1, 2, 3, 4, 5, 5, 5, /* 7dB */ + 6, 6, 6, 5, 4, 4, 4, 4, /* 15dB */ + 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ + 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ + 11,12,13,14,15,16,17, 18, /* 39dB */ + }}, + /* sub-mode Z long */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 9,10,11,12,13,14, 15, /* 15dB */ + 16,17,18,19,20,21,22, 23, /* 23dB */ + 24,25,26,27,28,29,30, 31, /* 31dB */ + 32,33,34,35,36,37,38, 39, /* 39dB */ + }}, + /* mode_Z nominal long */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 9,10,11,12,12,13, 13, /* 15dB */ + 13,14,14,14,15,15,15, 15, /* 23dB */ + 16,16,17,17,17,18,18, 19, /* 31dB */ + 19,19,20,21,22,23,24, 25, /* 39dB */ + }}, + /* mode A long */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 8, 7, 6, 5, 4, 4, 4, /* 15dB */ + 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ + 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ + 11,12,13,14,15,16,17, 18, /* 39dB */ + }} +}; + +/* tonal masking curve level adjustments *************************/ + +static const vp_adjblock _vp_tonemask_adj_longblock[12]={ + + /* 63 125 250 500 1 2 4 8 16 */ + + {{ -3, -8,-13,-15,-10,-10,-10,-10,-10,-10,-10, 0, 0, 0, 0, 0, 0}}, /* -1 */ + +/* {{-15,-15,-15,-15,-10, -8, -4, -2, 0, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */ + {{ -4,-10,-14,-16,-15,-14,-13,-12,-12,-12,-11, -1, -1, -1, -1, -1, 0}}, /* 0 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */ + {{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, -1, -1, 0}}, /* 1 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */ + {{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -6, -3, -1, -1, -1, 0}}, /* 2 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */ + {{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, -1, -1, 0}}, /* 3 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, *//* 4 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */ + +/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */ +}; + +static const vp_adjblock _vp_tonemask_adj_otherblock[12]={ + /* 63 125 250 500 1 2 4 8 16 */ + + {{ -3, -8,-13,-15,-10,-10, -9, -9, -9, -9, -9, 1, 1, 1, 1, 1, 1}}, /* -1 */ + +/* {{-20,-20,-20,-20,-14,-12,-10, -8, -4, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */ + {{ -4,-10,-14,-16,-14,-13,-12,-12,-11,-11,-10, 0, 0, 0, 0, 0, 0}}, /* 0 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */ + {{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, 0, 0, 0}}, /* 1 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */ + {{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -5, -2, -1, 0, 0, 0}}, /* 2 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */ + {{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, 0, 0, 0}}, /* 3 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 4 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */ + +/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */ + {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */ +}; + +/* noise bias (transition block) */ +static const noise3 _psy_noisebias_trans[12]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + /* -1 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, + /* 0 + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 4, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}},*/ + {{{-15,-15,-15,-15,-15,-12, -6, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 3, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}}, + /* 1 + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, + /* 2 + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, */ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -7, -4}}}, + /* 3 + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 4 + {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ + {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 5 + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, + {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, */ + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0}, + {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, + /* 6 + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, + {-34,-34,-34,-34,-30,-26,-24,-18,-17,-15,-15,-15,-15,-13,-13,-12, -8}}},*/ + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0}, + {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}}, + /* 7 + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-24,-18,-14,-12,-10, -8, -8, -8, -6, -4, 0}, + {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}},*/ + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-24,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, + {-34,-34,-34,-34,-30,-26,-26,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, + /* 8 + {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, + {-36,-36,-36,-36,-30,-30,-30,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, + {-36,-36,-36,-36,-34,-30,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/ + {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, + {-36,-36,-36,-36,-30,-30,-30,-24,-20,-16,-16,-16,-16,-14,-12,-10, -7}, + {-36,-36,-36,-36,-34,-30,-28,-26,-24,-30,-30,-30,-30,-30,-30,-24,-20}}}, + /* 9 + {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, + {-36,-36,-36,-36,-34,-32,-32,-28,-20,-16,-16,-16,-16,-14,-12,-10, -7}, + {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/ + {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, + {-38,-38,-38,-38,-36,-34,-34,-30,-24,-20,-20,-20,-20,-18,-16,-12,-10}, + {-40,-40,-40,-40,-40,-40,-40,-38,-35,-35,-35,-35,-35,-35,-35,-35,-30}}}, + /* 10 */ + {{{-30,-30,-30,-30,-30,-30,-30,-28,-20,-14,-14,-14,-14,-14,-14,-12,-10}, + {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-20}, + {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, +}; + +/* noise bias (long block) */ +static const noise3 _psy_noisebias_long[12]={ + /*63 125 250 500 1k 2k 4k 8k 16k*/ + /* -1 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 0, 6, 6, 6, 6, 10, 10, 12, 20}, + {-20,-20,-20,-20,-20,-20,-10, -2, 0, 0, 0, 0, 0, 2, 4, 6, 15}, + {-20,-20,-20,-20,-20,-20,-20,-10, -6, -6, -6, -6, -6, -4, -4, -4, -2}}}, + + /* 0 */ + /* {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 4, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}},*/ + {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 3, 6}, + {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}}, + /* 1 */ + /* {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/ + {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, + /* 2 */ + /* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ + {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 3 */ + /* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ + {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -5}}}, + /* 4 */ + /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -7}}}, + /* 5 */ + /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, + {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}},*/ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0}, + {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -8}}}, + /* 6 */ + /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, + {-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12, -8}}},*/ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0}, + {-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12,-10}}}, + /* 7 */ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-24,-24,-24,-24,-24,-24,-24,-18,-14,-10, -8, -8, -8, -8, -6, -4, 0}, + {-26,-26,-26,-26,-26,-26,-26,-22,-20,-19,-19,-19,-19,-18,-17,-16,-12}}}, + /* 8 */ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 0, 0, 0, 0, 1, 2, 3, 7}, + {-26,-26,-26,-26,-26,-26,-26,-20,-16,-12,-10,-10,-10,-10, -8, -6, -2}, + {-28,-28,-28,-28,-28,-28,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, + /* 9 */ + {{{-22,-22,-22,-22,-22,-22,-22,-18,-14, -8, -4, -4, -4, -4, -4, -2, 2}, + {-26,-26,-26,-26,-26,-26,-26,-22,-18,-16,-16,-16,-16,-14,-12,-10, -7}, + {-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, + /* 10 */ + {{{-24,-24,-24,-24,-24,-24,-24,-24,-24,-18,-14,-14,-14,-14,-14,-12,-10}, + {-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-20}, + {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, +}; + +/* noise bias (impulse block) */ +static const noise3 _psy_noisebias_impulse[12]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + /* -1 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, + + /* 0 */ + /* {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 4, 10}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},*/ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 3, 6}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, + /* 1 */ + {{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -4, -4, -2, -2, -2, -2, 2}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8,-10,-10, -8, -8, -8, -6, -4}}}, + /* 2 */ + {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, + /* 3 */ + {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, + /* 4 */ + {{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, + /* 5 */ + {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, + {-32,-32,-32,-32,-28,-24,-22,-16,-10, -6, -8, -8, -6, -6, -6, -4, -2}, + {-34,-34,-34,-34,-30,-26,-24,-18,-14,-12,-12,-12,-12,-12,-10, -9, -5}}}, + /* 6 + {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, + {-34,-34,-34,-34,-30,-30,-24,-20,-12,-12,-14,-14,-10, -9, -8, -6, -4}, + {-34,-34,-34,-34,-34,-30,-26,-20,-16,-15,-15,-15,-15,-15,-13,-12, -8}}},*/ + {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, + {-34,-34,-34,-34,-30,-30,-30,-24,-16,-16,-16,-16,-16,-16,-14,-14,-12}, + {-36,-36,-36,-36,-36,-34,-28,-24,-20,-20,-20,-20,-20,-20,-20,-18,-16}}}, + /* 7 */ + /* {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11}, + {-34,-34,-34,-34,-30,-30,-24,-20,-14,-14,-16,-16,-14,-12,-10,-10,-10}, + {-34,-34,-34,-34,-32,-32,-30,-24,-20,-19,-19,-19,-19,-19,-17,-16,-12}}},*/ + {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11}, + {-34,-34,-34,-34,-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-24,-22}, + {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}}, + /* 8 */ + /* {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10}, + {-34,-34,-34,-34,-30,-30,-30,-24,-20,-20,-20,-20,-20,-18,-16,-16,-14}, + {-36,-36,-36,-36,-36,-34,-28,-24,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/ + {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10}, + {-34,-34,-34,-34,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-24}, + {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}}, + /* 9 */ + /* {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, + {-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-22,-20,-20,-18}, + {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/ + {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, + {-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26}, + {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, + /* 10 */ + {{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-16,-16,-16,-16,-16,-14,-12}, + {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-26}, + {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, +}; + +/* noise bias (padding block) */ +static const noise3 _psy_noisebias_padding[12]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + + /* -1 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, + + /* 0 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, 2, 3, 6, 6, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -4, -4, -4, -4, -2, 0, 2}}}, + /* 1 */ + {{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -6, -4, -2, 0}}}, + /* 2 */ + /* {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},*/ + {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, + /* 3 */ + {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, + /* 4 */ + {{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, -1, 0, 2, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, + /* 5 */ + {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, + {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -3, -3, -3, -3, -2, 0, 4}, + {-34,-34,-34,-34,-30,-26,-24,-18,-14,-10,-10,-10,-10,-10, -8, -5, -3}}}, + /* 6 */ + {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, + {-34,-34,-34,-34,-30,-30,-24,-20,-14, -8, -4, -4, -4, -4, -3, -1, 4}, + {-34,-34,-34,-34,-34,-30,-26,-20,-16,-13,-13,-13,-13,-13,-11, -8, -6}}}, + /* 7 */ + {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, + {-34,-34,-34,-34,-30,-30,-30,-24,-16,-10, -8, -6, -6, -6, -5, -3, 1}, + {-34,-34,-34,-34,-32,-32,-28,-22,-18,-16,-16,-16,-16,-16,-14,-12,-10}}}, + /* 8 */ + {{{-22,-22,-22,-22,-22,-20,-14,-10, -4, 0, 0, 0, 0, 3, 5, 5, 11}, + {-34,-34,-34,-34,-30,-30,-30,-24,-16,-12,-10, -8, -8, -8, -7, -5, -2}, + {-36,-36,-36,-36,-36,-34,-28,-22,-20,-20,-20,-20,-20,-20,-20,-16,-14}}}, + /* 9 */ + {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -2, -2, -2, -2, 0, 2, 6}, + {-36,-36,-36,-36,-34,-32,-32,-24,-16,-12,-12,-12,-12,-12,-10, -8, -5}, + {-40,-40,-40,-40,-40,-40,-40,-32,-26,-24,-24,-24,-24,-24,-24,-20,-18}}}, + /* 10 */ + {{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-12,-12,-12,-12,-12,-10, -8}, + {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-25,-25,-25,-25,-25,-25,-15}, + {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, +}; + + +static const noiseguard _psy_noiseguards_44[4]={ + {3,3,15}, + {3,3,15}, + {10,10,100}, + {10,10,100}, +}; + +static const int _psy_tone_suppress[12]={ + -20,-20,-20,-20,-20,-24,-30,-40,-40,-45,-45,-45, +}; +static const int _psy_tone_0dB[12]={ + 90,90,95,95,95,95,105,105,105,105,105,105, +}; +static const int _psy_noise_suppress[12]={ + -20,-20,-24,-24,-24,-24,-30,-40,-40,-45,-45,-45, +}; + +static const vorbis_info_psy _psy_info_template={ + /* blockflag */ + -1, + /* ath_adjatt, ath_maxatt */ + -140.,-140., + /* tonemask att boost/decay,suppr,curves */ + {0.f,0.f,0.f}, 0.,0., -40.f, {0.}, + + /*noisemaskp,supp, low/high window, low/hi guard, minimum */ + 1, -0.f, .5f, .5f, 0,0,0, + /* noiseoffset*3, noisecompand, max_curve_dB */ + {{-1},{-1},{-1}},{-1},105.f, + /* noise normalization - noise_p, start, partition, thresh. */ + 0,-1,-1,0., +}; + +/* ath ****************/ + +static const int _psy_ath_floater[12]={ + -100,-100,-100,-100,-100,-100,-105,-105,-105,-105,-110,-120, +}; +static const int _psy_ath_abs[12]={ + -130,-130,-130,-130,-140,-140,-140,-140,-140,-140,-140,-150, +}; + +/* stereo setup. These don't map directly to quality level, there's + an additional indirection as several of the below may be used in a + single bitmanaged stream + +****************/ + +/* various stereo possibilities */ + +/* stereo mode by base quality level */ +static const adj_stereo _psy_stereo_modes_44[12]={ + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -1 */ + {{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1, 0, 0, 0, 0}, + { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 4, 3}, + { 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8}, + { 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}}, + +/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 */ + {{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0}, + { 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3}, + { 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8}, + { 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}}, + + + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 */ + {{ 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, 0, 0, 0, 0}, + { 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3}, + { 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + + + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 */ + {{ 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0}, + { 8, 8, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 2, 1}, + { 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 */ + {{ 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, + { 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1}, + { 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 10, 10, 10, 10, 10}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 */ + {{ 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 1, 0}, + { 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5 */ + {{ 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, + { 6, 7, 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 6 */ + {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 3, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 */ + {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 3, 3, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 8 */ + {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 9 */ + {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 10 */ + {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, +}; + +/* tone master attenuation by base quality mode and bitrate tweak */ +static const att3 _psy_tone_masteratt_44[12]={ + {{ 35, 21, 9}, 0, 0}, /* -1 */ + {{ 30, 20, 8}, -2, 1.25}, /* 0 */ + /* {{ 25, 14, 4}, 0, 0}, *//* 1 */ + {{ 25, 12, 2}, 0, 0}, /* 1 */ + /* {{ 20, 10, -2}, 0, 0}, *//* 2 */ + {{ 20, 9, -3}, 0, 0}, /* 2 */ + {{ 20, 9, -4}, 0, 0}, /* 3 */ + {{ 20, 9, -4}, 0, 0}, /* 4 */ + {{ 20, 6, -6}, 0, 0}, /* 5 */ + {{ 20, 3, -10}, 0, 0}, /* 6 */ + {{ 18, 1, -14}, 0, 0}, /* 7 */ + {{ 18, 0, -16}, 0, 0}, /* 8 */ + {{ 18, -2, -16}, 0, 0}, /* 9 */ + {{ 12, -2, -20}, 0, 0}, /* 10 */ +}; + +/* lowpass by mode **************/ +static const double _psy_lowpass_44[12]={ + /* 15.1,15.8,16.5,17.9,20.5,48.,999.,999.,999.,999.,999. */ + 13.9,15.1,15.8,16.5,17.2,18.9,20.1,48.,999.,999.,999.,999. +}; + +/* noise normalization **********/ + +static const int _noise_start_short_44[11]={ + /* 16,16,16,16,32,32,9999,9999,9999,9999 */ + 32,16,16,16,32,9999,9999,9999,9999,9999,9999 +}; +static const int _noise_start_long_44[11]={ + /* 128,128,128,256,512,512,9999,9999,9999,9999 */ + 256,128,128,256,512,9999,9999,9999,9999,9999,9999 +}; + +static const int _noise_part_short_44[11]={ + 8,8,8,8,8,8,8,8,8,8,8 +}; +static const int _noise_part_long_44[11]={ + 32,32,32,32,32,32,32,32,32,32,32 +}; + +static const double _noise_thresh_44[11]={ + /* .2,.2,.3,.4,.5,.5,9999.,9999.,9999.,9999., */ + .2,.2,.2,.4,.6,9999.,9999.,9999.,9999.,9999.,9999., +}; + +static const double _noise_thresh_5only[2]={ + .5,.5, +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h new file mode 100644 index 0000000000..9cb9f31732 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h @@ -0,0 +1,101 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 8kHz psychoacoustic settings + last mod: $Id: psych_8.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +static const att3 _psy_tone_masteratt_8[3]={ + {{ 32, 25, 12}, 0, 0}, /* 0 */ + {{ 30, 25, 12}, 0, 0}, /* 0 */ + {{ 20, 0, -14}, 0, 0}, /* 0 */ +}; + +static const vp_adjblock _vp_tonemask_adj_8[3]={ + /* adjust for mode zero */ + /* 63 125 250 500 1 2 4 8 16 */ + {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */ + {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */ + {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 1 */ +}; + + +static const noise3 _psy_noisebias_8[3]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99}, + {-10,-10,-10,-10, -5, -5, -5, 0, 0, 4, 4, 4, 4, 4, 99, 99, 99}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, + + {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99}, + {-10,-10,-10,-10,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, + + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99}, + {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99}, + {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}}, +}; + +/* stereo mode by base quality level */ +static const adj_stereo _psy_stereo_modes_8[3]={ + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ + {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, + {{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, +}; + +static const noiseguard _psy_noiseguards_8[2]={ + {10,10,-1}, + {10,10,-1}, +}; + +static const compandblock _psy_compand_8[2]={ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 8, 9, 9,10,10,11, 11, /* 15dB */ + 12,12,13,13,14,14,15, 15, /* 23dB */ + 16,16,17,17,17,18,18, 19, /* 31dB */ + 19,19,20,21,22,23,24, 25, /* 39dB */ + }}, + {{ + 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ + 7, 7, 6, 6, 5, 5, 4, 4, /* 15dB */ + 3, 3, 3, 4, 5, 6, 7, 8, /* 23dB */ + 9,10,11,12,13,14,15, 16, /* 31dB */ + 17,18,19,20,21,22,23, 24, /* 39dB */ + }}, +}; + +static const double _psy_lowpass_8[3]={3.,4.,4.}; +static const int _noise_start_8[2]={ + 64,64, +}; +static const int _noise_part_8[2]={ + 8,8, +}; + +static const int _psy_ath_floater_8[3]={ + -100,-100,-105, +}; + +static const int _psy_ath_abs_8[3]={ + -130,-130,-140, +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h new file mode 100644 index 0000000000..4d7c71a80a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h @@ -0,0 +1,163 @@ +/******************************************************************** + * * + * This FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel residue templates 16/22kHz + last mod: $Id: residue_16.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + +/***** residue backends *********************************************/ + +static const static_bookblock _resbook_16s_0={ + { + {0}, + {0,0,&_16c0_s_p1_0}, + {0}, + {0,0,&_16c0_s_p3_0}, + {0,0,&_16c0_s_p4_0}, + {0,0,&_16c0_s_p5_0}, + {0,0,&_16c0_s_p6_0}, + {&_16c0_s_p7_0,&_16c0_s_p7_1}, + {&_16c0_s_p8_0,&_16c0_s_p8_1}, + {&_16c0_s_p9_0,&_16c0_s_p9_1,&_16c0_s_p9_2} + } +}; +static const static_bookblock _resbook_16s_1={ + { + {0}, + {0,0,&_16c1_s_p1_0}, + {0}, + {0,0,&_16c1_s_p3_0}, + {0,0,&_16c1_s_p4_0}, + {0,0,&_16c1_s_p5_0}, + {0,0,&_16c1_s_p6_0}, + {&_16c1_s_p7_0,&_16c1_s_p7_1}, + {&_16c1_s_p8_0,&_16c1_s_p8_1}, + {&_16c1_s_p9_0,&_16c1_s_p9_1,&_16c1_s_p9_2} + } +}; +static const static_bookblock _resbook_16s_2={ + { + {0}, + {0,0,&_16c2_s_p1_0}, + {0,0,&_16c2_s_p2_0}, + {0,0,&_16c2_s_p3_0}, + {0,0,&_16c2_s_p4_0}, + {&_16c2_s_p5_0,&_16c2_s_p5_1}, + {&_16c2_s_p6_0,&_16c2_s_p6_1}, + {&_16c2_s_p7_0,&_16c2_s_p7_1}, + {&_16c2_s_p8_0,&_16c2_s_p8_1}, + {&_16c2_s_p9_0,&_16c2_s_p9_1,&_16c2_s_p9_2} + } +}; + +static const vorbis_residue_template _res_16s_0[]={ + {2,0,32, &_residue_44_mid, + &_huff_book__16c0_s_single,&_huff_book__16c0_s_single, + &_resbook_16s_0,&_resbook_16s_0}, +}; +static const vorbis_residue_template _res_16s_1[]={ + {2,0,32, &_residue_44_mid, + &_huff_book__16c1_s_short,&_huff_book__16c1_s_short, + &_resbook_16s_1,&_resbook_16s_1}, + + {2,0,32, &_residue_44_mid, + &_huff_book__16c1_s_long,&_huff_book__16c1_s_long, + &_resbook_16s_1,&_resbook_16s_1} +}; +static const vorbis_residue_template _res_16s_2[]={ + {2,0,32, &_residue_44_high, + &_huff_book__16c2_s_short,&_huff_book__16c2_s_short, + &_resbook_16s_2,&_resbook_16s_2}, + + {2,0,32, &_residue_44_high, + &_huff_book__16c2_s_long,&_huff_book__16c2_s_long, + &_resbook_16s_2,&_resbook_16s_2} +}; + +static const vorbis_mapping_template _mapres_template_16_stereo[3]={ + { _map_nominal, _res_16s_0 }, /* 0 */ + { _map_nominal, _res_16s_1 }, /* 1 */ + { _map_nominal, _res_16s_2 }, /* 2 */ +}; + +static const static_bookblock _resbook_16u_0={ + { + {0}, + {0,0,&_16u0__p1_0}, + {0,0,&_16u0__p2_0}, + {0,0,&_16u0__p3_0}, + {0,0,&_16u0__p4_0}, + {0,0,&_16u0__p5_0}, + {&_16u0__p6_0,&_16u0__p6_1}, + {&_16u0__p7_0,&_16u0__p7_1,&_16u0__p7_2} + } +}; +static const static_bookblock _resbook_16u_1={ + { + {0}, + {0,0,&_16u1__p1_0}, + {0,0,&_16u1__p2_0}, + {0,0,&_16u1__p3_0}, + {0,0,&_16u1__p4_0}, + {0,0,&_16u1__p5_0}, + {0,0,&_16u1__p6_0}, + {&_16u1__p7_0,&_16u1__p7_1}, + {&_16u1__p8_0,&_16u1__p8_1}, + {&_16u1__p9_0,&_16u1__p9_1,&_16u1__p9_2} + } +}; +static const static_bookblock _resbook_16u_2={ + { + {0}, + {0,0,&_16u2_p1_0}, + {0,0,&_16u2_p2_0}, + {0,0,&_16u2_p3_0}, + {0,0,&_16u2_p4_0}, + {&_16u2_p5_0,&_16u2_p5_1}, + {&_16u2_p6_0,&_16u2_p6_1}, + {&_16u2_p7_0,&_16u2_p7_1}, + {&_16u2_p8_0,&_16u2_p8_1}, + {&_16u2_p9_0,&_16u2_p9_1,&_16u2_p9_2} + } +}; + +static const vorbis_residue_template _res_16u_0[]={ + {1,0,32, &_residue_44_low_un, + &_huff_book__16u0__single,&_huff_book__16u0__single, + &_resbook_16u_0,&_resbook_16u_0}, +}; +static const vorbis_residue_template _res_16u_1[]={ + {1,0,32, &_residue_44_mid_un, + &_huff_book__16u1__short,&_huff_book__16u1__short, + &_resbook_16u_1,&_resbook_16u_1}, + + {1,0,32, &_residue_44_mid_un, + &_huff_book__16u1__long,&_huff_book__16u1__long, + &_resbook_16u_1,&_resbook_16u_1} +}; +static const vorbis_residue_template _res_16u_2[]={ + {1,0,32, &_residue_44_hi_un, + &_huff_book__16u2__short,&_huff_book__16u2__short, + &_resbook_16u_2,&_resbook_16u_2}, + + {1,0,32, &_residue_44_hi_un, + &_huff_book__16u2__long,&_huff_book__16u2__long, + &_resbook_16u_2,&_resbook_16u_2} +}; + + +static const vorbis_mapping_template _mapres_template_16_uncoupled[3]={ + { _map_nominal_u, _res_16u_0 }, /* 0 */ + { _map_nominal_u, _res_16u_1 }, /* 1 */ + { _map_nominal_u, _res_16u_2 }, /* 2 */ +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h new file mode 100644 index 0000000000..b01ce475c0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h @@ -0,0 +1,292 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel residue templates for 32/44.1/48kHz + last mod: $Id: residue_44.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + +#include "../../../codec.h" +#include "../backends.h" +#include "../books/coupled/res_books_stereo.h" + +/***** residue backends *********************************************/ + +static const vorbis_info_residue0 _residue_44_low={ + 0,-1, -1, 9,-1,-1, + /* 0 1 2 3 4 5 6 7 */ + {0}, + {-1}, + { 0, 1, 2, 2, 4, 8, 16, 32}, + { 0, 0, 0,999, 4, 8, 16, 32}, +}; + +static const vorbis_info_residue0 _residue_44_mid={ + 0,-1, -1, 10,-1,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { 0, 1, 1, 2, 2, 4, 8, 16, 32}, + { 0, 0,999, 0,999, 4, 8, 16, 32}, +}; + +static const vorbis_info_residue0 _residue_44_high={ + 0,-1, -1, 10,-1,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { 0, 1, 2, 4, 8, 16, 32, 71,157}, + { 0, 1, 2, 3, 4, 8, 16, 71,157}, +}; + +static const static_bookblock _resbook_44s_n1={ + { + {0},{0,0,&_44cn1_s_p1_0},{0,0,&_44cn1_s_p2_0}, + {0,0,&_44cn1_s_p3_0},{0,0,&_44cn1_s_p4_0},{0,0,&_44cn1_s_p5_0}, + {&_44cn1_s_p6_0,&_44cn1_s_p6_1},{&_44cn1_s_p7_0,&_44cn1_s_p7_1}, + {&_44cn1_s_p8_0,&_44cn1_s_p8_1,&_44cn1_s_p8_2} + } +}; +static const static_bookblock _resbook_44sm_n1={ + { + {0},{0,0,&_44cn1_sm_p1_0},{0,0,&_44cn1_sm_p2_0}, + {0,0,&_44cn1_sm_p3_0},{0,0,&_44cn1_sm_p4_0},{0,0,&_44cn1_sm_p5_0}, + {&_44cn1_sm_p6_0,&_44cn1_sm_p6_1},{&_44cn1_sm_p7_0,&_44cn1_sm_p7_1}, + {&_44cn1_sm_p8_0,&_44cn1_sm_p8_1,&_44cn1_sm_p8_2} + } +}; + +static const static_bookblock _resbook_44s_0={ + { + {0},{0,0,&_44c0_s_p1_0},{0,0,&_44c0_s_p2_0}, + {0,0,&_44c0_s_p3_0},{0,0,&_44c0_s_p4_0},{0,0,&_44c0_s_p5_0}, + {&_44c0_s_p6_0,&_44c0_s_p6_1},{&_44c0_s_p7_0,&_44c0_s_p7_1}, + {&_44c0_s_p8_0,&_44c0_s_p8_1,&_44c0_s_p8_2} + } +}; +static const static_bookblock _resbook_44sm_0={ + { + {0},{0,0,&_44c0_sm_p1_0},{0,0,&_44c0_sm_p2_0}, + {0,0,&_44c0_sm_p3_0},{0,0,&_44c0_sm_p4_0},{0,0,&_44c0_sm_p5_0}, + {&_44c0_sm_p6_0,&_44c0_sm_p6_1},{&_44c0_sm_p7_0,&_44c0_sm_p7_1}, + {&_44c0_sm_p8_0,&_44c0_sm_p8_1,&_44c0_sm_p8_2} + } +}; + +static const static_bookblock _resbook_44s_1={ + { + {0},{0,0,&_44c1_s_p1_0},{0,0,&_44c1_s_p2_0}, + {0,0,&_44c1_s_p3_0},{0,0,&_44c1_s_p4_0},{0,0,&_44c1_s_p5_0}, + {&_44c1_s_p6_0,&_44c1_s_p6_1},{&_44c1_s_p7_0,&_44c1_s_p7_1}, + {&_44c1_s_p8_0,&_44c1_s_p8_1,&_44c1_s_p8_2} + } +}; +static const static_bookblock _resbook_44sm_1={ + { + {0},{0,0,&_44c1_sm_p1_0},{0,0,&_44c1_sm_p2_0}, + {0,0,&_44c1_sm_p3_0},{0,0,&_44c1_sm_p4_0},{0,0,&_44c1_sm_p5_0}, + {&_44c1_sm_p6_0,&_44c1_sm_p6_1},{&_44c1_sm_p7_0,&_44c1_sm_p7_1}, + {&_44c1_sm_p8_0,&_44c1_sm_p8_1,&_44c1_sm_p8_2} + } +}; + +static const static_bookblock _resbook_44s_2={ + { + {0},{0,0,&_44c2_s_p1_0},{0,0,&_44c2_s_p2_0},{0,0,&_44c2_s_p3_0}, + {0,0,&_44c2_s_p4_0},{0,0,&_44c2_s_p5_0},{0,0,&_44c2_s_p6_0}, + {&_44c2_s_p7_0,&_44c2_s_p7_1},{&_44c2_s_p8_0,&_44c2_s_p8_1}, + {&_44c2_s_p9_0,&_44c2_s_p9_1,&_44c2_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_3={ + { + {0},{0,0,&_44c3_s_p1_0},{0,0,&_44c3_s_p2_0},{0,0,&_44c3_s_p3_0}, + {0,0,&_44c3_s_p4_0},{0,0,&_44c3_s_p5_0},{0,0,&_44c3_s_p6_0}, + {&_44c3_s_p7_0,&_44c3_s_p7_1},{&_44c3_s_p8_0,&_44c3_s_p8_1}, + {&_44c3_s_p9_0,&_44c3_s_p9_1,&_44c3_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_4={ + { + {0},{0,0,&_44c4_s_p1_0},{0,0,&_44c4_s_p2_0},{0,0,&_44c4_s_p3_0}, + {0,0,&_44c4_s_p4_0},{0,0,&_44c4_s_p5_0},{0,0,&_44c4_s_p6_0}, + {&_44c4_s_p7_0,&_44c4_s_p7_1},{&_44c4_s_p8_0,&_44c4_s_p8_1}, + {&_44c4_s_p9_0,&_44c4_s_p9_1,&_44c4_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_5={ + { + {0},{0,0,&_44c5_s_p1_0},{0,0,&_44c5_s_p2_0},{0,0,&_44c5_s_p3_0}, + {0,0,&_44c5_s_p4_0},{0,0,&_44c5_s_p5_0},{0,0,&_44c5_s_p6_0}, + {&_44c5_s_p7_0,&_44c5_s_p7_1},{&_44c5_s_p8_0,&_44c5_s_p8_1}, + {&_44c5_s_p9_0,&_44c5_s_p9_1,&_44c5_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_6={ + { + {0},{0,0,&_44c6_s_p1_0},{0,0,&_44c6_s_p2_0},{0,0,&_44c6_s_p3_0}, + {0,0,&_44c6_s_p4_0}, + {&_44c6_s_p5_0,&_44c6_s_p5_1}, + {&_44c6_s_p6_0,&_44c6_s_p6_1}, + {&_44c6_s_p7_0,&_44c6_s_p7_1}, + {&_44c6_s_p8_0,&_44c6_s_p8_1}, + {&_44c6_s_p9_0,&_44c6_s_p9_1,&_44c6_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_7={ + { + {0},{0,0,&_44c7_s_p1_0},{0,0,&_44c7_s_p2_0},{0,0,&_44c7_s_p3_0}, + {0,0,&_44c7_s_p4_0}, + {&_44c7_s_p5_0,&_44c7_s_p5_1}, + {&_44c7_s_p6_0,&_44c7_s_p6_1}, + {&_44c7_s_p7_0,&_44c7_s_p7_1}, + {&_44c7_s_p8_0,&_44c7_s_p8_1}, + {&_44c7_s_p9_0,&_44c7_s_p9_1,&_44c7_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_8={ + { + {0},{0,0,&_44c8_s_p1_0},{0,0,&_44c8_s_p2_0},{0,0,&_44c8_s_p3_0}, + {0,0,&_44c8_s_p4_0}, + {&_44c8_s_p5_0,&_44c8_s_p5_1}, + {&_44c8_s_p6_0,&_44c8_s_p6_1}, + {&_44c8_s_p7_0,&_44c8_s_p7_1}, + {&_44c8_s_p8_0,&_44c8_s_p8_1}, + {&_44c8_s_p9_0,&_44c8_s_p9_1,&_44c8_s_p9_2} + } +}; +static const static_bookblock _resbook_44s_9={ + { + {0},{0,0,&_44c9_s_p1_0},{0,0,&_44c9_s_p2_0},{0,0,&_44c9_s_p3_0}, + {0,0,&_44c9_s_p4_0}, + {&_44c9_s_p5_0,&_44c9_s_p5_1}, + {&_44c9_s_p6_0,&_44c9_s_p6_1}, + {&_44c9_s_p7_0,&_44c9_s_p7_1}, + {&_44c9_s_p8_0,&_44c9_s_p8_1}, + {&_44c9_s_p9_0,&_44c9_s_p9_1,&_44c9_s_p9_2} + } +}; + +static const vorbis_residue_template _res_44s_n1[]={ + {2,0,32, &_residue_44_low, + &_huff_book__44cn1_s_short,&_huff_book__44cn1_sm_short, + &_resbook_44s_n1,&_resbook_44sm_n1}, + + {2,0,32, &_residue_44_low, + &_huff_book__44cn1_s_long,&_huff_book__44cn1_sm_long, + &_resbook_44s_n1,&_resbook_44sm_n1} +}; +static const vorbis_residue_template _res_44s_0[]={ + {2,0,16, &_residue_44_low, + &_huff_book__44c0_s_short,&_huff_book__44c0_sm_short, + &_resbook_44s_0,&_resbook_44sm_0}, + + {2,0,32, &_residue_44_low, + &_huff_book__44c0_s_long,&_huff_book__44c0_sm_long, + &_resbook_44s_0,&_resbook_44sm_0} +}; +static const vorbis_residue_template _res_44s_1[]={ + {2,0,16, &_residue_44_low, + &_huff_book__44c1_s_short,&_huff_book__44c1_sm_short, + &_resbook_44s_1,&_resbook_44sm_1}, + + {2,0,32, &_residue_44_low, + &_huff_book__44c1_s_long,&_huff_book__44c1_sm_long, + &_resbook_44s_1,&_resbook_44sm_1} +}; + +static const vorbis_residue_template _res_44s_2[]={ + {2,0,16, &_residue_44_mid, + &_huff_book__44c2_s_short,&_huff_book__44c2_s_short, + &_resbook_44s_2,&_resbook_44s_2}, + + {2,0,32, &_residue_44_mid, + &_huff_book__44c2_s_long,&_huff_book__44c2_s_long, + &_resbook_44s_2,&_resbook_44s_2} +}; +static const vorbis_residue_template _res_44s_3[]={ + {2,0,16, &_residue_44_mid, + &_huff_book__44c3_s_short,&_huff_book__44c3_s_short, + &_resbook_44s_3,&_resbook_44s_3}, + + {2,0,32, &_residue_44_mid, + &_huff_book__44c3_s_long,&_huff_book__44c3_s_long, + &_resbook_44s_3,&_resbook_44s_3} +}; +static const vorbis_residue_template _res_44s_4[]={ + {2,0,16, &_residue_44_mid, + &_huff_book__44c4_s_short,&_huff_book__44c4_s_short, + &_resbook_44s_4,&_resbook_44s_4}, + + {2,0,32, &_residue_44_mid, + &_huff_book__44c4_s_long,&_huff_book__44c4_s_long, + &_resbook_44s_4,&_resbook_44s_4} +}; +static const vorbis_residue_template _res_44s_5[]={ + {2,0,16, &_residue_44_mid, + &_huff_book__44c5_s_short,&_huff_book__44c5_s_short, + &_resbook_44s_5,&_resbook_44s_5}, + + {2,0,32, &_residue_44_mid, + &_huff_book__44c5_s_long,&_huff_book__44c5_s_long, + &_resbook_44s_5,&_resbook_44s_5} +}; +static const vorbis_residue_template _res_44s_6[]={ + {2,0,16, &_residue_44_high, + &_huff_book__44c6_s_short,&_huff_book__44c6_s_short, + &_resbook_44s_6,&_resbook_44s_6}, + + {2,0,32, &_residue_44_high, + &_huff_book__44c6_s_long,&_huff_book__44c6_s_long, + &_resbook_44s_6,&_resbook_44s_6} +}; +static const vorbis_residue_template _res_44s_7[]={ + {2,0,16, &_residue_44_high, + &_huff_book__44c7_s_short,&_huff_book__44c7_s_short, + &_resbook_44s_7,&_resbook_44s_7}, + + {2,0,32, &_residue_44_high, + &_huff_book__44c7_s_long,&_huff_book__44c7_s_long, + &_resbook_44s_7,&_resbook_44s_7} +}; +static const vorbis_residue_template _res_44s_8[]={ + {2,0,16, &_residue_44_high, + &_huff_book__44c8_s_short,&_huff_book__44c8_s_short, + &_resbook_44s_8,&_resbook_44s_8}, + + {2,0,32, &_residue_44_high, + &_huff_book__44c8_s_long,&_huff_book__44c8_s_long, + &_resbook_44s_8,&_resbook_44s_8} +}; +static const vorbis_residue_template _res_44s_9[]={ + {2,0,16, &_residue_44_high, + &_huff_book__44c9_s_short,&_huff_book__44c9_s_short, + &_resbook_44s_9,&_resbook_44s_9}, + + {2,0,32, &_residue_44_high, + &_huff_book__44c9_s_long,&_huff_book__44c9_s_long, + &_resbook_44s_9,&_resbook_44s_9} +}; + +static const vorbis_mapping_template _mapres_template_44_stereo[]={ + { _map_nominal, _res_44s_n1 }, /* -1 */ + { _map_nominal, _res_44s_0 }, /* 0 */ + { _map_nominal, _res_44s_1 }, /* 1 */ + { _map_nominal, _res_44s_2 }, /* 2 */ + { _map_nominal, _res_44s_3 }, /* 3 */ + { _map_nominal, _res_44s_4 }, /* 4 */ + { _map_nominal, _res_44s_5 }, /* 5 */ + { _map_nominal, _res_44s_6 }, /* 6 */ + { _map_nominal, _res_44s_7 }, /* 7 */ + { _map_nominal, _res_44s_8 }, /* 8 */ + { _map_nominal, _res_44s_9 }, /* 9 */ +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h new file mode 100644 index 0000000000..081fe8efda --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h @@ -0,0 +1,451 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel residue templates for 32/44.1/48kHz uncoupled + last mod: $Id$ + + ********************************************************************/ + +#include "../../../codec.h" +#include "../backends.h" + +#include "../books/coupled/res_books_51.h" + +/***** residue backends *********************************************/ + +static const vorbis_info_residue0 _residue_44p_lo={ + 0,-1, -1, 7,-1,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { 0, 1, 2, 7, 17, 31}, + { 0, 0, 99, 7, 17, 31}, +}; + +static const vorbis_info_residue0 _residue_44p={ + 0,-1, -1, 8,-1,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { 0, 1, 1, 2, 7, 17, 31}, + { 0, 0, 99, 99, 7, 17, 31}, +}; + +static const vorbis_info_residue0 _residue_44p_hi={ + 0,-1, -1, 8,-1,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { 0, 1, 2, 4, 7, 17, 31}, + { 0, 1, 2, 4, 7, 17, 31}, +}; + +static const vorbis_info_residue0 _residue_44p_lfe={ + 0,-1, -1, 2,-1,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { 32}, + { -1} +}; + +static const static_bookblock _resbook_44p_n1={ + { + {0}, + {0,&_44pn1_p1_0}, + + {&_44pn1_p2_0,&_44pn1_p2_1,0}, + {&_44pn1_p3_0,&_44pn1_p3_1,0}, + {&_44pn1_p4_0,&_44pn1_p4_1,0}, + + {&_44pn1_p5_0,&_44pn1_p5_1,&_44pn1_p4_1}, + {&_44pn1_p6_0,&_44pn1_p6_1,&_44pn1_p6_2}, + } +}; + +static const static_bookblock _resbook_44p_0={ + { + {0}, + {0,&_44p0_p1_0}, + + {&_44p0_p2_0,&_44p0_p2_1,0}, + {&_44p0_p3_0,&_44p0_p3_1,0}, + {&_44p0_p4_0,&_44p0_p4_1,0}, + + {&_44p0_p5_0,&_44p0_p5_1,&_44p0_p4_1}, + {&_44p0_p6_0,&_44p0_p6_1,&_44p0_p6_2}, + } +}; + +static const static_bookblock _resbook_44p_1={ + { + {0}, + {0,&_44p1_p1_0}, + + {&_44p1_p2_0,&_44p1_p2_1,0}, + {&_44p1_p3_0,&_44p1_p3_1,0}, + {&_44p1_p4_0,&_44p1_p4_1,0}, + + {&_44p1_p5_0,&_44p1_p5_1,&_44p1_p4_1}, + {&_44p1_p6_0,&_44p1_p6_1,&_44p1_p6_2}, + } +}; + +static const static_bookblock _resbook_44p_2={ + { + {0}, + {0,0,&_44p2_p1_0}, + {0,&_44p2_p2_0,0}, + + {&_44p2_p3_0,&_44p2_p3_1,0}, + {&_44p2_p4_0,&_44p2_p4_1,0}, + {&_44p2_p5_0,&_44p2_p5_1,0}, + + {&_44p2_p6_0,&_44p2_p6_1,&_44p2_p5_1}, + {&_44p2_p7_0,&_44p2_p7_1,&_44p2_p7_2,&_44p2_p7_3} + } +}; +static const static_bookblock _resbook_44p_3={ + { + {0}, + {0,0,&_44p3_p1_0}, + {0,&_44p3_p2_0,0}, + + {&_44p3_p3_0,&_44p3_p3_1,0}, + {&_44p3_p4_0,&_44p3_p4_1,0}, + {&_44p3_p5_0,&_44p3_p5_1,0}, + + {&_44p3_p6_0,&_44p3_p6_1,&_44p3_p5_1}, + {&_44p3_p7_0,&_44p3_p7_1,&_44p3_p7_2,&_44p3_p7_3} + } +}; +static const static_bookblock _resbook_44p_4={ + { + {0}, + {0,0,&_44p4_p1_0}, + {0,&_44p4_p2_0,0}, + + {&_44p4_p3_0,&_44p4_p3_1,0}, + {&_44p4_p4_0,&_44p4_p4_1,0}, + {&_44p4_p5_0,&_44p4_p5_1,0}, + + {&_44p4_p6_0,&_44p4_p6_1,&_44p4_p5_1}, + {&_44p4_p7_0,&_44p4_p7_1,&_44p4_p7_2,&_44p4_p7_3} + } +}; +static const static_bookblock _resbook_44p_5={ + { + {0}, + {0,0,&_44p5_p1_0}, + {0,&_44p5_p2_0,0}, + + {&_44p5_p3_0,&_44p5_p3_1,0}, + {&_44p5_p4_0,&_44p5_p4_1,0}, + {&_44p5_p5_0,&_44p5_p5_1,0}, + + {&_44p5_p6_0,&_44p5_p6_1,&_44p5_p5_1}, + {&_44p5_p7_0,&_44p5_p7_1,&_44p5_p7_2,&_44p5_p7_3} + } +}; +static const static_bookblock _resbook_44p_6={ + { + {0}, + {0,0,&_44p6_p1_0}, + {0,&_44p6_p2_0,0}, + + {&_44p6_p3_0,&_44p6_p3_1,0}, + {&_44p6_p4_0,&_44p6_p4_1,0}, + {&_44p6_p5_0,&_44p6_p5_1,0}, + + {&_44p6_p6_0,&_44p6_p6_1,&_44p6_p5_1}, + {&_44p6_p7_0,&_44p6_p7_1,&_44p6_p7_2,&_44p6_p7_3} + } +}; +static const static_bookblock _resbook_44p_7={ + { + {0}, + {0,0,&_44p7_p1_0}, + {0,&_44p7_p2_0,0}, + + {&_44p7_p3_0,&_44p7_p3_1,0}, + {&_44p7_p4_0,&_44p7_p4_1,0}, + {&_44p7_p5_0,&_44p7_p5_1,0}, + + {&_44p7_p6_0,&_44p7_p6_1,&_44p7_p5_1}, + {&_44p7_p7_0,&_44p7_p7_1,&_44p7_p7_2,&_44p7_p7_3} + } +}; +static const static_bookblock _resbook_44p_8={ + { + {0}, + {0,0,&_44p8_p1_0}, + {0,&_44p8_p2_0,0}, + + {&_44p8_p3_0,&_44p8_p3_1,0}, + {&_44p8_p4_0,&_44p8_p4_1,0}, + {&_44p8_p5_0,&_44p8_p5_1,0}, + + {&_44p8_p6_0,&_44p8_p6_1,&_44p8_p5_1}, + {&_44p8_p7_0,&_44p8_p7_1,&_44p8_p7_2,&_44p8_p7_3} + } +}; +static const static_bookblock _resbook_44p_9={ + { + {0}, + {0,0,&_44p9_p1_0}, + {0,&_44p9_p2_0,0}, + + {&_44p9_p3_0,&_44p9_p3_1,0}, + {&_44p9_p4_0,&_44p9_p4_1,0}, + {&_44p9_p5_0,&_44p9_p5_1,0}, + + {&_44p9_p6_0,&_44p9_p6_1,&_44p9_p5_1}, + {&_44p9_p7_0,&_44p9_p7_1,&_44p9_p7_2,&_44p9_p7_3} + } +}; + +static const static_bookblock _resbook_44p_ln1={ + { + {&_44pn1_l0_0,&_44pn1_l0_1,0}, + {&_44pn1_l1_0,&_44pn1_p6_1,&_44pn1_p6_2}, + } +}; +static const static_bookblock _resbook_44p_l0={ + { + {&_44p0_l0_0,&_44p0_l0_1,0}, + {&_44p0_l1_0,&_44p0_p6_1,&_44p0_p6_2}, + } +}; +static const static_bookblock _resbook_44p_l1={ + { + {&_44p1_l0_0,&_44p1_l0_1,0}, + {&_44p1_l1_0,&_44p1_p6_1,&_44p1_p6_2}, + } +}; +static const static_bookblock _resbook_44p_l2={ + { + {&_44p2_l0_0,&_44p2_l0_1,0}, + {&_44p2_l1_0,&_44p2_p7_2,&_44p2_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l3={ + { + {&_44p3_l0_0,&_44p3_l0_1,0}, + {&_44p3_l1_0,&_44p3_p7_2,&_44p3_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l4={ + { + {&_44p4_l0_0,&_44p4_l0_1,0}, + {&_44p4_l1_0,&_44p4_p7_2,&_44p4_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l5={ + { + {&_44p5_l0_0,&_44p5_l0_1,0}, + {&_44p5_l1_0,&_44p5_p7_2,&_44p5_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l6={ + { + {&_44p6_l0_0,&_44p6_l0_1,0}, + {&_44p6_l1_0,&_44p6_p7_2,&_44p6_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l7={ + { + {&_44p7_l0_0,&_44p7_l0_1,0}, + {&_44p7_l1_0,&_44p7_p7_2,&_44p7_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l8={ + { + {&_44p8_l0_0,&_44p8_l0_1,0}, + {&_44p8_l1_0,&_44p8_p7_2,&_44p8_p7_3}, + } +}; +static const static_bookblock _resbook_44p_l9={ + { + {&_44p9_l0_0,&_44p9_l0_1,0}, + {&_44p9_l1_0,&_44p9_p7_2,&_44p9_p7_3}, + } +}; + + +static const vorbis_info_mapping0 _map_nominal_51[2]={ + {2, {0,0,0,0,0,1}, {0,2}, {0,2}, 4,{0,3,0,0},{2,4,1,3}}, + {2, {0,0,0,0,0,1}, {1,2}, {1,2}, 4,{0,3,0,0},{2,4,1,3}} +}; +static const vorbis_info_mapping0 _map_nominal_51u[2]={ + {2, {0,0,0,0,0,1}, {0,2}, {0,2}, 0,{0},{0}}, + {2, {0,0,0,0,0,1}, {1,2}, {1,2}, 0,{0},{0}} +}; + +static const vorbis_residue_template _res_44p51_n1[]={ + {2,0,30, &_residue_44p_lo, + &_huff_book__44pn1_short,&_huff_book__44pn1_short, + &_resbook_44p_n1,&_resbook_44p_n1}, + + {2,0,30, &_residue_44p_lo, + &_huff_book__44pn1_long,&_huff_book__44pn1_long, + &_resbook_44p_n1,&_resbook_44p_n1}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44pn1_lfe,&_huff_book__44pn1_lfe, + &_resbook_44p_ln1,&_resbook_44p_ln1} +}; +static const vorbis_residue_template _res_44p51_0[]={ + {2,0,15, &_residue_44p_lo, + &_huff_book__44p0_short,&_huff_book__44p0_short, + &_resbook_44p_0,&_resbook_44p_0}, + + {2,0,30, &_residue_44p_lo, + &_huff_book__44p0_long,&_huff_book__44p0_long, + &_resbook_44p_0,&_resbook_44p_0}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p0_lfe,&_huff_book__44p0_lfe, + &_resbook_44p_l0,&_resbook_44p_l0} +}; +static const vorbis_residue_template _res_44p51_1[]={ + {2,0,15, &_residue_44p_lo, + &_huff_book__44p1_short,&_huff_book__44p1_short, + &_resbook_44p_1,&_resbook_44p_1}, + + {2,0,30, &_residue_44p_lo, + &_huff_book__44p1_long,&_huff_book__44p1_long, + &_resbook_44p_1,&_resbook_44p_1}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p1_lfe,&_huff_book__44p1_lfe, + &_resbook_44p_l1,&_resbook_44p_l1} +}; +static const vorbis_residue_template _res_44p51_2[]={ + {2,0,15, &_residue_44p, + &_huff_book__44p2_short,&_huff_book__44p2_short, + &_resbook_44p_2,&_resbook_44p_2}, + + {2,0,30, &_residue_44p, + &_huff_book__44p2_long,&_huff_book__44p2_long, + &_resbook_44p_2,&_resbook_44p_2}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p2_lfe,&_huff_book__44p2_lfe, + &_resbook_44p_l2,&_resbook_44p_l2} +}; +static const vorbis_residue_template _res_44p51_3[]={ + {2,0,15, &_residue_44p, + &_huff_book__44p3_short,&_huff_book__44p3_short, + &_resbook_44p_3,&_resbook_44p_3}, + + {2,0,30, &_residue_44p, + &_huff_book__44p3_long,&_huff_book__44p3_long, + &_resbook_44p_3,&_resbook_44p_3}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p3_lfe,&_huff_book__44p3_lfe, + &_resbook_44p_l3,&_resbook_44p_l3} +}; +static const vorbis_residue_template _res_44p51_4[]={ + {2,0,15, &_residue_44p, + &_huff_book__44p4_short,&_huff_book__44p4_short, + &_resbook_44p_4,&_resbook_44p_4}, + + {2,0,30, &_residue_44p, + &_huff_book__44p4_long,&_huff_book__44p4_long, + &_resbook_44p_4,&_resbook_44p_4}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p4_lfe,&_huff_book__44p4_lfe, + &_resbook_44p_l4,&_resbook_44p_l4} +}; +static const vorbis_residue_template _res_44p51_5[]={ + {2,0,15, &_residue_44p_hi, + &_huff_book__44p5_short,&_huff_book__44p5_short, + &_resbook_44p_5,&_resbook_44p_5}, + + {2,0,30, &_residue_44p_hi, + &_huff_book__44p5_long,&_huff_book__44p5_long, + &_resbook_44p_5,&_resbook_44p_5}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p5_lfe,&_huff_book__44p5_lfe, + &_resbook_44p_l5,&_resbook_44p_l5} +}; +static const vorbis_residue_template _res_44p51_6[]={ + {2,0,15, &_residue_44p_hi, + &_huff_book__44p6_short,&_huff_book__44p6_short, + &_resbook_44p_6,&_resbook_44p_6}, + + {2,0,30, &_residue_44p_hi, + &_huff_book__44p6_long,&_huff_book__44p6_long, + &_resbook_44p_6,&_resbook_44p_6}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, + &_resbook_44p_l6,&_resbook_44p_l6} +}; + + +static const vorbis_residue_template _res_44p51_7[]={ + {2,0,15, &_residue_44p_hi, + &_huff_book__44p7_short,&_huff_book__44p7_short, + &_resbook_44p_7,&_resbook_44p_7}, + + {2,0,30, &_residue_44p_hi, + &_huff_book__44p7_long,&_huff_book__44p7_long, + &_resbook_44p_7,&_resbook_44p_7}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, + &_resbook_44p_l6,&_resbook_44p_l6} +}; +static const vorbis_residue_template _res_44p51_8[]={ + {2,0,15, &_residue_44p_hi, + &_huff_book__44p8_short,&_huff_book__44p8_short, + &_resbook_44p_8,&_resbook_44p_8}, + + {2,0,30, &_residue_44p_hi, + &_huff_book__44p8_long,&_huff_book__44p8_long, + &_resbook_44p_8,&_resbook_44p_8}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, + &_resbook_44p_l6,&_resbook_44p_l6} +}; +static const vorbis_residue_template _res_44p51_9[]={ + {2,0,15, &_residue_44p_hi, + &_huff_book__44p9_short,&_huff_book__44p9_short, + &_resbook_44p_9,&_resbook_44p_9}, + + {2,0,30, &_residue_44p_hi, + &_huff_book__44p9_long,&_huff_book__44p9_long, + &_resbook_44p_9,&_resbook_44p_9}, + + {1,2,6, &_residue_44p_lfe, + &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, + &_resbook_44p_l6,&_resbook_44p_l6} +}; + +static const vorbis_mapping_template _mapres_template_44_51[]={ + { _map_nominal_51, _res_44p51_n1 }, /* -1 */ + { _map_nominal_51, _res_44p51_0 }, /* 0 */ + { _map_nominal_51, _res_44p51_1 }, /* 1 */ + { _map_nominal_51, _res_44p51_2 }, /* 2 */ + { _map_nominal_51, _res_44p51_3 }, /* 3 */ + { _map_nominal_51, _res_44p51_4 }, /* 4 */ + { _map_nominal_51u, _res_44p51_5 }, /* 5 */ + { _map_nominal_51u, _res_44p51_6 }, /* 6 */ + { _map_nominal_51u, _res_44p51_7 }, /* 7 */ + { _map_nominal_51u, _res_44p51_8 }, /* 8 */ + { _map_nominal_51u, _res_44p51_9 }, /* 9 */ +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h new file mode 100644 index 0000000000..5b31322a47 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h @@ -0,0 +1,318 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel residue templates for 32/44.1/48kHz uncoupled + last mod: $Id: residue_44u.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + +#include "../../../codec.h" +#include "../backends.h" +#include "../books/uncoupled/res_books_uncoupled.h" + +/***** residue backends *********************************************/ + + +static const vorbis_info_residue0 _residue_44_low_un={ + 0,-1, -1, 8,-1,-1, + {0}, + {-1}, + { 0, 1, 1, 2, 2, 4, 28}, + { -1, 25, -1, 45, -1, -1, -1} +}; + +static const vorbis_info_residue0 _residue_44_mid_un={ + 0,-1, -1, 10,-1,-1, + /* 0 1 2 3 4 5 6 7 8 9 */ + {0}, + {-1}, + { 0, 1, 1, 2, 2, 4, 4, 16, 60}, + { -1, 30, -1, 50, -1, 80, -1, -1, -1} +}; + +static const vorbis_info_residue0 _residue_44_hi_un={ + 0,-1, -1, 10,-1,-1, + /* 0 1 2 3 4 5 6 7 8 9 */ + {0}, + {-1}, + { 0, 1, 2, 4, 8, 16, 32, 71,157}, + { -1, -1, -1, -1, -1, -1, -1, -1, -1} +}; + +/* mapping conventions: + only one submap (this would change for efficient 5.1 support for example)*/ +/* Four psychoacoustic profiles are used, one for each blocktype */ +static const vorbis_info_mapping0 _map_nominal_u[2]={ + {1, {0,0,0,0,0,0}, {0}, {0}, 0,{0},{0}}, + {1, {0,0,0,0,0,0}, {1}, {1}, 0,{0},{0}} +}; + +static const static_bookblock _resbook_44u_n1={ + { + {0}, + {0,0,&_44un1__p1_0}, + {0,0,&_44un1__p2_0}, + {0,0,&_44un1__p3_0}, + {0,0,&_44un1__p4_0}, + {0,0,&_44un1__p5_0}, + {&_44un1__p6_0,&_44un1__p6_1}, + {&_44un1__p7_0,&_44un1__p7_1,&_44un1__p7_2} + } +}; +static const static_bookblock _resbook_44u_0={ + { + {0}, + {0,0,&_44u0__p1_0}, + {0,0,&_44u0__p2_0}, + {0,0,&_44u0__p3_0}, + {0,0,&_44u0__p4_0}, + {0,0,&_44u0__p5_0}, + {&_44u0__p6_0,&_44u0__p6_1}, + {&_44u0__p7_0,&_44u0__p7_1,&_44u0__p7_2} + } +}; +static const static_bookblock _resbook_44u_1={ + { + {0}, + {0,0,&_44u1__p1_0}, + {0,0,&_44u1__p2_0}, + {0,0,&_44u1__p3_0}, + {0,0,&_44u1__p4_0}, + {0,0,&_44u1__p5_0}, + {&_44u1__p6_0,&_44u1__p6_1}, + {&_44u1__p7_0,&_44u1__p7_1,&_44u1__p7_2} + } +}; +static const static_bookblock _resbook_44u_2={ + { + {0}, + {0,0,&_44u2__p1_0}, + {0,0,&_44u2__p2_0}, + {0,0,&_44u2__p3_0}, + {0,0,&_44u2__p4_0}, + {0,0,&_44u2__p5_0}, + {&_44u2__p6_0,&_44u2__p6_1}, + {&_44u2__p7_0,&_44u2__p7_1,&_44u2__p7_2} + } +}; +static const static_bookblock _resbook_44u_3={ + { + {0}, + {0,0,&_44u3__p1_0}, + {0,0,&_44u3__p2_0}, + {0,0,&_44u3__p3_0}, + {0,0,&_44u3__p4_0}, + {0,0,&_44u3__p5_0}, + {&_44u3__p6_0,&_44u3__p6_1}, + {&_44u3__p7_0,&_44u3__p7_1,&_44u3__p7_2} + } +}; +static const static_bookblock _resbook_44u_4={ + { + {0}, + {0,0,&_44u4__p1_0}, + {0,0,&_44u4__p2_0}, + {0,0,&_44u4__p3_0}, + {0,0,&_44u4__p4_0}, + {0,0,&_44u4__p5_0}, + {&_44u4__p6_0,&_44u4__p6_1}, + {&_44u4__p7_0,&_44u4__p7_1,&_44u4__p7_2} + } +}; +static const static_bookblock _resbook_44u_5={ + { + {0}, + {0,0,&_44u5__p1_0}, + {0,0,&_44u5__p2_0}, + {0,0,&_44u5__p3_0}, + {0,0,&_44u5__p4_0}, + {0,0,&_44u5__p5_0}, + {0,0,&_44u5__p6_0}, + {&_44u5__p7_0,&_44u5__p7_1}, + {&_44u5__p8_0,&_44u5__p8_1}, + {&_44u5__p9_0,&_44u5__p9_1,&_44u5__p9_2} + } +}; +static const static_bookblock _resbook_44u_6={ + { + {0}, + {0,0,&_44u6__p1_0}, + {0,0,&_44u6__p2_0}, + {0,0,&_44u6__p3_0}, + {0,0,&_44u6__p4_0}, + {0,0,&_44u6__p5_0}, + {0,0,&_44u6__p6_0}, + {&_44u6__p7_0,&_44u6__p7_1}, + {&_44u6__p8_0,&_44u6__p8_1}, + {&_44u6__p9_0,&_44u6__p9_1,&_44u6__p9_2} + } +}; +static const static_bookblock _resbook_44u_7={ + { + {0}, + {0,0,&_44u7__p1_0}, + {0,0,&_44u7__p2_0}, + {0,0,&_44u7__p3_0}, + {0,0,&_44u7__p4_0}, + {0,0,&_44u7__p5_0}, + {0,0,&_44u7__p6_0}, + {&_44u7__p7_0,&_44u7__p7_1}, + {&_44u7__p8_0,&_44u7__p8_1}, + {&_44u7__p9_0,&_44u7__p9_1,&_44u7__p9_2} + } +}; +static const static_bookblock _resbook_44u_8={ + { + {0}, + {0,0,&_44u8_p1_0}, + {0,0,&_44u8_p2_0}, + {0,0,&_44u8_p3_0}, + {0,0,&_44u8_p4_0}, + {&_44u8_p5_0,&_44u8_p5_1}, + {&_44u8_p6_0,&_44u8_p6_1}, + {&_44u8_p7_0,&_44u8_p7_1}, + {&_44u8_p8_0,&_44u8_p8_1}, + {&_44u8_p9_0,&_44u8_p9_1,&_44u8_p9_2} + } +}; +static const static_bookblock _resbook_44u_9={ + { + {0}, + {0,0,&_44u9_p1_0}, + {0,0,&_44u9_p2_0}, + {0,0,&_44u9_p3_0}, + {0,0,&_44u9_p4_0}, + {&_44u9_p5_0,&_44u9_p5_1}, + {&_44u9_p6_0,&_44u9_p6_1}, + {&_44u9_p7_0,&_44u9_p7_1}, + {&_44u9_p8_0,&_44u9_p8_1}, + {&_44u9_p9_0,&_44u9_p9_1,&_44u9_p9_2} + } +}; + +static const vorbis_residue_template _res_44u_n1[]={ + {1,0,32, &_residue_44_low_un, + &_huff_book__44un1__short,&_huff_book__44un1__short, + &_resbook_44u_n1,&_resbook_44u_n1}, + + {1,0,32, &_residue_44_low_un, + &_huff_book__44un1__long,&_huff_book__44un1__long, + &_resbook_44u_n1,&_resbook_44u_n1} +}; +static const vorbis_residue_template _res_44u_0[]={ + {1,0,16, &_residue_44_low_un, + &_huff_book__44u0__short,&_huff_book__44u0__short, + &_resbook_44u_0,&_resbook_44u_0}, + + {1,0,32, &_residue_44_low_un, + &_huff_book__44u0__long,&_huff_book__44u0__long, + &_resbook_44u_0,&_resbook_44u_0} +}; +static const vorbis_residue_template _res_44u_1[]={ + {1,0,16, &_residue_44_low_un, + &_huff_book__44u1__short,&_huff_book__44u1__short, + &_resbook_44u_1,&_resbook_44u_1}, + + {1,0,32, &_residue_44_low_un, + &_huff_book__44u1__long,&_huff_book__44u1__long, + &_resbook_44u_1,&_resbook_44u_1} +}; +static const vorbis_residue_template _res_44u_2[]={ + {1,0,16, &_residue_44_low_un, + &_huff_book__44u2__short,&_huff_book__44u2__short, + &_resbook_44u_2,&_resbook_44u_2}, + + {1,0,32, &_residue_44_low_un, + &_huff_book__44u2__long,&_huff_book__44u2__long, + &_resbook_44u_2,&_resbook_44u_2} +}; +static const vorbis_residue_template _res_44u_3[]={ + {1,0,16, &_residue_44_low_un, + &_huff_book__44u3__short,&_huff_book__44u3__short, + &_resbook_44u_3,&_resbook_44u_3}, + + {1,0,32, &_residue_44_low_un, + &_huff_book__44u3__long,&_huff_book__44u3__long, + &_resbook_44u_3,&_resbook_44u_3} +}; +static const vorbis_residue_template _res_44u_4[]={ + {1,0,16, &_residue_44_low_un, + &_huff_book__44u4__short,&_huff_book__44u4__short, + &_resbook_44u_4,&_resbook_44u_4}, + + {1,0,32, &_residue_44_low_un, + &_huff_book__44u4__long,&_huff_book__44u4__long, + &_resbook_44u_4,&_resbook_44u_4} +}; + +static const vorbis_residue_template _res_44u_5[]={ + {1,0,16, &_residue_44_mid_un, + &_huff_book__44u5__short,&_huff_book__44u5__short, + &_resbook_44u_5,&_resbook_44u_5}, + + {1,0,32, &_residue_44_mid_un, + &_huff_book__44u5__long,&_huff_book__44u5__long, + &_resbook_44u_5,&_resbook_44u_5} +}; + +static const vorbis_residue_template _res_44u_6[]={ + {1,0,16, &_residue_44_mid_un, + &_huff_book__44u6__short,&_huff_book__44u6__short, + &_resbook_44u_6,&_resbook_44u_6}, + + {1,0,32, &_residue_44_mid_un, + &_huff_book__44u6__long,&_huff_book__44u6__long, + &_resbook_44u_6,&_resbook_44u_6} +}; + +static const vorbis_residue_template _res_44u_7[]={ + {1,0,16, &_residue_44_mid_un, + &_huff_book__44u7__short,&_huff_book__44u7__short, + &_resbook_44u_7,&_resbook_44u_7}, + + {1,0,32, &_residue_44_mid_un, + &_huff_book__44u7__long,&_huff_book__44u7__long, + &_resbook_44u_7,&_resbook_44u_7} +}; + +static const vorbis_residue_template _res_44u_8[]={ + {1,0,16, &_residue_44_hi_un, + &_huff_book__44u8__short,&_huff_book__44u8__short, + &_resbook_44u_8,&_resbook_44u_8}, + + {1,0,32, &_residue_44_hi_un, + &_huff_book__44u8__long,&_huff_book__44u8__long, + &_resbook_44u_8,&_resbook_44u_8} +}; +static const vorbis_residue_template _res_44u_9[]={ + {1,0,16, &_residue_44_hi_un, + &_huff_book__44u9__short,&_huff_book__44u9__short, + &_resbook_44u_9,&_resbook_44u_9}, + + {1,0,32, &_residue_44_hi_un, + &_huff_book__44u9__long,&_huff_book__44u9__long, + &_resbook_44u_9,&_resbook_44u_9} +}; + +static const vorbis_mapping_template _mapres_template_44_uncoupled[]={ + { _map_nominal_u, _res_44u_n1 }, /* -1 */ + { _map_nominal_u, _res_44u_0 }, /* 0 */ + { _map_nominal_u, _res_44u_1 }, /* 1 */ + { _map_nominal_u, _res_44u_2 }, /* 2 */ + { _map_nominal_u, _res_44u_3 }, /* 3 */ + { _map_nominal_u, _res_44u_4 }, /* 4 */ + { _map_nominal_u, _res_44u_5 }, /* 5 */ + { _map_nominal_u, _res_44u_6 }, /* 6 */ + { _map_nominal_u, _res_44u_7 }, /* 7 */ + { _map_nominal_u, _res_44u_8 }, /* 8 */ + { _map_nominal_u, _res_44u_9 }, /* 9 */ +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h new file mode 100644 index 0000000000..2943694dfb --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h @@ -0,0 +1,109 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel residue templates 8/11kHz + last mod: $Id: residue_8.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + +#include "../../../codec.h" +#include "../backends.h" + +/***** residue backends *********************************************/ + +static const static_bookblock _resbook_8s_0={ + { + {0}, + {0,0,&_8c0_s_p1_0}, + {0}, + {0,0,&_8c0_s_p3_0}, + {0,0,&_8c0_s_p4_0}, + {0,0,&_8c0_s_p5_0}, + {0,0,&_8c0_s_p6_0}, + {&_8c0_s_p7_0,&_8c0_s_p7_1}, + {&_8c0_s_p8_0,&_8c0_s_p8_1}, + {&_8c0_s_p9_0,&_8c0_s_p9_1,&_8c0_s_p9_2} + } +}; +static const static_bookblock _resbook_8s_1={ + { + {0}, + {0,0,&_8c1_s_p1_0}, + {0}, + {0,0,&_8c1_s_p3_0}, + {0,0,&_8c1_s_p4_0}, + {0,0,&_8c1_s_p5_0}, + {0,0,&_8c1_s_p6_0}, + {&_8c1_s_p7_0,&_8c1_s_p7_1}, + {&_8c1_s_p8_0,&_8c1_s_p8_1}, + {&_8c1_s_p9_0,&_8c1_s_p9_1,&_8c1_s_p9_2} + } +}; + +static const vorbis_residue_template _res_8s_0[]={ + {2,0,32, &_residue_44_mid, + &_huff_book__8c0_s_single,&_huff_book__8c0_s_single, + &_resbook_8s_0,&_resbook_8s_0}, +}; +static const vorbis_residue_template _res_8s_1[]={ + {2,0,32, &_residue_44_mid, + &_huff_book__8c1_s_single,&_huff_book__8c1_s_single, + &_resbook_8s_1,&_resbook_8s_1}, +}; + +static const vorbis_mapping_template _mapres_template_8_stereo[2]={ + { _map_nominal, _res_8s_0 }, /* 0 */ + { _map_nominal, _res_8s_1 }, /* 1 */ +}; + +static const static_bookblock _resbook_8u_0={ + { + {0}, + {0,0,&_8u0__p1_0}, + {0,0,&_8u0__p2_0}, + {0,0,&_8u0__p3_0}, + {0,0,&_8u0__p4_0}, + {0,0,&_8u0__p5_0}, + {&_8u0__p6_0,&_8u0__p6_1}, + {&_8u0__p7_0,&_8u0__p7_1,&_8u0__p7_2} + } +}; +static const static_bookblock _resbook_8u_1={ + { + {0}, + {0,0,&_8u1__p1_0}, + {0,0,&_8u1__p2_0}, + {0,0,&_8u1__p3_0}, + {0,0,&_8u1__p4_0}, + {0,0,&_8u1__p5_0}, + {0,0,&_8u1__p6_0}, + {&_8u1__p7_0,&_8u1__p7_1}, + {&_8u1__p8_0,&_8u1__p8_1}, + {&_8u1__p9_0,&_8u1__p9_1,&_8u1__p9_2} + } +}; + +static const vorbis_residue_template _res_8u_0[]={ + {1,0,32, &_residue_44_low_un, + &_huff_book__8u0__single,&_huff_book__8u0__single, + &_resbook_8u_0,&_resbook_8u_0}, +}; +static const vorbis_residue_template _res_8u_1[]={ + {1,0,32, &_residue_44_mid_un, + &_huff_book__8u1__single,&_huff_book__8u1__single, + &_resbook_8u_1,&_resbook_8u_1}, +}; + +static const vorbis_mapping_template _mapres_template_8_uncoupled[2]={ + { _map_nominal_u, _res_8u_0 }, /* 0 */ + { _map_nominal_u, _res_8u_1 }, /* 1 */ +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h new file mode 100644 index 0000000000..6637249bb4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h @@ -0,0 +1,143 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 11kHz settings + last mod: $Id: setup_11.h 16894 2010-02-12 20:32:12Z xiphmont $ + + ********************************************************************/ + +#include "psych_11.h" + +static const int blocksize_11[2]={ + 512,512 +}; + +static const int _floor_mapping_11a[]={ + 6,6 +}; +static const int *_floor_mapping_11[]={ + _floor_mapping_11a +}; + +static const double rate_mapping_11[3]={ + 8000.,13000.,44000., +}; + +static const double rate_mapping_11_uncoupled[3]={ + 12000.,20000.,50000., +}; + +static const double quality_mapping_11[3]={ + -.1,.0,1. +}; + +static const ve_setup_data_template ve_setup_11_stereo={ + 2, + rate_mapping_11, + quality_mapping_11, + 2, + 9000, + 15000, + + blocksize_11, + blocksize_11, + + _psy_tone_masteratt_11, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_11, + NULL, + _vp_tonemask_adj_11, + + _psy_noiseguards_8, + _psy_noisebias_11, + _psy_noisebias_11, + NULL, + NULL, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_8_mapping, + NULL, + + {_noise_start_8,_noise_start_8}, + {_noise_part_8,_noise_part_8}, + _noise_thresh_11, + + _psy_ath_floater_8, + _psy_ath_abs_8, + + _psy_lowpass_11, + + _psy_global_44, + _global_mapping_8, + _psy_stereo_modes_8, + + _floor_books, + _floor, + 1, + _floor_mapping_11, + + _mapres_template_8_stereo +}; + +static const ve_setup_data_template ve_setup_11_uncoupled={ + 2, + rate_mapping_11_uncoupled, + quality_mapping_11, + -1, + 9000, + 15000, + + blocksize_11, + blocksize_11, + + _psy_tone_masteratt_11, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_11, + NULL, + _vp_tonemask_adj_11, + + _psy_noiseguards_8, + _psy_noisebias_11, + _psy_noisebias_11, + NULL, + NULL, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_8_mapping, + NULL, + + {_noise_start_8,_noise_start_8}, + {_noise_part_8,_noise_part_8}, + _noise_thresh_11, + + _psy_ath_floater_8, + _psy_ath_abs_8, + + _psy_lowpass_11, + + _psy_global_44, + _global_mapping_8, + _psy_stereo_modes_8, + + _floor_books, + _floor, + 1, + _floor_mapping_11, + + _mapres_template_8_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h new file mode 100644 index 0000000000..6fec1c2613 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h @@ -0,0 +1,153 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 16kHz settings + last mod: $Id: setup_16.h 16894 2010-02-12 20:32:12Z xiphmont $ + + ********************************************************************/ + +#include "psych_16.h" +#include "residue_16.h" + +static const int blocksize_16_short[3]={ + 1024,512,512 +}; +static const int blocksize_16_long[3]={ + 1024,1024,1024 +}; + +static const int _floor_mapping_16a[]={ + 9,3,3 +}; +static const int _floor_mapping_16b[]={ + 9,9,9 +}; +static const int *_floor_mapping_16[]={ + _floor_mapping_16a, + _floor_mapping_16b +}; + +static const double rate_mapping_16[4]={ + 12000.,20000.,44000.,86000. +}; + +static const double rate_mapping_16_uncoupled[4]={ + 16000.,28000.,64000.,100000. +}; + +static const double _global_mapping_16[4]={ 1., 2., 3., 4. }; + +static const double quality_mapping_16[4]={ -.1,.05,.5,1. }; + +static const double _psy_compand_16_mapping[4]={ 0., .8, 1., 1.}; + +static const ve_setup_data_template ve_setup_16_stereo={ + 3, + rate_mapping_16, + quality_mapping_16, + 2, + 15000, + 19000, + + blocksize_16_short, + blocksize_16_long, + + _psy_tone_masteratt_16, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + + _psy_noiseguards_16, + _psy_noisebias_16_impulse, + _psy_noisebias_16_short, + _psy_noisebias_16_short, + _psy_noisebias_16, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_16_mapping, + _psy_compand_16_mapping, + + {_noise_start_16,_noise_start_16}, + { _noise_part_16, _noise_part_16}, + _noise_thresh_16, + + _psy_ath_floater_16, + _psy_ath_abs_16, + + _psy_lowpass_16, + + _psy_global_44, + _global_mapping_16, + _psy_stereo_modes_16, + + _floor_books, + _floor, + 2, + _floor_mapping_16, + + _mapres_template_16_stereo +}; + +static const ve_setup_data_template ve_setup_16_uncoupled={ + 3, + rate_mapping_16_uncoupled, + quality_mapping_16, + -1, + 15000, + 19000, + + blocksize_16_short, + blocksize_16_long, + + _psy_tone_masteratt_16, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + + _psy_noiseguards_16, + _psy_noisebias_16_impulse, + _psy_noisebias_16_short, + _psy_noisebias_16_short, + _psy_noisebias_16, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_16_mapping, + _psy_compand_16_mapping, + + {_noise_start_16,_noise_start_16}, + { _noise_part_16, _noise_part_16}, + _noise_thresh_16, + + _psy_ath_floater_16, + _psy_ath_abs_16, + + _psy_lowpass_16, + + _psy_global_44, + _global_mapping_16, + _psy_stereo_modes_16, + + _floor_books, + _floor, + 2, + _floor_mapping_16, + + _mapres_template_16_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h new file mode 100644 index 0000000000..c164a9b3f1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h @@ -0,0 +1,128 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 22kHz settings + last mod: $Id: setup_22.h 17026 2010-03-25 05:00:27Z xiphmont $ + + ********************************************************************/ + +static const double rate_mapping_22[4]={ + 15000.,20000.,44000.,86000. +}; + +static const double rate_mapping_22_uncoupled[4]={ + 16000.,28000.,50000.,90000. +}; + +static const double _psy_lowpass_22[4]={9.5,11.,30.,99.}; + +static const ve_setup_data_template ve_setup_22_stereo={ + 3, + rate_mapping_22, + quality_mapping_16, + 2, + 19000, + 26000, + + blocksize_16_short, + blocksize_16_long, + + _psy_tone_masteratt_16, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + + _psy_noiseguards_16, + _psy_noisebias_16_impulse, + _psy_noisebias_16_short, + _psy_noisebias_16_short, + _psy_noisebias_16, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_16_mapping, + _psy_compand_16_mapping, + + {_noise_start_16,_noise_start_16}, + { _noise_part_16, _noise_part_16}, + _noise_thresh_16, + + _psy_ath_floater_16, + _psy_ath_abs_16, + + _psy_lowpass_22, + + _psy_global_44, + _global_mapping_16, + _psy_stereo_modes_16, + + _floor_books, + _floor, + 2, + _floor_mapping_16, + + _mapres_template_16_stereo +}; + +static const ve_setup_data_template ve_setup_22_uncoupled={ + 3, + rate_mapping_22_uncoupled, + quality_mapping_16, + -1, + 19000, + 26000, + + blocksize_16_short, + blocksize_16_long, + + _psy_tone_masteratt_16, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + _vp_tonemask_adj_16, + + _psy_noiseguards_16, + _psy_noisebias_16_impulse, + _psy_noisebias_16_short, + _psy_noisebias_16_short, + _psy_noisebias_16, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_16_mapping, + _psy_compand_16_mapping, + + {_noise_start_16,_noise_start_16}, + { _noise_part_16, _noise_part_16}, + _noise_thresh_16, + + _psy_ath_floater_16, + _psy_ath_abs_16, + + _psy_lowpass_22, + + _psy_global_44, + _global_mapping_16, + _psy_stereo_modes_16, + + _floor_books, + _floor, + 2, + _floor_mapping_16, + + _mapres_template_16_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h new file mode 100644 index 0000000000..301f020f31 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h @@ -0,0 +1,132 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel settings for 32kHz + last mod: $Id: setup_32.h 16894 2010-02-12 20:32:12Z xiphmont $ + + ********************************************************************/ + +static const double rate_mapping_32[12]={ + 18000.,28000.,35000.,45000.,56000.,60000., + 75000.,90000.,100000.,115000.,150000.,190000., +}; + +static const double rate_mapping_32_un[12]={ + 30000.,42000.,52000.,64000.,72000.,78000., + 86000.,92000.,110000.,120000.,140000.,190000., +}; + +static const double _psy_lowpass_32[12]={ + 12.3,13.,13.,14.,15.,99.,99.,99.,99.,99.,99.,99. +}; + +static const ve_setup_data_template ve_setup_32_stereo={ + 11, + rate_mapping_32, + quality_mapping_44, + 2, + 26000, + 40000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_32, + + _psy_global_44, + _global_mapping_44, + _psy_stereo_modes_44, + + _floor_books, + _floor, + 2, + _floor_mapping_44, + + _mapres_template_44_stereo +}; + +static const ve_setup_data_template ve_setup_32_uncoupled={ + 11, + rate_mapping_32_un, + quality_mapping_44, + -1, + 26000, + 40000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_32, + + _psy_global_44, + _global_mapping_44, + NULL, + + _floor_books, + _floor, + 2, + _floor_mapping_44, + + _mapres_template_44_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h new file mode 100644 index 0000000000..45250e0dd3 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h @@ -0,0 +1,117 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel settings for 44.1/48kHz + last mod: $Id: setup_44.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + +#include "floor_all.h" +#include "residue_44.h" +#include "psych_44.h" + +static const double rate_mapping_44_stereo[12]={ + 22500.,32000.,40000.,48000.,56000.,64000., + 80000.,96000.,112000.,128000.,160000.,250001. +}; + +static const double quality_mapping_44[12]={ + -.1,.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0 +}; + +static const int blocksize_short_44[11]={ + 512,256,256,256,256,256,256,256,256,256,256 +}; +static const int blocksize_long_44[11]={ + 4096,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048 +}; + +static const double _psy_compand_short_mapping[12]={ + 0.5, 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2. +}; +static const double _psy_compand_long_mapping[12]={ + 3.5, 4., 4., 4.3, 4.6, 5., 5., 5., 5., 5., 5., 5. +}; + +static const double _global_mapping_44[12]={ + /* 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.5, 4., 4. */ + 0., 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.7, 4., 4. +}; + +static const int _floor_mapping_44a[11]={ + 1,0,0,2,2,4,5,5,5,5,5 +}; + +static const int _floor_mapping_44b[11]={ + 8,7,7,7,7,7,7,7,7,7,7 +}; + +static const int _floor_mapping_44c[11]={ + 10,10,10,10,10,10,10,10,10,10,10 +}; + +static const int *_floor_mapping_44[]={ + _floor_mapping_44a, + _floor_mapping_44b, + _floor_mapping_44c, +}; + +static const ve_setup_data_template ve_setup_44_stereo={ + 11, + rate_mapping_44_stereo, + quality_mapping_44, + 2, + 40000, + 50000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_44, + + _psy_global_44, + _global_mapping_44, + _psy_stereo_modes_44, + + _floor_books, + _floor, + 2, + _floor_mapping_44, + + _mapres_template_44_stereo +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h new file mode 100644 index 0000000000..a26cee84b4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h @@ -0,0 +1,74 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel settings for 44.1/48kHz 5.1 surround modes + last mod: $Id$ + + ********************************************************************/ + +#include "residue_44p51.h" + +static const double rate_mapping_44p51[12]={ + 14000.,20000.,28000.,38000.,46000.,54000., + 75000.,96000.,120000.,140000.,180000.,240001. +}; + +static const ve_setup_data_template ve_setup_44_51={ + 11, + rate_mapping_44p51, + quality_mapping_44, + 6, + 40000, + 70000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_44, + + _psy_global_44, + _global_mapping_44, + _psy_stereo_modes_44, + + _floor_books, + _floor, + 3, + _floor_mapping_44, + + _mapres_template_44_51 +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h new file mode 100644 index 0000000000..7dfdd550cf --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h @@ -0,0 +1,74 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel settings for 44.1/48kHz uncoupled modes + last mod: $Id: setup_44u.h 16962 2010-03-11 07:30:34Z xiphmont $ + + ********************************************************************/ + +#include "residue_44u.h" + +static const double rate_mapping_44_un[12]={ + 32000.,48000.,60000.,70000.,80000.,86000., + 96000.,110000.,120000.,140000.,160000.,240001. +}; + +static const ve_setup_data_template ve_setup_44_uncoupled={ + 11, + rate_mapping_44_un, + quality_mapping_44, + -1, + 40000, + 50000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_44, + + _psy_global_44, + _global_mapping_44, + _psy_stereo_modes_44, + + _floor_books, + _floor, + 2, + _floor_mapping_44, + + _mapres_template_44_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h new file mode 100644 index 0000000000..4e71205e34 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h @@ -0,0 +1,149 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: 8kHz settings + last mod: $Id: setup_8.h 16894 2010-02-12 20:32:12Z xiphmont $ + + ********************************************************************/ + +#include "psych_8.h" +#include "residue_8.h" + +static const int blocksize_8[2]={ + 512,512 +}; + +static const int _floor_mapping_8a[]={ + 6,6 +}; + +static const int *_floor_mapping_8[]={ + _floor_mapping_8a +}; + +static const double rate_mapping_8[3]={ + 6000.,9000.,32000., +}; + +static const double rate_mapping_8_uncoupled[3]={ + 8000.,14000.,42000., +}; + +static const double quality_mapping_8[3]={ + -.1,.0,1. +}; + +static const double _psy_compand_8_mapping[3]={ 0., 1., 1.}; + +static const double _global_mapping_8[3]={ 1., 2., 3. }; + +static const ve_setup_data_template ve_setup_8_stereo={ + 2, + rate_mapping_8, + quality_mapping_8, + 2, + 8000, + 9000, + + blocksize_8, + blocksize_8, + + _psy_tone_masteratt_8, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_8, + NULL, + _vp_tonemask_adj_8, + + _psy_noiseguards_8, + _psy_noisebias_8, + _psy_noisebias_8, + NULL, + NULL, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_8_mapping, + NULL, + + {_noise_start_8,_noise_start_8}, + {_noise_part_8,_noise_part_8}, + _noise_thresh_5only, + + _psy_ath_floater_8, + _psy_ath_abs_8, + + _psy_lowpass_8, + + _psy_global_44, + _global_mapping_8, + _psy_stereo_modes_8, + + _floor_books, + _floor, + 1, + _floor_mapping_8, + + _mapres_template_8_stereo +}; + +static const ve_setup_data_template ve_setup_8_uncoupled={ + 2, + rate_mapping_8_uncoupled, + quality_mapping_8, + -1, + 8000, + 9000, + + blocksize_8, + blocksize_8, + + _psy_tone_masteratt_8, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_8, + NULL, + _vp_tonemask_adj_8, + + _psy_noiseguards_8, + _psy_noisebias_8, + _psy_noisebias_8, + NULL, + NULL, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_8_mapping, + NULL, + + {_noise_start_8,_noise_start_8}, + {_noise_part_8,_noise_part_8}, + _noise_thresh_5only, + + _psy_ath_floater_8, + _psy_ath_abs_8, + + _psy_lowpass_8, + + _psy_global_44, + _global_mapping_8, + _psy_stereo_modes_8, + + _floor_books, + _floor, + 1, + _floor_mapping_8, + + _mapres_template_8_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h new file mode 100644 index 0000000000..be5e2c35f1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h @@ -0,0 +1,225 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: catch-all toplevel settings for q modes only + last mod: $Id: setup_X.h 16894 2010-02-12 20:32:12Z xiphmont $ + + ********************************************************************/ + +static const double rate_mapping_X[12]={ + -1.,-1.,-1.,-1.,-1.,-1., + -1.,-1.,-1.,-1.,-1.,-1. +}; + +static const ve_setup_data_template ve_setup_X_stereo={ + 11, + rate_mapping_X, + quality_mapping_44, + 2, + 50000, + 200000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_44, + + _psy_global_44, + _global_mapping_44, + _psy_stereo_modes_44, + + _floor_books, + _floor, + 2, + _floor_mapping_44, + + _mapres_template_44_stereo +}; + +static const ve_setup_data_template ve_setup_X_uncoupled={ + 11, + rate_mapping_X, + quality_mapping_44, + -1, + 50000, + 200000, + + blocksize_short_44, + blocksize_long_44, + + _psy_tone_masteratt_44, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_otherblock, + _vp_tonemask_adj_longblock, + _vp_tonemask_adj_otherblock, + + _psy_noiseguards_44, + _psy_noisebias_impulse, + _psy_noisebias_padding, + _psy_noisebias_trans, + _psy_noisebias_long, + _psy_noise_suppress, + + _psy_compand_44, + _psy_compand_short_mapping, + _psy_compand_long_mapping, + + {_noise_start_short_44,_noise_start_long_44}, + {_noise_part_short_44,_noise_part_long_44}, + _noise_thresh_44, + + _psy_ath_floater, + _psy_ath_abs, + + _psy_lowpass_44, + + _psy_global_44, + _global_mapping_44, + NULL, + + _floor_books, + _floor, + 2, + _floor_mapping_44, + + _mapres_template_44_uncoupled +}; + +static const ve_setup_data_template ve_setup_XX_stereo={ + 2, + rate_mapping_X, + quality_mapping_8, + 2, + 0, + 8000, + + blocksize_8, + blocksize_8, + + _psy_tone_masteratt_8, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_8, + NULL, + _vp_tonemask_adj_8, + + _psy_noiseguards_8, + _psy_noisebias_8, + _psy_noisebias_8, + NULL, + NULL, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_8_mapping, + NULL, + + {_noise_start_8,_noise_start_8}, + {_noise_part_8,_noise_part_8}, + _noise_thresh_5only, + + _psy_ath_floater_8, + _psy_ath_abs_8, + + _psy_lowpass_8, + + _psy_global_44, + _global_mapping_8, + _psy_stereo_modes_8, + + _floor_books, + _floor, + 1, + _floor_mapping_8, + + _mapres_template_8_stereo +}; + +static const ve_setup_data_template ve_setup_XX_uncoupled={ + 2, + rate_mapping_X, + quality_mapping_8, + -1, + 0, + 8000, + + blocksize_8, + blocksize_8, + + _psy_tone_masteratt_8, + _psy_tone_0dB, + _psy_tone_suppress, + + _vp_tonemask_adj_8, + NULL, + _vp_tonemask_adj_8, + + _psy_noiseguards_8, + _psy_noisebias_8, + _psy_noisebias_8, + NULL, + NULL, + _psy_noise_suppress, + + _psy_compand_8, + _psy_compand_8_mapping, + NULL, + + {_noise_start_8,_noise_start_8}, + {_noise_part_8,_noise_part_8}, + _noise_thresh_5only, + + _psy_ath_floater_8, + _psy_ath_abs_8, + + _psy_lowpass_8, + + _psy_global_44, + _global_mapping_8, + _psy_stereo_modes_8, + + _floor_books, + _floor, + 1, + _floor_mapping_8, + + _mapres_template_8_uncoupled +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h new file mode 100644 index 0000000000..621747276f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h @@ -0,0 +1,186 @@ +#ifndef _OS_H +#define _OS_H +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + last mod: $Id: os.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "../../os_types.h" + +#include "misc.h" + +#ifndef _V_IFDEFJAIL_H_ +# define _V_IFDEFJAIL_H_ + +# ifdef __GNUC__ +# define STIN static __inline__ +# elif _WIN32 +# define STIN static __inline +# else +# define STIN static +# endif + +#ifdef DJGPP +# define rint(x) (floor((x)+0.5f)) +#endif + +#ifndef M_PI +# define M_PI (3.1415926536f) +#endif + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +# include +# define rint(x) (floor((x)+0.5f)) +# define NO_FLOAT_MATH_LIB +# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) +#endif + +#if defined(__SYMBIAN32__) && defined(__WINS__) +void *_alloca(size_t size); +# define alloca _alloca +#endif + +#ifndef FAST_HYPOT +# define FAST_HYPOT hypot +#endif + +#endif + +#ifdef HAVE_ALLOCA_H +# include +#endif + +#ifdef USE_MEMORY_H +# include +#endif + +#ifndef min +# define min(x,y) ((x)>(y)?(y):(x)) +#endif + +#ifndef max +# define max(x,y) ((x)<(y)?(y):(x)) +#endif + + +/* Special i386 GCC implementation */ +#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__) +# define VORBIS_FPU_CONTROL +/* both GCC and MSVC are kinda stupid about rounding/casting to int. + Because of encapsulation constraints (GCC can't see inside the asm + block and so we end up doing stupid things like a store/load that + is collectively a noop), we do it this way */ + +/* we must set up the fpu before this works!! */ + +typedef ogg_int16_t vorbis_fpu_control; + +static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ + ogg_int16_t ret; + ogg_int16_t temp = 0; + __asm__ __volatile__("fnstcw %0\n\t" + "movw %0,%%dx\n\t" + "andw $62463,%%dx\n\t" + "movw %%dx,%1\n\t" + "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx"); + *fpu=ret; +} + +static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ + __asm__ __volatile__("fldcw %0":: "m"(fpu)); +} + +/* assumes the FPU is in round mode! */ +static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise, + we get extra fst/fld to + truncate precision */ + int i; + __asm__("fistl %0": "=m"(i) : "t"(f)); + return(i); +} +#endif /* Special i386 GCC implementation */ + + +/* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the + * 64 bit compiler */ +#if defined(_MSC_VER) && !defined(_WIN64) && !defined(_WIN32_WCE) +# define VORBIS_FPU_CONTROL + +typedef ogg_int16_t vorbis_fpu_control; + +static __inline int vorbis_ftoi(double f){ + int i; + __asm{ + fld f + fistp i + } + return i; +} + +static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ +} + +static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ +} + +#endif /* Special MSVC 32 bit implementation */ + + +/* Optimized code path for x86_64 builds. Uses SSE2 intrinsics. This can be + done safely because all x86_64 CPUs supports SSE2. */ +#if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__GNUC__) && defined (__x86_64__)) +# define VORBIS_FPU_CONTROL + +typedef ogg_int16_t vorbis_fpu_control; + +#include +static __inline int vorbis_ftoi(double f){ + return _mm_cvtsd_si32(_mm_load_sd(&f)); +} + +static __inline void vorbis_fpu_setround(vorbis_fpu_control*){ +} + +static __inline void vorbis_fpu_restore(vorbis_fpu_control){ +} + +#endif /* Special MSVC x64 implementation */ + + +/* If no special implementation was found for the current compiler / platform, + use the default implementation here: */ +#ifndef VORBIS_FPU_CONTROL + +typedef int vorbis_fpu_control; + +static int vorbis_ftoi(double f){ + /* Note: MSVC and GCC (at least on some systems) round towards zero, thus, + the floor() call is required to ensure correct roudning of + negative numbers */ + return (int)floor(f+.5); +} + +/* We don't have special code for this compiler/arch, so do it the slow way */ +# define vorbis_fpu_setround(vorbis_fpu_control) {} +# define vorbis_fpu_restore(vorbis_fpu_control) {} + +#endif /* default implementation */ + +#endif /* _OS_H */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c new file mode 100644 index 0000000000..a60f88fabb --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c @@ -0,0 +1,1205 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: psychoacoustics not including preecho + last mod: $Id: psy.c 17569 2010-10-26 17:09:47Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include +#include "../../codec.h" +#include "codec_internal.h" + +#include "masking.h" +#include "psy.h" +#include "os.h" +#include "lpc.h" +#include "smallft.h" +#include "scales.h" +#include "misc.h" + +#define NEGINF -9999.f +static const double stereo_threshholds[]={0.0, .5, 1.0, 1.5, 2.5, 4.5, 8.5, 16.5, 9e10}; +static const double stereo_threshholds_limited[]={0.0, .5, 1.0, 1.5, 2.0, 2.5, 4.5, 8.5, 9e10}; + +vorbis_look_psy_global *_vp_global_look(vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy_global *gi=&ci->psy_g_param; + vorbis_look_psy_global *look=(vorbis_look_psy_global*)_ogg_calloc(1,sizeof(*look)); + + look->channels=vi->channels; + + look->ampmax=-9999.; + look->gi=gi; + return(look); +} + +void _vp_global_free(vorbis_look_psy_global *look){ + if(look){ + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static inline void _vi_gpsy_free(vorbis_info_psy_global *i){ + if(i){ + memset(i,0,sizeof(*i)); + _ogg_free(i); + } +} + +void _vi_psy_free(vorbis_info_psy *i){ + if(i){ + memset(i,0,sizeof(*i)); + _ogg_free(i); + } +} + +static void min_curve(float *c, + float *c2){ + int i; + for(i=0;ic[i])c[i]=c2[i]; +} + +static void attenuate_curve(float *c,float att){ + int i; + for(i=0;iATH[j+k+ath_offset])min=ATH[j+k+ath_offset]; + }else{ + if(min>ATH[MAX_ATH-1])min=ATH[MAX_ATH-1]; + } + ath[j]=min; + } + + /* copy curves into working space, replicate the 50dB curve to 30 + and 40, replicate the 100dB curve to 110 */ + for(j=0;j<6;j++) + memcpy(workc[i][j+2],tonemasks[i][j],EHMER_MAX*sizeof(*tonemasks[i][j])); + memcpy(workc[i][0],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0])); + memcpy(workc[i][1],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0])); + + /* apply centered curve boost/decay */ + for(j=0;j0)adj=0.; + if(adj>0. && center_boost<0)adj=0.; + workc[i][j][k]+=adj; + } + } + + /* normalize curves so the driving amplitude is 0dB */ + /* make temp curves with the ATH overlayed */ + for(j=0;j an eighth of an octave and that the eighth + octave values may also be composited. */ + + /* which octave curves will we be compositing? */ + bin=floor(fromOC(i*.5)/binHz); + lo_curve= ceil(toOC(bin*binHz+1)*2); + hi_curve= floor(toOC((bin+1)*binHz)*2); + if(lo_curve>i)lo_curve=i; + if(lo_curve<0)lo_curve=0; + if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1; + + for(m=0;mn)lo_bin=n; + if(lo_binn)hi_bin=n; + + for(;lworkc[k][m][j]) + brute_buffer[l]=workc[k][m][j]; + } + + for(;lworkc[k][m][EHMER_MAX-1]) + brute_buffer[l]=workc[k][m][EHMER_MAX-1]; + + } + + /* be equally paranoid about being valid up to next half ocatve */ + if(i+1n)lo_bin=n; + if(lo_binn)hi_bin=n; + + for(;lworkc[k][m][j]) + brute_buffer[l]=workc[k][m][j]; + } + + for(;lworkc[k][m][EHMER_MAX-1]) + brute_buffer[l]=workc[k][m][EHMER_MAX-1]; + + } + + + for(j=0;j=n){ + ret[i][m][j+2]=-999.; + }else{ + ret[i][m][j+2]=brute_buffer[bin]; + } + } + } + + /* add fenceposts */ + for(j=0;j-200.f)break; + ret[i][m][0]=j; + + for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--) + if(ret[i][m][j+2]>-200.f) + break; + ret[i][m][1]=j; + + } + } + + return(ret); +} + +void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, + vorbis_info_psy_global *gi,int n,long rate){ + long i,j,lo=-99,hi=1; + long maxoc; + memset(p,0,sizeof(*p)); + + p->eighth_octave_lines=gi->eighth_octave_lines; + p->shiftoc=rint(log(gi->eighth_octave_lines*8.f)/log(2.f))-1; + + p->firstoc=toOC(.25f*rate*.5/n)*(1<<(p->shiftoc+1))-gi->eighth_octave_lines; + maxoc=toOC((n+.25f)*rate*.5/n)*(1<<(p->shiftoc+1))+.5f; + p->total_octave_lines=maxoc-p->firstoc+1; + p->ath=(float*)_ogg_malloc(n*sizeof(*p->ath)); + + p->octave=(long*)_ogg_malloc(n*sizeof(*p->octave)); + p->bark=(long*)_ogg_malloc(n*sizeof(*p->bark)); + p->vi=vi; + p->n=n; + p->rate=rate; + + /* AoTuV HF weighting */ + p->m_val = 1.; + if(rate < 26000) p->m_val = 0; + else if(rate < 38000) p->m_val = .94; /* 32kHz */ + else if(rate > 46000) p->m_val = 1.275; /* 48kHz */ + + /* set up the lookups for a given blocksize and sample rate */ + + for(i=0,j=0;iath[j]=base+100.; + base+=delta; + } + } + } + + for(;jath[j]=p->ath[j-1]; + } + + for(i=0;inoisewindowlominnoisewindowlo);lo++); + + for(;hi<=n && (hinoisewindowhimin || + toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++); + + p->bark[i]=((lo-1)<<16)+(hi-1); + + } + + for(i=0;ioctave[i]=toOC((i+.25f)*.5*rate/n)*(1<<(p->shiftoc+1))+.5f; + + p->tonecurves=setup_tone_curves(vi->toneatt,rate*.5/n,n, + vi->tone_centerboost,vi->tone_decay); + + /* set up rolling noise median */ + p->noiseoffset=(float**)_ogg_malloc(P_NOISECURVES*sizeof(*p->noiseoffset)); + for(i=0;inoiseoffset[i]=(float*)_ogg_malloc(n*sizeof(**p->noiseoffset)); + + for(i=0;i=P_BANDS-1)halfoc=P_BANDS-1; + inthalfoc=(int)halfoc; + del=halfoc-inthalfoc; + + for(j=0;jnoiseoffset[j][i]= + p->vi->noiseoff[j][inthalfoc]*(1.-del) + + p->vi->noiseoff[j][inthalfoc+1]*del; + + } +#if 0 + { + static int ls=0; + _analysis_output_always("noiseoff0",ls,p->noiseoffset[0],n,1,0,0); + _analysis_output_always("noiseoff1",ls,p->noiseoffset[1],n,1,0,0); + _analysis_output_always("noiseoff2",ls++,p->noiseoffset[2],n,1,0,0); + } +#endif +} + +void _vp_psy_clear(vorbis_look_psy *p){ + int i,j; + if(p){ + if(p->ath)_ogg_free(p->ath); + if(p->octave)_ogg_free(p->octave); + if(p->bark)_ogg_free(p->bark); + if(p->tonecurves){ + for(i=0;itonecurves[i][j]); + } + _ogg_free(p->tonecurves[i]); + } + _ogg_free(p->tonecurves); + } + if(p->noiseoffset){ + for(i=0;inoiseoffset[i]); + } + _ogg_free(p->noiseoffset); + } + memset(p,0,sizeof(*p)); + } +} + +/* octave/(8*eighth_octave_lines) x scale and dB y scale */ +static void seed_curve(float *seed, + const float **curves, + float amp, + int oc, int n, + int linesper,float dBoffset){ + int i,post1; + int seedptr; + const float *posts,*curve; + + int choice=(int)((amp+dBoffset-P_LEVEL_0)*.1f); + choice=max(choice,0); + choice=min(choice,P_LEVELS-1); + posts=curves[choice]; + curve=posts+2; + post1=(int)posts[1]; + seedptr=oc+(posts[0]-EHMER_OFFSET)*linesper-(linesper>>1); + + for(i=posts[0];i0){ + float lin=amp+curve[i]; + if(seed[seedptr]=n)break; + } +} + +static void seed_loop(vorbis_look_psy *p, + const float ***curves, + const float *f, + const float *flr, + float *seed, + float specmax){ + vorbis_info_psy *vi=p->vi; + long n=p->n,i; + float dBoffset=vi->max_curve_dB-specmax; + + /* prime the working vector with peak values */ + + for(i=0;ioctave[i]; + while(i+1octave[i+1]==oc){ + i++; + if(f[i]>max)max=f[i]; + } + + if(max+6.f>flr[i]){ + oc=oc>>p->shiftoc; + + if(oc>=P_BANDS)oc=P_BANDS-1; + if(oc<0)oc=0; + + seed_curve(seed, + curves[oc], + max, + p->octave[i]-p->firstoc, + p->total_octave_lines, + p->eighth_octave_lines, + dBoffset); + } + } +} + +static void seed_chase(float *seeds, int linesper, long n){ + long *posstack=(long*)alloca(n*sizeof(*posstack)); + float *ampstack=(float*)alloca(n*sizeof(*ampstack)); + long stack=0; + long pos=0; + long i; + + for(i=0;i1 && ampstack[stack-1]<=ampstack[stack-2] && + iampstack[i]){ + endpos=posstack[i+1]; + }else{ + endpos=posstack[i]+linesper+1; /* +1 is important, else bin 0 is + discarded in short frames */ + } + if(endpos>n)endpos=n; + for(;pos +static void max_seeds(vorbis_look_psy *p, + float *seed, + float *flr){ + long n=p->total_octave_lines; + int linesper=p->eighth_octave_lines; + long linpos=0; + long pos; + + seed_chase(seed,linesper,n); /* for masking */ + + pos=p->octave[0]-p->firstoc-(linesper>>1); + + while(linpos+1n){ + float minV=seed[pos]; + long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc; + if(minV>p->vi->tone_abs_limit)minV=p->vi->tone_abs_limit; + while(pos+1<=end){ + pos++; + if((seed[pos]>NEGINF && seed[pos]firstoc; + for(;linposn && p->octave[linpos]<=end;linpos++) + if(flr[linpos]total_octave_lines-1]; + for(;linposn;linpos++) + if(flr[linpos]> 16; + if( lo>=0 ) break; + hi = b[i] & 0xffff; + + tN = N[hi] + N[-lo]; + tX = X[hi] - X[-lo]; + tXX = XX[hi] + XX[-lo]; + tY = Y[hi] + Y[-lo]; + tXY = XY[hi] - XY[-lo]; + + A = tY * tXX - tX * tXY; + B = tN * tXY - tX * tY; + D = tN * tXX - tX * tX; + R = (A + x * B) / D; + if (R < 0.f) + R = 0.f; + + noise[i] = R - offset; + } + + for ( ;; i++, x += 1.f) { + + lo = b[i] >> 16; + hi = b[i] & 0xffff; + if(hi>=n)break; + + tN = N[hi] - N[lo]; + tX = X[hi] - X[lo]; + tXX = XX[hi] - XX[lo]; + tY = Y[hi] - Y[lo]; + tXY = XY[hi] - XY[lo]; + + A = tY * tXX - tX * tXY; + B = tN * tXY - tX * tY; + D = tN * tXX - tX * tX; + R = (A + x * B) / D; + if (R < 0.f) R = 0.f; + + noise[i] = R - offset; + } + for ( ; i < n; i++, x += 1.f) { + + R = (A + x * B) / D; + if (R < 0.f) R = 0.f; + + noise[i] = R - offset; + } + + if (fixed <= 0) return; + + for (i = 0, x = 0.f;; i++, x += 1.f) { + hi = i + fixed / 2; + lo = hi - fixed; + if(lo>=0)break; + + tN = N[hi] + N[-lo]; + tX = X[hi] - X[-lo]; + tXX = XX[hi] + XX[-lo]; + tY = Y[hi] + Y[-lo]; + tXY = XY[hi] - XY[-lo]; + + + A = tY * tXX - tX * tXY; + B = tN * tXY - tX * tY; + D = tN * tXX - tX * tX; + R = (A + x * B) / D; + + if (R - offset < noise[i]) noise[i] = R - offset; + } + for ( ;; i++, x += 1.f) { + + hi = i + fixed / 2; + lo = hi - fixed; + if(hi>=n)break; + + tN = N[hi] - N[lo]; + tX = X[hi] - X[lo]; + tXX = XX[hi] - XX[lo]; + tY = Y[hi] - Y[lo]; + tXY = XY[hi] - XY[lo]; + + A = tY * tXX - tX * tXY; + B = tN * tXY - tX * tY; + D = tN * tXX - tX * tX; + R = (A + x * B) / D; + + if (R - offset < noise[i]) noise[i] = R - offset; + } + for ( ; i < n; i++, x += 1.f) { + R = (A + x * B) / D; + if (R - offset < noise[i]) noise[i] = R - offset; + } +} + +void _vp_noisemask(vorbis_look_psy *p, + float *logmdct, + float *logmask){ + + int i,n=p->n; + float *work=(float*) alloca(n*sizeof(*work)); + + bark_noise_hybridmp(n,p->bark,logmdct,logmask, + 140.,-1); + + for(i=0;ibark,work,logmask,0., + p->vi->noisewindowfixed); + + for(i=0;i=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1; + if(dB<0)dB=0; + logmask[i]= work[i]+p->vi->noisecompand[dB]; + } + +} + +void _vp_tonemask(vorbis_look_psy *p, + float *logfft, + float *logmask, + float global_specmax, + float local_specmax){ + + int i,n=p->n; + + float *seed=(float*) alloca(sizeof(*seed)*p->total_octave_lines); + float att=local_specmax+p->vi->ath_adjatt; + for(i=0;itotal_octave_lines;i++)seed[i]=NEGINF; + + /* set the ATH (floating below localmax, not global max by a + specified att) */ + if(attvi->ath_maxatt)att=p->vi->ath_maxatt; + + for(i=0;iath[i]+att; + + /* tone masking */ + seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax); + max_seeds(p,seed,logmask); + +} + +void _vp_offset_and_mix(vorbis_look_psy *p, + float *noise, + float *tone, + int offset_select, + float *logmask, + float *mdct, + float *logmdct){ + int i,n=p->n; + float de, coeffi, cx;/* AoTuV */ + float toneatt=p->vi->tone_masteratt[offset_select]; + + cx = p->m_val; + + for(i=0;inoiseoffset[offset_select][i]; + if(val>p->vi->noisemaxsupp)val=p->vi->noisemaxsupp; + logmask[i]=max(val,tone[i]+toneatt); + + + /* AoTuV */ + /** @ M1 ** + The following codes improve a noise problem. + A fundamental idea uses the value of masking and carries out + the relative compensation of the MDCT. + However, this code is not perfect and all noise problems cannot be solved. + by Aoyumi @ 2004/04/18 + */ + + if(offset_select == 1) { + coeffi = -17.2; /* coeffi is a -17.2dB threshold */ + val = val - logmdct[i]; /* val == mdct line value relative to floor in dB */ + + if(val > coeffi){ + /* mdct value is > -17.2 dB below floor */ + + de = 1.0-((val-coeffi)*0.005*cx); + /* pro-rated attenuation: + -0.00 dB boost if mdct value is -17.2dB (relative to floor) + -0.77 dB boost if mdct value is 0dB (relative to floor) + -1.64 dB boost if mdct value is +17.2dB (relative to floor) + etc... */ + + if(de < 0) de = 0.0001; + }else + /* mdct value is <= -17.2 dB below floor */ + + de = 1.0-((val-coeffi)*0.0003*cx); + /* pro-rated attenuation: + +0.00 dB atten if mdct value is -17.2dB (relative to floor) + +0.45 dB atten if mdct value is -34.4dB (relative to floor) + etc... */ + + mdct[i] *= de; + + } + } +} + +float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){ + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy_global *gi=&ci->psy_g_param; + + int n=ci->blocksizes[vd->W]/2; + float secs=(float)n/vi->rate; + + amp+=secs*gi->ampmax_att_per_sec; + if(amp<-9999)amp=-9999; + return(amp); +} + +#if 0 +static float FLOOR1_fromdB_LOOKUP[256]={ + 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, + 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, + 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, + 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, + 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, + 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, + 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, + 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, + 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, + 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, + 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, + 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, + 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, + 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, + 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, + 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, + 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, + 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, + 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, + 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, + 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, + 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, + 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, + 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, + 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, + 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, + 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, + 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, + 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, + 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, + 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, + 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, + 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, + 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, + 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, + 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, + 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, + 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, + 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, + 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, + 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, + 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, + 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, + 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, + 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, + 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, + 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, + 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, + 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, + 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, + 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, + 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, + 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, + 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, + 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, + 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, + 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, + 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, + 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, + 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, + 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, + 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, + 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, + 0.82788260F, 0.88168307F, 0.9389798F, 1.F, +}; +#endif + +/* this is for per-channel noise normalization */ +static int apsort(const void *a, const void *b){ + float f1=**(float**)a; + float f2=**(float**)b; + return (f1f2); +} + +static void flag_lossless(int limit, float prepoint, float postpoint, float *mdct, + float *floor, int *flag, int i, int jn){ + int j; + for(j=0;j=limit-i ? postpoint : prepoint; + float r = fabs(mdct[j])/floor[j]; + if(rvi; + float **sort = (float**)alloca(n*sizeof(*sort)); + int j,count=0; + int start = (vi->normal_p ? vi->normal_start-i : n); + if(start>n)start=n; + + /* force classic behavior where only energy in the current band is considered */ + acc=0.f; + + /* still responsible for populating *out where noise norm not in + effect. There's no need to [re]populate *q in these areas */ + for(j=0;j pointlimit */ + if(ve<.25f && (!flags || j>=limit-i)){ + acc += ve; + sort[count++]=q+j; /* q is fabs(r) for unflagged element */ + }else{ + /* For now: no acc adjustment for nonzero quantization. populate *out and q as this value is final. */ + if(r[j]<0) + out[j] = -rint(sqrt(ve)); + else + out[j] = rint(sqrt(ve)); + q[j] = out[j]*out[j]*f[j]; + } + }/* else{ + again, no energy adjustment for error in nonzero quant-- for now + }*/ + } + + if(count){ + /* noise norm to do */ + qsort(sort,count,sizeof(*sort),apsort); + for(j=0;j=vi->normal_thresh){ + out[k]=unitnorm(r[k]); + acc-=1.f; + q[k]=f[k]; + }else{ + out[k]=0; + q[k]=0.f; + } + } + } + + return acc; +} + +/* Noise normalization, quantization and coupling are not wholly + seperable processes in depth>1 coupling. */ +void _vp_couple_quantize_normalize(int blobno, + vorbis_info_psy_global *g, + vorbis_look_psy *p, + vorbis_info_mapping0 *vi, + float **mdct, + int **iwork, + int *nonzero, + int sliding_lowpass, + int ch){ + + int i; + int n = p->n; + int partition=(p->vi->normal_p ? p->vi->normal_partition : 16); + int limit = g->coupling_pointlimit[p->vi->blockflag][blobno]; + float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]]; + float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]]; + //float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */ + + /* mdct is our raw mdct output, floor not removed. */ + /* inout passes in the ifloor, passes back quantized result */ + + /* unquantized energy (negative indicates amplitude has negative sign) */ + float **raw = (float**)alloca(ch*sizeof(*raw)); + + /* dual pupose; quantized energy (if flag set), othersize fabs(raw) */ + float **quant = (float**)alloca(ch*sizeof(*quant)); + + /* floor energy */ + float **floor = (float**)alloca(ch*sizeof(*floor)); + + /* flags indicating raw/quantized status of elements in raw vector */ + int **flag = (int**)alloca(ch*sizeof(*flag)); + + /* non-zero flag working vector */ + int *nz = (int*)alloca(ch*sizeof(*nz)); + + /* energy surplus/defecit tracking */ + float *acc = (float*)alloca((ch+vi->coupling_steps)*sizeof(*acc)); + + /* The threshold of a stereo is changed with the size of n */ + if(n > 1000) + postpoint=stereo_threshholds_limited[g->coupling_postpointamp[blobno]]; + + raw[0] = (float*)alloca(ch*partition*sizeof(**raw)); + quant[0] = (float*)alloca(ch*partition*sizeof(**quant)); + floor[0] = (float*)alloca(ch*partition*sizeof(**floor)); + flag[0] = (int*)alloca(ch*partition*sizeof(**flag)); + + for(i=1;icoupling_steps;i++) + acc[i]=0.f; + + for(i=0;i n-i ? n-i : partition; + int step,track = 0; + + memcpy(nz,nonzero,sizeof(*nz)*ch); + + /* prefill */ + memset(flag[0],0,ch*partition*sizeof(**flag)); + for(k=0;kcoupling_steps;step++){ + int Mi = vi->coupling_mag[step]; + int Ai = vi->coupling_ang[step]; + int *iM = &iwork[Mi][i]; + int *iA = &iwork[Ai][i]; + float *reM = raw[Mi]; + float *reA = raw[Ai]; + float *qeM = quant[Mi]; + float *qeA = quant[Ai]; + float *floorM = floor[Mi]; + float *floorA = floor[Ai]; + int *fM = flag[Mi]; + int *fA = flag[Ai]; + + if(nz[Mi] || nz[Ai]){ + nz[Mi] = nz[Ai] = 1; + + for(j=0;jabs(B)){ + iA[j]=(A>0?A-B:B-A); + }else{ + iA[j]=(B>0?A-B:B-A); + iM[j]=B; + } + + /* collapse two equivalent tuples to one */ + if(iA[j]>=abs(iM[j])*2){ + iA[j]= -iA[j]; + iM[j]= -iM[j]; + } + + } + + }else{ + /* lossy (point) coupling */ + if(jcoupling_steps;i++){ + /* make sure coupling a zero and a nonzero channel results in two + nonzero channels. */ + if(nonzero[vi->coupling_mag[i]] || + nonzero[vi->coupling_ang[i]]){ + nonzero[vi->coupling_mag[i]]=1; + nonzero[vi->coupling_ang[i]]=1; + } + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h new file mode 100644 index 0000000000..fd7201ffca --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h @@ -0,0 +1,154 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: random psychoacoustics (not including preecho) + last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_PSY_H_ +#define _V_PSY_H_ +#include "smallft.h" + +#include "backends.h" +#include "envelope.h" + +#ifndef EHMER_MAX +#define EHMER_MAX 56 +#endif + +/* psychoacoustic setup ********************************************/ +#define P_BANDS 17 /* 62Hz to 16kHz */ +#define P_LEVELS 8 /* 30dB to 100dB */ +#define P_LEVEL_0 30. /* 30 dB */ +#define P_NOISECURVES 3 + +#define NOISE_COMPAND_LEVELS 40 +typedef struct vorbis_info_psy{ + int blockflag; + + float ath_adjatt; + float ath_maxatt; + + float tone_masteratt[P_NOISECURVES]; + float tone_centerboost; + float tone_decay; + float tone_abs_limit; + float toneatt[P_BANDS]; + + int noisemaskp; + float noisemaxsupp; + float noisewindowlo; + float noisewindowhi; + int noisewindowlomin; + int noisewindowhimin; + int noisewindowfixed; + float noiseoff[P_NOISECURVES][P_BANDS]; + float noisecompand[NOISE_COMPAND_LEVELS]; + + float max_curve_dB; + + int normal_p; + int normal_start; + int normal_partition; + double normal_thresh; +} vorbis_info_psy; + +typedef struct{ + int eighth_octave_lines; + + /* for block long/short tuning; encode only */ + float preecho_thresh[VE_BANDS]; + float postecho_thresh[VE_BANDS]; + float stretch_penalty; + float preecho_minenergy; + + float ampmax_att_per_sec; + + /* channel coupling config */ + int coupling_pkHz[PACKETBLOBS]; + int coupling_pointlimit[2][PACKETBLOBS]; + int coupling_prepointamp[PACKETBLOBS]; + int coupling_postpointamp[PACKETBLOBS]; + int sliding_lowpass[2][PACKETBLOBS]; + +} vorbis_info_psy_global; + +typedef struct { + float ampmax; + int channels; + + vorbis_info_psy_global *gi; + int coupling_pointlimit[2][P_NOISECURVES]; +} vorbis_look_psy_global; + + +typedef struct { + int n; + struct vorbis_info_psy *vi; + + float ***tonecurves; + float **noiseoffset; + + float *ath; + long *octave; /* in n.ocshift format */ + long *bark; + + long firstoc; + long shiftoc; + int eighth_octave_lines; /* power of two, please */ + int total_octave_lines; + long rate; /* cache it */ + + float m_val; /* Masking compensation value */ + +} vorbis_look_psy; + +extern void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, + vorbis_info_psy_global *gi,int n,long rate); +extern void _vp_psy_clear(vorbis_look_psy *p); +extern void *_vi_psy_dup(void *source); + +extern void _vi_psy_free(vorbis_info_psy *i); +extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i); + +extern void _vp_noisemask(vorbis_look_psy *p, + float *logmdct, + float *logmask); + +extern void _vp_tonemask(vorbis_look_psy *p, + float *logfft, + float *logmask, + float global_specmax, + float local_specmax); + +extern void _vp_offset_and_mix(vorbis_look_psy *p, + float *noise, + float *tone, + int offset_select, + float *logmask, + float *mdct, + float *logmdct); + +extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd); + +extern void _vp_couple_quantize_normalize(int blobno, + vorbis_info_psy_global *g, + vorbis_look_psy *p, + vorbis_info_mapping0 *vi, + float **mdct, + int **iwork, + int *nonzero, + int sliding_lowpass, + int ch); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c new file mode 100644 index 0000000000..c783878d20 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c @@ -0,0 +1,45 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: registry for time, floor, res backends and channel mappings + last mod: $Id: registry.c 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#include "../../codec.h" +#include "codec_internal.h" +#include "registry.h" +#include "misc.h" +/* seems like major overkill now; the backend numbers will grow into + the infrastructure soon enough */ + +extern const vorbis_func_floor floor0_exportbundle; +extern const vorbis_func_floor floor1_exportbundle; +extern const vorbis_func_residue residue0_exportbundle; +extern const vorbis_func_residue residue1_exportbundle; +extern const vorbis_func_residue residue2_exportbundle; +extern const vorbis_func_mapping mapping0_exportbundle; + +const vorbis_func_floor *const _floor_P[]={ + &floor0_exportbundle, + &floor1_exportbundle, +}; + +const vorbis_func_residue *const _residue_P[]={ + &residue0_exportbundle, + &residue1_exportbundle, + &residue2_exportbundle, +}; + +const vorbis_func_mapping *const _mapping_P[]={ + &mapping0_exportbundle, +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h new file mode 100644 index 0000000000..3c2497fe66 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h @@ -0,0 +1,32 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: registry for time, floor, res backends and channel mappings + last mod: $Id: registry.h 15531 2008-11-24 23:50:06Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_REG_H_ +#define _V_REG_H_ + +#define VI_TRANSFORMB 1 +#define VI_WINDOWB 1 +#define VI_TIMEB 1 +#define VI_FLOORB 2 +#define VI_RESB 3 +#define VI_MAPB 1 + +extern const vorbis_func_floor *const _floor_P[]; +extern const vorbis_func_residue *const _residue_P[]; +extern const vorbis_func_mapping *const _mapping_P[]; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c new file mode 100644 index 0000000000..67cfe137f5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c @@ -0,0 +1,891 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: residue backend 0, 1 and 2 implementation + last mod: $Id: res0.c 17556 2010-10-21 18:25:19Z tterribe $ + + ********************************************************************/ + +/* Slow, slow, slow, simpleminded and did I mention it was slow? The + encode/decode loops are coded for clarity and performance is not + yet even a nagging little idea lurking in the shadows. Oh and BTW, + it's slow. */ + +#include +#include +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "os.h" + +//#define TRAIN_RES 1 +//#define TRAIN_RESAUX 1 + +#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) +#include +#endif + +typedef struct { + vorbis_info_residue0 *info; + + int parts; + int stages; + codebook *fullbooks; + codebook *phrasebook; + codebook ***partbooks; + + int partvals; + int **decodemap; + + long postbits; + long phrasebits; + long frames; + +#if defined(TRAIN_RES) || defined(TRAIN_RESAUX) + int train_seq; + long *training_data[8][64]; + float training_max[8][64]; + float training_min[8][64]; + float tmin; + float tmax; + int submap; +#endif + +} vorbis_look_residue0; + +static void res0_free_info(vorbis_info_residue *i){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void res0_free_look(vorbis_look_residue *i){ + int j; + if(i){ + + vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; + +#ifdef TRAIN_RES + { + int j,k,l; + for(j=0;jparts;j++){ + /*fprintf(stderr,"partition %d: ",j);*/ + for(k=0;k<8;k++) + if(look->training_data[k][j]){ + char buffer[80]; + FILE *of; + codebook *statebook=look->partbooks[j][k]; + + /* long and short into the same bucket by current convention */ + sprintf(buffer,"res_sub%d_part%d_pass%d.vqd",look->submap,j,k); + of=fopen(buffer,"a"); + + for(l=0;lentries;l++) + fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]); + + fclose(of); + + /*fprintf(stderr,"%d(%.2f|%.2f) ",k, + look->training_min[k][j],look->training_max[k][j]);*/ + + _ogg_free(look->training_data[k][j]); + look->training_data[k][j]=NULL; + } + /*fprintf(stderr,"\n");*/ + } + } + fprintf(stderr,"min/max residue: %g::%g\n",look->tmin,look->tmax); + + /*fprintf(stderr,"residue bit usage %f:%f (%f total)\n", + (float)look->phrasebits/look->frames, + (float)look->postbits/look->frames, + (float)(look->postbits+look->phrasebits)/look->frames);*/ +#endif + + + /*vorbis_info_residue0 *info=look->info; + + fprintf(stderr, + "%ld frames encoded in %ld phrasebits and %ld residue bits " + "(%g/frame) \n",look->frames,look->phrasebits, + look->resbitsflat, + (look->phrasebits+look->resbitsflat)/(float)look->frames); + + for(j=0;jparts;j++){ + long acc=0; + fprintf(stderr,"\t[%d] == ",j); + for(k=0;kstages;k++) + if((info->secondstages[j]>>k)&1){ + fprintf(stderr,"%ld,",look->resbits[j][k]); + acc+=look->resbits[j][k]; + } + + fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j], + acc?(float)acc/(look->resvals[j]*info->grouping):0); + } + fprintf(stderr,"\n");*/ + + for(j=0;jparts;j++) + if(look->partbooks[j])_ogg_free(look->partbooks[j]); + _ogg_free(look->partbooks); + for(j=0;jpartvals;j++) + _ogg_free(look->decodemap[j]); + _ogg_free(look->decodemap); + + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +#if 0 +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} +#endif + +static int icount(unsigned int v){ + int ret=0; + while(v){ + ret+=v&1; + v>>=1; + } + return(ret); +} + + +static void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; + int j,acc=0; + oggpack_write(opb,info->begin,24); + oggpack_write(opb,info->end,24); + + oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and + code with a partitioned book */ + oggpack_write(opb,info->partitions-1,6); /* possible partition choices */ + oggpack_write(opb,info->groupbook,8); /* group huffman book */ + + /* secondstages is a bitmask; as encoding progresses pass by pass, a + bitmask of one indicates this partition class has bits to write + this pass */ + for(j=0;jpartitions;j++){ + if(ilog(info->secondstages[j])>3){ + /* yes, this is a minor hack due to not thinking ahead */ + oggpack_write(opb,info->secondstages[j],3); + oggpack_write(opb,1,1); + oggpack_write(opb,info->secondstages[j]>>3,5); + }else + oggpack_write(opb,info->secondstages[j],4); /* trailing zero */ + acc+=icount(info->secondstages[j]); + } + for(j=0;jbooklist[j],8); + +} + +/* vorbis_info is for range checking */ +static vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ + int j,acc=0; + vorbis_info_residue0 *info=(vorbis_info_residue0*) _ogg_calloc(1,sizeof(*info)); + codec_setup_info *ci=(codec_setup_info*) vi->codec_setup; + + info->begin=oggpack_read(opb,24); + info->end=oggpack_read(opb,24); + info->grouping=oggpack_read(opb,24)+1; + info->partitions=oggpack_read(opb,6)+1; + info->groupbook=oggpack_read(opb,8); + + /* check for premature EOP */ + if(info->groupbook<0)goto errout; + + for(j=0;jpartitions;j++){ + int cascade=oggpack_read(opb,3); + int cflag=oggpack_read(opb,1); + if(cflag<0) goto errout; + if(cflag){ + int c=oggpack_read(opb,5); + if(c<0) goto errout; + cascade|=(c<<3); + } + info->secondstages[j]=cascade; + + acc+=icount(cascade); + } + for(j=0;jbooklist[j]=book; + } + + if(info->groupbook>=ci->books)goto errout; + for(j=0;jbooklist[j]>=ci->books)goto errout; + if(ci->book_param[info->booklist[j]]->maptype==0)goto errout; + } + + /* verify the phrasebook is not specifying an impossible or + inconsistent partitioning scheme. */ + /* modify the phrasebook ranging check from r16327; an early beta + encoder had a bug where it used an oversized phrasebook by + accident. These files should continue to be playable, but don't + allow an exploit */ + { + int entries = ci->book_param[info->groupbook]->entries; + int dim = ci->book_param[info->groupbook]->dim; + int partvals = 1; + if (dim<1) goto errout; + while(dim>0){ + partvals *= info->partitions; + if(partvals > entries) goto errout; + dim--; + } + info->partvals = partvals; + } + + return(info); + errout: + res0_free_info(info); + return(NULL); +} + +static vorbis_look_residue *res0_look(vorbis_dsp_state *vd, + vorbis_info_residue *vr){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)_ogg_calloc(1,sizeof(*look)); + codec_setup_info *ci=(codec_setup_info*)vd->vi->codec_setup; + + int j,k,acc=0; + int dim; + int maxstage=0; + look->info=info; + + look->parts=info->partitions; + look->fullbooks=ci->fullbooks; + look->phrasebook=ci->fullbooks+info->groupbook; + dim=look->phrasebook->dim; + + look->partbooks=(codebook***)_ogg_calloc(look->parts,sizeof(*look->partbooks)); + + for(j=0;jparts;j++){ + int stages=ilog(info->secondstages[j]); + if(stages){ + if(stages>maxstage)maxstage=stages; + look->partbooks[j]=(codebook**) _ogg_calloc(stages,sizeof(*look->partbooks[j])); + for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; +#ifdef TRAIN_RES + look->training_data[k][j]=_ogg_calloc(look->partbooks[j][k]->entries, + sizeof(***look->training_data)); +#endif + } + } + } + + look->partvals=1; + for(j=0;jpartvals*=look->parts; + + look->stages=maxstage; + look->decodemap=(int**)_ogg_malloc(look->partvals*sizeof(*look->decodemap)); + for(j=0;jpartvals;j++){ + long val=j; + long mult=look->partvals/look->parts; + look->decodemap[j]=(int*)_ogg_malloc(dim*sizeof(*look->decodemap[j])); + for(k=0;kparts; + look->decodemap[j][k]=deco; + } + } +#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) + { + static int train_seq=0; + look->train_seq=train_seq++; + } +#endif + return(look); +} + +/* break an abstraction and copy some code for performance purposes */ +static int local_book_besterror(codebook *book,int *a){ + int dim=book->dim; + int i,j,o; + int minval=book->minval; + int del=book->delta; + int qv=book->quantvals; + int ze=(qv>>1); + int index=0; + /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ + int p[8]={0,0,0,0,0,0,0,0}; + + if(del!=1){ + for(i=0,o=dim;i>1))/del; + int m = (v=qv?qv-1:m)); + p[o]=v*del+minval; + } + }else{ + for(i=0,o=dim;i=qv?qv-1:m)); + p[o]=v*del+minval; + } + } + + if(book->c->lengthlist[index]<=0){ + const static_codebook *c=book->c; + int best=-1; + /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ + int e[8]={0,0,0,0,0,0,0,0}; + int maxval = book->minval + book->delta*(book->quantvals-1); + for(i=0;ientries;i++){ + if(c->lengthlist[i]>0){ + int thisx=0; + for(j=0;j=maxval) + e[j++]=0; + if(e[j]>=0) + e[j]+=book->delta; + e[j]= -e[j]; + } + } + + if(index>-1){ + for(i=0;idim; + int step=n/dim; + + for(i=0;i=0) + acc[entry]++; +#endif + + bits+=vorbis_book_encode(book,entry,opb); + + } + + return(bits); +} + +static long **_01class(vorbis_block *vb,vorbis_look_residue *vl, + int **in,int ch){ + long i,j,k; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; + vorbis_info_residue0 *info=look->info; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int possible_partitions=info->partitions; + int n=info->end-info->begin; + + int partvals=n/samples_per_partition; + long **partword=(long**)_vorbis_block_alloc(vb,ch*sizeof(*partword)); + float scale=100.0f/samples_per_partition; + + /* we find the partition type for each partition of each + channel. We'll go back and do the interleaved encoding in a + bit. For now, clarity */ + + for(i=0;ibegin; + for(j=0;jmax)max=abs(in[j][offset+k]); + ent+=abs(in[j][offset+k]); + } + ent*=scale; + + for(k=0;kclassmetric1[k] && + (info->classmetric2[k]<0 || entclassmetric2[k])) + break; + + partword[j][i]=k; + } + } + +#ifdef TRAIN_RESAUX + { + FILE *of; + char buffer[80]; + + for(i=0;itrain_seq); + of=fopen(buffer,"a"); + for(j=0;jframes++; + + return(partword); +} + +/* designed for stereo or other modes where the partition size is an + integer multiple of the number of channels encoded in the current + submap */ +static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,int **in, + int ch){ + long i,j,k,l; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; + vorbis_info_residue0 *info=look->info; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int possible_partitions=info->partitions; + int n=info->end-info->begin; + + int partvals=n/samples_per_partition; + long **partword=(long**)_vorbis_block_alloc(vb,sizeof(*partword)); + +#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) + FILE *of; + char buffer[80]; +#endif + + partword[0]=(long*)_vorbis_block_alloc(vb,partvals*sizeof(*partword[0])); + memset(partword[0],0,partvals*sizeof(*partword[0])); + + for(i=0,l=info->begin/ch;imagmax)magmax=abs(in[0][l]); + for(k=1;kangmax)angmax=abs(in[k][l]); + l++; + } + + for(j=0;jclassmetric1[j] && + angmax<=info->classmetric2[j]) + break; + + partword[0][i]=j; + + } + +#ifdef TRAIN_RESAUX + sprintf(buffer,"resaux_%d.vqd",look->train_seq); + of=fopen(buffer,"a"); + for(i=0;iframes++; + + return(partword); +} + +static int _01forward(oggpack_buffer *opb, + vorbis_block*, vorbis_look_residue *vl, + int **in,int ch, + long **partword, + int (*encode)(oggpack_buffer *,int *,int, + codebook *,long *), + int /* submap */){ + long i,j,k,s; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; + vorbis_info_residue0 *info=look->info; + +#ifdef TRAIN_RES + look->submap=submap; +#endif + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int possible_partitions=info->partitions; + int partitions_per_word=look->phrasebook->dim; + int n=info->end-info->begin; + + int partvals=n/samples_per_partition; + long resbits[128]; + long resvals[128]; + +#ifdef TRAIN_RES + for(i=0;ibegin;jend;j++){ + if(in[i][j]>look->tmax)look->tmax=in[i][j]; + if(in[i][j]tmin)look->tmin=in[i][j]; + } +#endif + + memset(resbits,0,sizeof(resbits)); + memset(resvals,0,sizeof(resvals)); + + /* we code the partition words for each channel, then the residual + words for a partition per channel until we've written all the + residual words for that partition word. Then write the next + partition channel words... */ + + for(s=0;sstages;s++){ + + for(i=0;iphrasebook->entries) + look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb); +#if 0 /*def TRAIN_RES*/ + else + fprintf(stderr,"!"); +#endif + + } + } + + /* now we encode interleaved residual values for the partitions */ + for(k=0;kbegin; + + for(j=0;jsecondstages[partword[j][i]]&(1<partbooks[partword[j][i]][s]; + if(statebook){ + int ret; + long *accumulator=NULL; + +#ifdef TRAIN_RES + accumulator=look->training_data[s][partword[j][i]]; + { + int l; + int *samples=in[j]+offset; + for(l=0;ltraining_min[s][partword[j][i]]) + look->training_min[s][partword[j][i]]=samples[l]; + if(samples[l]>look->training_max[s][partword[j][i]]) + look->training_max[s][partword[j][i]]=samples[l]; + } + } +#endif + + ret=encode(opb,in[j]+offset,samples_per_partition, + statebook,accumulator); + + look->postbits+=ret; + resbits[partword[j][i]]+=ret; + } + } + } + } + } + } + + /*{ + long total=0; + long totalbits=0; + fprintf(stderr,"%d :: ",vb->mode); + for(k=0;kinfo; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int partitions_per_word=look->phrasebook->dim; + int max=vb->pcmend>>1; + int end=(info->endend:max); + int n=end-info->begin; + + if(n>0){ + int partvals=n/samples_per_partition; + int partwords=(partvals+partitions_per_word-1)/partitions_per_word; + int ***partword=(int***)alloca(ch*sizeof(*partword)); + + for(j=0;jstages;s++){ + + /* each loop decodes on partition codeword containing + partitions_per_word partitions */ + for(i=0,l=0;iphrasebook,&vb->opb); + + if(temp==-1 || temp>=info->partvals)goto eopbreak; + partword[j][l]=look->decodemap[temp]; + if(partword[j][l]==NULL)goto errout; + } + } + + /* now we decode residual values for the partitions */ + for(k=0;kbegin+i*samples_per_partition; + if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; + if(stagebook){ + if(decodepart(stagebook,in[j]+offset,&vb->opb, + samples_per_partition)==-1)goto eopbreak; + } + } + } + } + } + } + errout: + eopbreak: + return(0); +} + +static int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, + float **in,int *nonzero,int ch){ + int i,used=0; + for(i=0;ipcmend/2,used=0; + + /* don't duplicate the code; use a working vector hack for now and + reshape ourselves into a single channel res1 */ + /* ugly; reallocs for each coupling pass :-( */ + int *work=(int*)_vorbis_block_alloc(vb,ch*n*sizeof(*work)); + for(i=0;iinfo; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int partitions_per_word=look->phrasebook->dim; + int max=(vb->pcmend*ch)>>1; + int end=(info->endend:max); + int n=end-info->begin; + + if(n>0){ + int partvals=n/samples_per_partition; + int partwords=(partvals+partitions_per_word-1)/partitions_per_word; + int **partword=(int**)_vorbis_block_alloc(vb,partwords*sizeof(*partword)); + + for(i=0;istages;s++){ + for(i=0,l=0;iphrasebook,&vb->opb); + if(temp==-1 || temp>=info->partvals)goto eopbreak; + partword[l]=look->decodemap[temp]; + if(partword[l]==NULL)goto errout; + } + + /* now we decode residual values for the partitions */ + for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; + + if(stagebook){ + if(vorbis_book_decodevv_add(stagebook,in, + i*samples_per_partition+info->begin,ch, + &vb->opb,samples_per_partition)==-1) + goto eopbreak; + } + } + } + } + } + errout: + eopbreak: + return(0); +} + + +const vorbis_func_residue residue0_exportbundle={ + NULL, + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + NULL, + NULL, + &res0_inverse +}; + +const vorbis_func_residue residue1_exportbundle={ + &res0_pack, + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res1_class, + &res1_forward, + &res1_inverse +}; + +const vorbis_func_residue residue2_exportbundle={ + &res0_pack, + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res2_class, + &res2_forward, + &res2_inverse +}; diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h new file mode 100644 index 0000000000..4adfd78448 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h @@ -0,0 +1,90 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: linear scale -> dB, Bark and Mel scales + last mod: $Id: scales.h 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_SCALES_H_ +#define _V_SCALES_H_ + +#include +#include "os.h" + +#ifdef _MSC_VER +/* MS Visual Studio doesn't have C99 inline keyword. */ +#define inline __inline +#endif + +/* 20log10(x) */ +#define VORBIS_IEEE_FLOAT32 1 +#ifdef VORBIS_IEEE_FLOAT32 + +static inline float unitnorm(float x){ + union { + ogg_uint32_t i; + float f; + } ix; + ix.f = x; + ix.i = (ix.i & 0x80000000U) | (0x3f800000U); + return ix.f; +} + +/* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */ +static inline float todB(const float *x){ + union { + ogg_uint32_t i; + float f; + } ix; + ix.f = *x; + ix.i = ix.i&0x7fffffff; + return (float)(ix.i * 7.17711438e-7f -764.6161886f); +} + +#define todB_nn(x) todB(x) + +#else + +static float unitnorm(float x){ + if(x<0)return(-1.f); + return(1.f); +} + +#define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f) +#define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f) + +#endif + +#define fromdB(x) (exp((x)*.11512925f)) + +/* The bark scale equations are approximations, since the original + table was somewhat hand rolled. The below are chosen to have the + best possible fit to the rolled tables, thus their somewhat odd + appearance (these are more accurate and over a longer range than + the oft-quoted bark equations found in the texts I have). The + approximations are valid from 0 - 30kHz (nyquist) or so. + + all f in Hz, z in Bark */ + +#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) +#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) +#define toMEL(n) (log(1.f+(n)*.001f)*1442.695f) +#define fromMEL(m) (1000.f*exp((m)/1442.695f)-1000.f) + +/* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave + 0.0 */ + +#define toOC(n) (log(n)*1.442695f-5.965784f) +#define fromOC(o) (exp(((o)+5.965784f)*.693147f)) + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c new file mode 100644 index 0000000000..2f27b8609b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c @@ -0,0 +1,581 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + last mod: $Id: sharedbook.c 17030 2010-03-25 06:52:55Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include +#include "../../ogg.h" +#include "os.h" +#include "misc.h" +#include "../../codec.h" +#include "codebook.h" +#include "scales.h" + +/**** pack/unpack helpers ******************************************/ +int _ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* 32 bit float (not IEEE; nonnormalized mantissa + + biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm + Why not IEEE? It's just not that important here. */ + +#define VQ_FEXP 10 +#define VQ_FMAN 21 +#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ + +/* doesn't currently guard under/overflow */ +long _float32_pack(float val){ + int sign=0; + long exp; + long mant; + if(val<0){ + sign=0x80000000; + val= -val; + } + exp= floor(log(val)/log(2.f)+.001); //+epsilon + mant=rint(ldexp(val,(VQ_FMAN-1)-exp)); + exp=(exp+VQ_FEXP_BIAS)<>VQ_FMAN; + if(sign)mant= -mant; + return(ldexp(mant,exp-(VQ_FMAN-1)-VQ_FEXP_BIAS)); +} + +/* given a list of word lengths, generate a list of codewords. Works + for length ordered or unordered, always assigns the lowest valued + codewords first. Extended to handle unused entries (length 0) */ +static ogg_uint32_t *_make_words(long *l,long n,long sparsecount){ + long i,j,count=0; + ogg_uint32_t marker[33]; + ogg_uint32_t *r=(ogg_uint32_t*)_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); + memset(marker,0,sizeof(marker)); + + for(i=0;i0){ + ogg_uint32_t entry=marker[length]; + + /* when we claim a node for an entry, we also claim the nodes + below it (pruning off the imagined tree that may have dangled + from it) as well as blocking the use of any nodes directly + above for leaves */ + + /* update ourself */ + if(length<32 && (entry>>length)){ + /* error condition; the lengths must specify an overpopulated tree */ + _ogg_free(r); + return(NULL); + } + r[count++]=entry; + + /* Look to see if the next shorter marker points to the node + above. if so, update it and repeat. */ + { + for(j=length;j>0;j--){ + + if(marker[j]&1){ + /* have to jump branches */ + if(j==1) + marker[1]++; + else + marker[j]=marker[j-1]<<1; + break; /* invariant says next upper marker would already + have been moved if it was on the same path */ + } + marker[j]++; + } + } + + /* prune the tree; the implicit invariant says all the longer + markers were dangling from our just-taken node. Dangle them + from our *new* node. */ + for(j=length+1;j<33;j++) + if((marker[j]>>1) == entry){ + entry=marker[j]; + marker[j]=marker[j-1]<<1; + }else + break; + }else + if(sparsecount==0)count++; + } + + /* sanity check the huffman tree; an underpopulated tree must be + rejected. The only exception is the one-node pseudo-nil tree, + which appears to be underpopulated because the tree doesn't + really exist; there's only one possible 'codeword' or zero bits, + but the above tree-gen code doesn't mark that. */ + if(sparsecount != 1){ + for(i=1;i<33;i++) + if(marker[i] & (0xffffffffUL>>(32-i))){ + _ogg_free(r); + return(NULL); + } + } + + /* bitreverse the words because our bitwise packer/unpacker is LSb + endian */ + for(i=0,count=0;i>j)&1; + } + + if(sparsecount){ + if(l[i]) + r[count++]=temp; + }else + r[count++]=temp; + } + + return(r); +} + +/* there might be a straightforward one-line way to do the below + that's portable and totally safe against roundoff, but I haven't + thought of it. Therefore, we opt on the side of caution */ +long _book_maptype1_quantvals(const static_codebook *b){ + long vals=floor(pow((float)b->entries,1.f/b->dim)); + + /* the above *should* be reliable, but we'll not assume that FP is + ever reliable when bitstream sync is at stake; verify via integer + means that vals really is the greatest value of dim for which + vals^b->bim <= b->entries */ + /* treat the above as an initial guess */ + while(1){ + long acc=1; + long acc1=1; + int i; + for(i=0;idim;i++){ + acc*=vals; + acc1*=vals+1; + } + if(acc<=b->entries && acc1>b->entries){ + return(vals); + }else{ + if(acc>b->entries){ + vals--; + }else{ + vals++; + } + } + } +} + +/* unpack the quantized list of values for encode/decode ***********/ +/* we need to deal with two map types: in map type 1, the values are + generated algorithmically (each column of the vector counts through + the values in the quant vector). in map type 2, all the values came + in in an explicit list. Both value lists must be unpacked */ +float *_book_unquantize(const static_codebook *b,int n,int *sparsemap){ + long j,k,count=0; + if(b->maptype==1 || b->maptype==2){ + int quantvals; + float mindel=_float32_unpack(b->q_min); + float delta=_float32_unpack(b->q_delta); + float *r=(float*)_ogg_calloc(n*b->dim,sizeof(*r)); + + /* maptype 1 and 2 both use a quantized value vector, but + different sizes */ + switch(b->maptype){ + case 1: + /* most of the time, entries%dimensions == 0, but we need to be + well defined. We define that the possible vales at each + scalar is values == entries/dim. If entries%dim != 0, we'll + have 'too few' values (values*dimentries;j++){ + if((sparsemap && b->lengthlist[j]) || !sparsemap){ + float last=0.f; + int indexdiv=1; + for(k=0;kdim;k++){ + int index= (j/indexdiv)%quantvals; + float val=b->quantlist[index]; + val=fabs(val)*delta+mindel+last; + if(b->q_sequencep)last=val; + if(sparsemap) + r[sparsemap[count]*b->dim+k]=val; + else + r[count*b->dim+k]=val; + indexdiv*=quantvals; + } + count++; + } + + } + break; + case 2: + for(j=0;jentries;j++){ + if((sparsemap && b->lengthlist[j]) || !sparsemap){ + float last=0.f; + + for(k=0;kdim;k++){ + float val=b->quantlist[j*b->dim+k]; + val=fabs(val)*delta+mindel+last; + if(b->q_sequencep)last=val; + if(sparsemap) + r[sparsemap[count]*b->dim+k]=val; + else + r[count*b->dim+k]=val; + } + count++; + } + } + break; + } + + return(r); + } + return(NULL); +} + +void vorbis_staticbook_destroy(static_codebook *b){ + if(b->allocedp){ + if(b->quantlist)_ogg_free(b->quantlist); + if(b->lengthlist)_ogg_free(b->lengthlist); + memset(b,0,sizeof(*b)); + _ogg_free(b); + } /* otherwise, it is in static memory */ +} + +void vorbis_book_clear(codebook *b){ + /* static book is not cleared; we're likely called on the lookup and + the static codebook belongs to the info struct */ + if(b->valuelist)_ogg_free(b->valuelist); + if(b->codelist)_ogg_free(b->codelist); + + if(b->dec_index)_ogg_free(b->dec_index); + if(b->dec_codelengths)_ogg_free(b->dec_codelengths); + if(b->dec_firsttable)_ogg_free(b->dec_firsttable); + + memset(b,0,sizeof(*b)); +} + +int vorbis_book_init_encode(codebook *c,const static_codebook *s){ + + memset(c,0,sizeof(*c)); + c->c=s; + c->entries=s->entries; + c->used_entries=s->entries; + c->dim=s->dim; + c->codelist=_make_words(s->lengthlist,s->entries,0); + //c->valuelist=_book_unquantize(s,s->entries,NULL); + c->quantvals=_book_maptype1_quantvals(s); + c->minval=(int)rint(_float32_unpack(s->q_min)); + c->delta=(int)rint(_float32_unpack(s->q_delta)); + + return(0); +} + +#if 0 +static ogg_uint32_t bitreverse(ogg_uint32_t x){ + x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); + x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); + x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); + x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); + return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); +} +#endif + +static int JUCE_CDECL sort32a(const void *a,const void *b){ + return ( **(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- + ( **(ogg_uint32_t **)a<**(ogg_uint32_t **)b); +} + +/* decode codebook arrangement is more heavily optimized than encode */ +int vorbis_book_init_decode(codebook *c,const static_codebook *s){ + int i,j,n=0,tabn; + int *sortindex; + memset(c,0,sizeof(*c)); + + /* count actually used entries */ + for(i=0;ientries;i++) + if(s->lengthlist[i]>0) + n++; + + c->entries=s->entries; + c->used_entries=n; + c->dim=s->dim; + + if(n>0){ + + /* two different remappings go on here. + + First, we collapse the likely sparse codebook down only to + actually represented values/words. This collapsing needs to be + indexed as map-valueless books are used to encode original entry + positions as integers. + + Second, we reorder all vectors, including the entry index above, + by sorted bitreversed codeword to allow treeless decode. */ + + /* perform sort */ + ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); + ogg_uint32_t **codep=(ogg_uint32_t**)alloca(sizeof(*codep)*n); + + if(codes==NULL)goto err_out; + + for(i=0;icodelist=(ogg_uint32_t*)_ogg_malloc(n*sizeof(*c->codelist)); + /* the index is a reverse index */ + for(i=0;icodelist[sortindex[i]]=codes[i]; + _ogg_free(codes); + + + c->valuelist=_book_unquantize(s,n,sortindex); + c->dec_index=(int*)_ogg_malloc(n*sizeof(*c->dec_index)); + + for(n=0,i=0;ientries;i++) + if(s->lengthlist[i]>0) + c->dec_index[sortindex[n++]]=i; + + c->dec_codelengths=(char*)_ogg_malloc(n*sizeof(*c->dec_codelengths)); + for(n=0,i=0;ientries;i++) + if(s->lengthlist[i]>0) + c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; + + c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */ + if(c->dec_firsttablen<5)c->dec_firsttablen=5; + if(c->dec_firsttablen>8)c->dec_firsttablen=8; + + tabn=1<dec_firsttablen; + c->dec_firsttable=(ogg_uint32_t*)_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); + c->dec_maxlength=0; + + for(i=0;idec_maxlengthdec_codelengths[i]) + c->dec_maxlength=c->dec_codelengths[i]; + if(c->dec_codelengths[i]<=c->dec_firsttablen){ + ogg_uint32_t orig=bitreverse(c->codelist[i]); + for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) + c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; + } + } + + /* now fill in 'unused' entries in the firsttable with hi/lo search + hints for the non-direct-hits */ + { + ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); + long lo=0,hi=0; + + for(i=0;idec_firsttablen); + if(c->dec_firsttable[bitreverse(word)]==0){ + while((lo+1)codelist[lo+1]<=word)lo++; + while( hi=(c->codelist[hi]&mask))hi++; + + /* we only actually have 15 bits per hint to play with here. + In order to overflow gracefully (nothing breaks, efficiency + just drops), encode as the difference from the extremes. */ + { + unsigned long loval=lo; + unsigned long hival=n-hi; + + if(loval>0x7fff)loval=0x7fff; + if(hival>0x7fff)hival=0x7fff; + c->dec_firsttable[bitreverse(word)]= + 0x80000000UL | (loval<<15) | hival; + } + } + } + } + } + + return(0); + err_out: + vorbis_book_clear(c); + return(-1); +} + +long vorbis_book_codeword(codebook *book,int entry){ + if(book->c) /* only use with encode; decode optimizations are + allowed to break this */ + return book->codelist[entry]; + return -1; +} + +long vorbis_book_codelen(codebook *book,int entry){ + if(book->c) /* only use with encode; decode optimizations are + allowed to break this */ + return book->c->lengthlist[entry]; + return -1; +} + +#ifdef _V_SELFTEST + +/* Unit tests of the dequantizer; this stuff will be OK + cross-platform, I simply want to be sure that special mapping cases + actually work properly; a bug could go unnoticed for a while */ + +#include + +/* cases: + + no mapping + full, explicit mapping + algorithmic mapping + + nonsequential + sequential +*/ + +static long full_quantlist1[]={0,1,2,3, 4,5,6,7, 8,3,6,1}; +static long partial_quantlist1[]={0,7,2}; + +/* no mapping */ +static_codebook test1={ + 4,16, + NULL, + 0, + 0,0,0,0, + NULL, + 0 +}; +static float *test1_result=NULL; + +/* linear, full mapping, nonsequential */ +static_codebook test2={ + 4,3, + NULL, + 2, + -533200896,1611661312,4,0, + full_quantlist1, + 0 +}; +static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2}; + +/* linear, full mapping, sequential */ +static_codebook test3={ + 4,3, + NULL, + 2, + -533200896,1611661312,4,1, + full_quantlist1, + 0 +}; +static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6}; + +/* linear, algorithmic mapping, nonsequential */ +static_codebook test4={ + 3,27, + NULL, + 1, + -533200896,1611661312,4,0, + partial_quantlist1, + 0 +}; +static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3, + -3, 4,-3, 4, 4,-3, -1, 4,-3, + -3,-1,-3, 4,-1,-3, -1,-1,-3, + -3,-3, 4, 4,-3, 4, -1,-3, 4, + -3, 4, 4, 4, 4, 4, -1, 4, 4, + -3,-1, 4, 4,-1, 4, -1,-1, 4, + -3,-3,-1, 4,-3,-1, -1,-3,-1, + -3, 4,-1, 4, 4,-1, -1, 4,-1, + -3,-1,-1, 4,-1,-1, -1,-1,-1}; + +/* linear, algorithmic mapping, sequential */ +static_codebook test5={ + 3,27, + NULL, + 1, + -533200896,1611661312,4,1, + partial_quantlist1, + 0 +}; +static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7, + -3, 1,-2, 4, 8, 5, -1, 3, 0, + -3,-4,-7, 4, 3, 0, -1,-2,-5, + -3,-6,-2, 4, 1, 5, -1,-4, 0, + -3, 1, 5, 4, 8,12, -1, 3, 7, + -3,-4, 0, 4, 3, 7, -1,-2, 2, + -3,-6,-7, 4, 1, 0, -1,-4,-5, + -3, 1, 0, 4, 8, 7, -1, 3, 2, + -3,-4,-5, 4, 3, 2, -1,-2,-3}; + +void run_test(static_codebook *b,float *comp){ + float *out=_book_unquantize(b,b->entries,NULL); + int i; + + if(comp){ + if(!out){ + fprintf(stderr,"_book_unquantize incorrectly returned NULL\n"); + exit(1); + } + + for(i=0;ientries*b->dim;i++) + if(fabs(out[i]-comp[i])>.0001){ + fprintf(stderr,"disagreement in unquantized and reference data:\n" + "position %d, %g != %g\n",i,out[i],comp[i]); + exit(1); + } + + }else{ + if(out){ + fprintf(stderr,"_book_unquantize returned a value array: \n" + " correct result should have been NULL\n"); + exit(1); + } + } +} + +int main(){ + /* run the nine dequant tests, and compare to the hand-rolled results */ + fprintf(stderr,"Dequant test 1... "); + run_test(&test1,test1_result); + fprintf(stderr,"OK\nDequant test 2... "); + run_test(&test2,test2_result); + fprintf(stderr,"OK\nDequant test 3... "); + run_test(&test3,test3_result); + fprintf(stderr,"OK\nDequant test 4... "); + run_test(&test4,test4_result); + fprintf(stderr,"OK\nDequant test 5... "); + run_test(&test5,test5_result); + fprintf(stderr,"OK\n\n"); + + return(0); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c new file mode 100644 index 0000000000..03e166a698 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c @@ -0,0 +1,1255 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: *unnormalized* fft transform + last mod: $Id: smallft.c 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +/* FFT implementation from OggSquish, minus cosine transforms, + * minus all but radix 2/4 case. In Vorbis we only need this + * cut-down version. + * + * To do more than just power-of-two sized vectors, see the full + * version I wrote for NetLib. + * + * Note that the packing is a little strange; rather than the FFT r/i + * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, + * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the + * FORTRAN version + */ + +#include +#include +#include +#include "smallft.h" +#include "os.h" +#include "misc.h" + +static void drfti1(int n, float *wa, int *ifac){ + static int ntryh[4] = { 4,2,3,5 }; + static float tpi = 6.28318530717958648f; + float arg,argh,argld,fi; + int ntry=0,i,j=-1; + int k1, l1, l2, ib; + int ld, ii, ip, is, nq, nr; + int ido, ipm, nfm1; + int nl=n; + int nf=0; + + L101: + j++; + if (j < 4) + ntry=ntryh[j]; + else + ntry+=2; + + L104: + nq=nl/ntry; + nr=nl-ntry*nq; + if (nr!=0) goto L101; + + nf++; + ifac[nf+1]=ntry; + nl=nq; + if(ntry!=2)goto L107; + if(nf==1)goto L107; + + for (i=1;i>1; + ipp2=ip; + idp2=ido; + nbd=(ido-1)>>1; + t0=l1*ido; + t10=ip*ido; + + if(ido==1)goto L119; + for(ik=0;ikl1){ + for(j=1;j>1; + ipp2=ip; + ipph=(ip+1)>>1; + if(idol1)goto L139; + + is= -ido-1; + t1=0; + for(j=1;jn==1)return; + drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); +} + +void drft_backward(drft_lookup *l,float *data){ + if (l->n==1)return; + drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); +} + +void drft_init(drft_lookup *l,int n){ + l->n=n; + l->trigcache=(float*)_ogg_calloc(3*n,sizeof(*l->trigcache)); + l->splitcache=(int*)_ogg_calloc(32,sizeof(*l->splitcache)); + fdrffti(n, l->trigcache, l->splitcache); +} + +void drft_clear(drft_lookup *l){ + if(l){ + if(l->trigcache)_ogg_free(l->trigcache); + if(l->splitcache)_ogg_free(l->splitcache); + memset(l,0,sizeof(*l)); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h new file mode 100644 index 0000000000..420a6abfb1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h @@ -0,0 +1,34 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: fft transform + last mod: $Id: smallft.h 13293 2007-07-24 00:09:47Z xiphmont $ + + ********************************************************************/ + +#ifndef _V_SMFT_H_ +#define _V_SMFT_H_ + +#include "../../codec.h" + +typedef struct { + int n; + float *trigcache; + int *splitcache; +} drft_lookup; + +extern void drft_forward(drft_lookup *l,float *data); +extern void drft_backward(drft_lookup *l,float *data); +extern void drft_init(drft_lookup *l,int n); +extern void drft_clear(drft_lookup *l); + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c new file mode 100644 index 0000000000..a9fca6832f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c @@ -0,0 +1,184 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: single-block PCM synthesis + last mod: $Id: synthesis.c 17474 2010-09-30 03:41:41Z gmaxwell $ + + ********************************************************************/ + +#include +#include "../../ogg.h" +#include "../../codec.h" +#include "codec_internal.h" +#include "registry.h" +#include "misc.h" +#include "os.h" + +int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ + vorbis_dsp_state *vd= vb ? vb->vd : 0; + private_state *b= vd ? (private_state*)vd->backend_state : 0; + vorbis_info *vi= vd ? vd->vi : 0; + codec_setup_info *ci= vi ? (codec_setup_info*)vi->codec_setup : 0; + oggpack_buffer *opb=vb ? &vb->opb : 0; + int type,mode,i; + + if (!vd || !b || !vi || !ci || !opb) { + return OV_EBADPACKET; + } + + /* first things first. Make sure decode is ready */ + _vorbis_block_ripcord(vb); + oggpack_readinit(opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(opb,b->modebits); + if(mode==-1){ + return(OV_EBADPACKET); + } + + vb->mode=mode; + if(!ci->mode_param[mode]){ + return(OV_EBADPACKET); + } + + vb->W=ci->mode_param[mode]->blockflag; + if(vb->W){ + + /* this doesn;t get mapped through mode selection as it's used + only for window selection */ + vb->lW=oggpack_read(opb,1); + vb->nW=oggpack_read(opb,1); + if(vb->nW==-1){ + return(OV_EBADPACKET); + } + }else{ + vb->lW=0; + vb->nW=0; + } + + /* more setup */ + vb->granulepos=op->granulepos; + vb->sequence=op->packetno; + vb->eofflag=op->e_o_s; + + /* alloc pcm passback storage */ + vb->pcmend=ci->blocksizes[vb->W]; + vb->pcm=(float**)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); + for(i=0;ichannels;i++) + vb->pcm[i]=(float*)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); + + /* unpack_header enforces range checking */ + type=ci->map_type[ci->mode_param[mode]->mapping]; + + return(_mapping_P[type]->inverse(vb,ci->map_param[ci->mode_param[mode]-> + mapping])); +} + +/* used to track pcm position without actually performing decode. + Useful for sequential 'fast forward' */ +int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ + vorbis_dsp_state *vd=vb->vd; + private_state *b=(private_state*)vd->backend_state; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + oggpack_buffer *opb=&vb->opb; + int mode; + + /* first things first. Make sure decode is ready */ + _vorbis_block_ripcord(vb); + oggpack_readinit(opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(opb,b->modebits); + if(mode==-1)return(OV_EBADPACKET); + + vb->mode=mode; + if(!ci->mode_param[mode]){ + return(OV_EBADPACKET); + } + + vb->W=ci->mode_param[mode]->blockflag; + if(vb->W){ + vb->lW=oggpack_read(opb,1); + vb->nW=oggpack_read(opb,1); + if(vb->nW==-1) return(OV_EBADPACKET); + }else{ + vb->lW=0; + vb->nW=0; + } + + /* more setup */ + vb->granulepos=op->granulepos; + vb->sequence=op->packetno; + vb->eofflag=op->e_o_s; + + /* no pcm */ + vb->pcmend=0; + vb->pcm=NULL; + + return(0); +} + +long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + oggpack_buffer opb; + int mode; + + oggpack_readinit(&opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(&opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + { + int modebits=0; + int v=ci->modes; + while(v>1){ + modebits++; + v>>=1; + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(&opb,modebits); + } + if(mode==-1)return(OV_EBADPACKET); + return(ci->blocksizes[ci->mode_param[mode]->blockflag]); +} + +int vorbis_synthesis_halfrate(vorbis_info *vi,int flag){ + /* set / clear half-sample-rate mode */ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + + /* right now, our MDCT can't handle < 64 sample windows. */ + if(ci->blocksizes[0]<=64 && flag)return -1; + ci->halfrate_flag=(flag?1:0); + return 0; +} + +int vorbis_synthesis_halfrate_p(vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + return ci->halfrate_flag; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c new file mode 100644 index 0000000000..4c5e55ddc2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c @@ -0,0 +1,1215 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: simple programmatic interface for encoder mode setup + last mod: $Id: vorbisenc.c 17028 2010-03-25 05:22:15Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include + +#include "../../codec.h" +#include "../../vorbisenc.h" + +#include "codec_internal.h" + +#include "os.h" +#include "misc.h" + +/* careful with this; it's using static array sizing to make managing + all the modes a little less annoying. If we use a residue backend + with > 12 partition types, or a different division of iteration, + this needs to be updated. */ +typedef struct { + const static_codebook *books[12][4]; +} static_bookblock; + +typedef struct { + int res_type; + int limit_type; /* 0 lowpass limited, 1 point stereo limited */ + int grouping; + const vorbis_info_residue0 *res; + const static_codebook *book_aux; + const static_codebook *book_aux_managed; + const static_bookblock *books_base; + const static_bookblock *books_base_managed; +} vorbis_residue_template; + +typedef struct { + const vorbis_info_mapping0 *map; + const vorbis_residue_template *res; +} vorbis_mapping_template; + +typedef struct vp_adjblock{ + int block[P_BANDS]; +} vp_adjblock; + +typedef struct { + int data[NOISE_COMPAND_LEVELS]; +} compandblock; + +/* high level configuration information for setting things up + step-by-step with the detailed vorbis_encode_ctl interface. + There's a fair amount of redundancy such that interactive setup + does not directly deal with any vorbis_info or codec_setup_info + initialization; it's all stored (until full init) in this highlevel + setup, then flushed out to the real codec setup structs later. */ + +typedef struct { + int att[P_NOISECURVES]; + float boost; + float decay; +} att3; +typedef struct { int data[P_NOISECURVES]; } adj3; + +typedef struct { + int pre[PACKETBLOBS]; + int post[PACKETBLOBS]; + float kHz[PACKETBLOBS]; + float lowpasskHz[PACKETBLOBS]; +} adj_stereo; + +typedef struct { + int lo; + int hi; + int fixed; +} noiseguard; +typedef struct { + int data[P_NOISECURVES][17]; +} noise3; + +typedef struct { + int mappings; + const double *rate_mapping; + const double *quality_mapping; + int coupling_restriction; + long samplerate_min_restriction; + long samplerate_max_restriction; + + + const int *blocksize_short; + const int *blocksize_long; + + const att3 *psy_tone_masteratt; + const int *psy_tone_0dB; + const int *psy_tone_dBsuppress; + + const vp_adjblock *psy_tone_adj_impulse; + const vp_adjblock *psy_tone_adj_long; + const vp_adjblock *psy_tone_adj_other; + + const noiseguard *psy_noiseguards; + const noise3 *psy_noise_bias_impulse; + const noise3 *psy_noise_bias_padding; + const noise3 *psy_noise_bias_trans; + const noise3 *psy_noise_bias_long; + const int *psy_noise_dBsuppress; + + const compandblock *psy_noise_compand; + const double *psy_noise_compand_short_mapping; + const double *psy_noise_compand_long_mapping; + + const int *psy_noise_normal_start[2]; + const int *psy_noise_normal_partition[2]; + const double *psy_noise_normal_thresh; + + const int *psy_ath_float; + const int *psy_ath_abs; + + const double *psy_lowpass; + + const vorbis_info_psy_global *global_params; + const double *global_mapping; + const adj_stereo *stereo_modes; + + const static_codebook *const *const * floor_books; + const vorbis_info_floor1 *floor_params; + int floor_mappings; + const int **floor_mapping_list; + + const vorbis_mapping_template *maps; +} ve_setup_data_template; + +/* a few static coder conventions */ +static const vorbis_info_mode _mode_template[2]={ + {0,0,0,0}, + {1,0,0,1} +}; + +static const vorbis_info_mapping0 _map_nominal[2]={ + {1, {0,0}, {0}, {0}, 1,{0},{1}}, + {1, {0,0}, {1}, {1}, 1,{0},{1}} +}; + +#include "modes/setup_44.h" +#include "modes/setup_44u.h" +#include "modes/setup_44p51.h" +#include "modes/setup_32.h" +#include "modes/setup_8.h" +#include "modes/setup_11.h" +#include "modes/setup_16.h" +#include "modes/setup_22.h" +#include "modes/setup_X.h" + +static const ve_setup_data_template *const setup_list[]={ + &ve_setup_44_stereo, + &ve_setup_44_51, + &ve_setup_44_uncoupled, + + &ve_setup_32_stereo, + &ve_setup_32_uncoupled, + + &ve_setup_22_stereo, + &ve_setup_22_uncoupled, + &ve_setup_16_stereo, + &ve_setup_16_uncoupled, + + &ve_setup_11_stereo, + &ve_setup_11_uncoupled, + &ve_setup_8_stereo, + &ve_setup_8_uncoupled, + + &ve_setup_X_stereo, + &ve_setup_X_uncoupled, + &ve_setup_XX_stereo, + &ve_setup_XX_uncoupled, + 0 +}; + +static void vorbis_encode_floor_setup(vorbis_info *vi,int s, + const static_codebook *const *const *const books, + const vorbis_info_floor1 *in, + const int *x){ + int i,k,is=s; + vorbis_info_floor1 *f=(vorbis_info_floor1*) _ogg_calloc(1,sizeof(*f)); + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + + memcpy(f,in+x[is],sizeof(*f)); + + /* books */ + { + int partitions=f->partitions; + int maxclass=-1; + int maxbook=-1; + for(i=0;ipartitionclass[i]>maxclass)maxclass=f->partitionclass[i]; + for(i=0;i<=maxclass;i++){ + if(f->class_book[i]>maxbook)maxbook=f->class_book[i]; + f->class_book[i]+=ci->books; + for(k=0;k<(1<class_subs[i]);k++){ + if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k]; + if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books; + } + } + + for(i=0;i<=maxbook;i++) + ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i]; + } + + /* for now, we're only using floor 1 */ + ci->floor_type[ci->floors]=1; + ci->floor_param[ci->floors]=f; + ci->floors++; + + return; +} + +static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s, + const vorbis_info_psy_global *in, + const double *x){ + int i,is=s; + double ds=s-is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy_global *g=&ci->psy_g_param; + + memcpy(g,in+(int)x[is],sizeof(*g)); + + ds=x[is]*(1.-ds)+x[is+1]*ds; + is=(int)ds; + ds-=is; + if(ds==0 && is>0){ + is--; + ds=1.; + } + + /* interpolate the trigger threshholds */ + for(i=0;i<4;i++){ + g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds; + g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds; + } + g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec; + return; +} + +static void vorbis_encode_global_stereo(vorbis_info *vi, + const highlevel_encode_setup *const hi, + const adj_stereo *p){ + float s=hi->stereo_point_setting; + int i,is=s; + double ds=s-is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy_global *g=&ci->psy_g_param; + + if(p){ + memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS); + memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS); + + if(hi->managed){ + /* interpolate the kHz threshholds */ + for(i=0;icoupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; + g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; + g->coupling_pkHz[i]=kHz; + + kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds; + g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; + g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; + + } + }else{ + float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds; + for(i=0;icoupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; + g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; + g->coupling_pkHz[i]=kHz; + } + + kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds; + for(i=0;isliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; + g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; + } + } + }else{ + for(i=0;isliding_lowpass[0][i]=ci->blocksizes[0]; + g->sliding_lowpass[1][i]=ci->blocksizes[1]; + } + } + return; +} + +static void vorbis_encode_psyset_setup(vorbis_info *vi,double s, + const int *nn_start, + const int *nn_partition, + const double *nn_thresh, + int block){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy *p=ci->psy_param[block]; + highlevel_encode_setup *hi=&ci->hi; + int is=s; + + if(block>=ci->psys) + ci->psys=block+1; + if(!p){ + p=(vorbis_info_psy*)_ogg_calloc(1,sizeof(*p)); + ci->psy_param[block]=p; + } + + memcpy(p,&_psy_info_template,sizeof(*p)); + p->blockflag=block>>1; + + if(hi->noise_normalize_p){ + p->normal_p=1; + p->normal_start=nn_start[is]; + p->normal_partition=nn_partition[is]; + p->normal_thresh=nn_thresh[is]; + } + + return; +} + +static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block, + const att3 *att, + const int *max, + const vp_adjblock *in){ + int i,is=s; + double ds=s-is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy *p=ci->psy_param[block]; + + /* 0 and 2 are only used by bitmanagement, but there's no harm to always + filling the values in here */ + p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds; + p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds; + p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds; + p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds; + p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds; + + p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds; + + for(i=0;itoneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds; + return; +} + + +static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block, + const compandblock *in, + const double *x){ + int i,is=s; + double ds=s-is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy *p=ci->psy_param[block]; + + ds=x[is]*(1.-ds)+x[is+1]*ds; + is=(int)ds; + ds-=is; + if(ds==0 && is>0){ + is--; + ds=1.; + } + + /* interpolate the compander settings */ + for(i=0;inoisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds; + return; +} + +static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block, + const int *suppress){ + int is=s; + double ds=s-is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy *p=ci->psy_param[block]; + + p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds; + + return; +} + +static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block, + const int *suppress, + const noise3 *in, + const noiseguard *guard, + double userbias){ + int i,is=s,j; + double ds=s-is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy *p=ci->psy_param[block]; + + p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds; + p->noisewindowlomin=guard[block].lo; + p->noisewindowhimin=guard[block].hi; + p->noisewindowfixed=guard[block].fixed; + + for(j=0;jnoiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds; + + /* impulse blocks may take a user specified bias to boost the + nominal/high noise encoding depth */ + for(j=0;jnoiseoff[j][0]+6; /* the lowest it can go */ + for(i=0;inoiseoff[j][i]+=userbias; + if(p->noiseoff[j][i]noiseoff[j][i]=min; + } + } + + return; +} + +static void vorbis_encode_ath_setup(vorbis_info *vi,int block){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + vorbis_info_psy *p=ci->psy_param[block]; + + p->ath_adjatt=ci->hi.ath_floating_dB; + p->ath_maxatt=ci->hi.ath_absolute_dB; + return; +} + + +static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){ + int i; + for(i=0;ibooks;i++) + if(ci->book_param[i]==book)return(i); + + return(ci->books++); +} + +static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s, + const int *shortb,const int *longb){ + + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int is=s; + + int blockshort=shortb[is]; + int blocklong=longb[is]; + ci->blocksizes[0]=blockshort; + ci->blocksizes[1]=blocklong; + +} + +static void vorbis_encode_residue_setup(vorbis_info *vi, + int number, int block, + const vorbis_residue_template *res){ + + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int i; + + vorbis_info_residue0 *r=(vorbis_info_residue0*)(ci->residue_param[number]= + (vorbis_info_residue0*)_ogg_malloc(sizeof(*r))); + + memcpy(r,res->res,sizeof(*r)); + if(ci->residues<=number)ci->residues=number+1; + + r->grouping=res->grouping; + ci->residue_type[number]=res->res_type; + + /* fill in all the books */ + { + int booklist=0,k; + + if(ci->hi.managed){ + for(i=0;ipartitions;i++) + for(k=0;k<4;k++) + if(res->books_base_managed->books[i][k]) + r->secondstages[i]|=(1<groupbook=book_dup_or_new(ci,res->book_aux_managed); + ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed; + + for(i=0;ipartitions;i++){ + for(k=0;k<4;k++){ + if(res->books_base_managed->books[i][k]){ + int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]); + r->booklist[booklist++]=bookid; + ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k]; + } + } + } + + }else{ + + for(i=0;ipartitions;i++) + for(k=0;k<4;k++) + if(res->books_base->books[i][k]) + r->secondstages[i]|=(1<groupbook=book_dup_or_new(ci,res->book_aux); + ci->book_param[r->groupbook]=(static_codebook *)res->book_aux; + + for(i=0;ipartitions;i++){ + for(k=0;k<4;k++){ + if(res->books_base->books[i][k]){ + int bookid=book_dup_or_new(ci,res->books_base->books[i][k]); + r->booklist[booklist++]=bookid; + ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k]; + } + } + } + } + } + + /* lowpass setup/pointlimit */ + { + double freq=ci->hi.lowpass_kHz*1000.; + vorbis_info_floor1 *f=(vorbis_info_floor1*)ci->floor_param[block]; /* by convention */ + double nyq=vi->rate/2.; + long blocksize=ci->blocksizes[block]>>1; + + /* lowpass needs to be set in the floor and the residue. */ + if(freq>nyq)freq=nyq; + /* in the floor, the granularity can be very fine; it doesn't alter + the encoding structure, only the samples used to fit the floor + approximation */ + f->n=freq/nyq*blocksize; + + /* this res may by limited by the maximum pointlimit of the mode, + not the lowpass. the floor is always lowpass limited. */ + switch(res->limit_type){ + case 1: /* point stereo limited */ + if(ci->hi.managed) + freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.; + else + freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.; + if(freq>nyq)freq=nyq; + break; + case 2: /* LFE channel; lowpass at ~ 250Hz */ + freq=250; + break; + default: + /* already set */ + break; + } + + /* in the residue, we're constrained, physically, by partition + boundaries. We still lowpass 'wherever', but we have to round up + here to next boundary, or the vorbis spec will round it *down* to + previous boundary in encode/decode */ + if(ci->residue_type[number]==2){ + /* residue 2 bundles together multiple channels; used by stereo + and surround. Count the channels in use */ + /* Multiple maps/submaps can point to the same residue. In the case + of residue 2, they all better have the same number of + channels/samples. */ + int j,k,ch=0; + for(i=0;imaps&&ch==0;i++){ + vorbis_info_mapping0 *mi=(vorbis_info_mapping0 *)ci->map_param[i]; + for(j=0;jsubmaps && ch==0;j++) + if(mi->residuesubmap[j]==number) /* we found a submap referencing theis residue backend */ + for(k=0;kchannels;k++) + if(mi->chmuxlist[k]==j) /* this channel belongs to the submap */ + ch++; + } + + r->end=(int)((freq/nyq*blocksize*ch)/r->grouping+.9)* /* round up only if we're well past */ + r->grouping; + /* the blocksize and grouping may disagree at the end */ + if(r->end>blocksize*ch)r->end=blocksize*ch/r->grouping*r->grouping; + + }else{ + + r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */ + r->grouping; + /* the blocksize and grouping may disagree at the end */ + if(r->end>blocksize)r->end=blocksize/r->grouping*r->grouping; + + } + + if(r->end==0)r->end=r->grouping; /* LFE channel */ + + } +} + +/* we assume two maps in this encoder */ +static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s, + const vorbis_mapping_template *maps){ + + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + int i,j,is=s,modes=2; + const vorbis_info_mapping0 *map=maps[is].map; + const vorbis_info_mode *mode=_mode_template; + const vorbis_residue_template *res=maps[is].res; + + if(ci->blocksizes[0]==ci->blocksizes[1])modes=1; + + for(i=0;imap_param[i]=_ogg_calloc(1,sizeof(*map)); + ci->mode_param[i]=(vorbis_info_mode*)_ogg_calloc(1,sizeof(*mode)); + + memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template)); + if(i>=ci->modes)ci->modes=i+1; + + ci->map_type[i]=0; + memcpy(ci->map_param[i],map+i,sizeof(*map)); + if(i>=ci->maps)ci->maps=i+1; + + for(j=0;jcodec_setup; + highlevel_encode_setup *hi=&ci->hi; + ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup; + int is=hi->base_setting; + double ds=hi->base_setting-is; + int ch=vi->channels; + const double *r=setup->rate_mapping; + + if(r==NULL) + return(-1); + + return((r[is]*(1.-ds)+r[is+1]*ds)*ch); +} + +static const void *get_setup_template(long ch,long srate, + double req,int q_or_bitrate, + double *base_setting){ + int i=0,j; + if(q_or_bitrate)req/=ch; + + while(setup_list[i]){ + if(setup_list[i]->coupling_restriction==-1 || + setup_list[i]->coupling_restriction==ch){ + if(srate>=setup_list[i]->samplerate_min_restriction && + srate<=setup_list[i]->samplerate_max_restriction){ + int mappings=setup_list[i]->mappings; + const double *map=(q_or_bitrate? + setup_list[i]->rate_mapping: + setup_list[i]->quality_mapping); + + /* the template matches. Does the requested quality mode + fall within this template's modes? */ + if(reqmap[setup_list[i]->mappings]){++i;continue;} + for(j=0;j=map[j] && reqcodec_setup; + ve_setup_data_template *setup=NULL; + highlevel_encode_setup *hi=&ci->hi; + + if(ci==NULL)return(OV_EINVAL); + if(!hi->impulse_block_p)i0=1; + + /* too low/high an ATH floater is nonsensical, but doesn't break anything */ + if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80; + if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200; + + /* again, bound this to avoid the app shooting itself int he foot + too badly */ + if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.; + if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.; + + /* get the appropriate setup template; matches the fetch in previous + stages */ + setup=(ve_setup_data_template *)hi->setup; + if(setup==NULL)return(OV_EINVAL); + + hi->set_in_stone=1; + /* choose block sizes from configured sizes as well as paying + attention to long_block_p and short_block_p. If the configured + short and long blocks are the same length, we set long_block_p + and unset short_block_p */ + vorbis_encode_blocksize_setup(vi,hi->base_setting, + setup->blocksize_short, + setup->blocksize_long); + if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1; + + /* floor setup; choose proper floor params. Allocated on the floor + stack in order; if we alloc only a single long floor, it's 0 */ + for(i=0;ifloor_mappings;i++) + vorbis_encode_floor_setup(vi,hi->base_setting, + setup->floor_books, + setup->floor_params, + setup->floor_mapping_list[i]); + + /* setup of [mostly] short block detection and stereo*/ + vorbis_encode_global_psych_setup(vi,hi->trigger_setting, + setup->global_params, + setup->global_mapping); + vorbis_encode_global_stereo(vi,hi,setup->stereo_modes); + + /* basic psych setup and noise normalization */ + vorbis_encode_psyset_setup(vi,hi->base_setting, + setup->psy_noise_normal_start[0], + setup->psy_noise_normal_partition[0], + setup->psy_noise_normal_thresh, + 0); + vorbis_encode_psyset_setup(vi,hi->base_setting, + setup->psy_noise_normal_start[0], + setup->psy_noise_normal_partition[0], + setup->psy_noise_normal_thresh, + 1); + if(!singleblock){ + vorbis_encode_psyset_setup(vi,hi->base_setting, + setup->psy_noise_normal_start[1], + setup->psy_noise_normal_partition[1], + setup->psy_noise_normal_thresh, + 2); + vorbis_encode_psyset_setup(vi,hi->base_setting, + setup->psy_noise_normal_start[1], + setup->psy_noise_normal_partition[1], + setup->psy_noise_normal_thresh, + 3); + } + + /* tone masking setup */ + vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0, + setup->psy_tone_masteratt, + setup->psy_tone_0dB, + setup->psy_tone_adj_impulse); + vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1, + setup->psy_tone_masteratt, + setup->psy_tone_0dB, + setup->psy_tone_adj_other); + if(!singleblock){ + vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2, + setup->psy_tone_masteratt, + setup->psy_tone_0dB, + setup->psy_tone_adj_other); + vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3, + setup->psy_tone_masteratt, + setup->psy_tone_0dB, + setup->psy_tone_adj_long); + } + + /* noise companding setup */ + vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0, + setup->psy_noise_compand, + setup->psy_noise_compand_short_mapping); + vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1, + setup->psy_noise_compand, + setup->psy_noise_compand_short_mapping); + if(!singleblock){ + vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2, + setup->psy_noise_compand, + setup->psy_noise_compand_long_mapping); + vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3, + setup->psy_noise_compand, + setup->psy_noise_compand_long_mapping); + } + + /* peak guarding setup */ + vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0, + setup->psy_tone_dBsuppress); + vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1, + setup->psy_tone_dBsuppress); + if(!singleblock){ + vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2, + setup->psy_tone_dBsuppress); + vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3, + setup->psy_tone_dBsuppress); + } + + /* noise bias setup */ + vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0, + setup->psy_noise_dBsuppress, + setup->psy_noise_bias_impulse, + setup->psy_noiseguards, + (i0==0?hi->impulse_noisetune:0.)); + vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1, + setup->psy_noise_dBsuppress, + setup->psy_noise_bias_padding, + setup->psy_noiseguards,0.); + if(!singleblock){ + vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2, + setup->psy_noise_dBsuppress, + setup->psy_noise_bias_trans, + setup->psy_noiseguards,0.); + vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3, + setup->psy_noise_dBsuppress, + setup->psy_noise_bias_long, + setup->psy_noiseguards,0.); + } + + vorbis_encode_ath_setup(vi,0); + vorbis_encode_ath_setup(vi,1); + if(!singleblock){ + vorbis_encode_ath_setup(vi,2); + vorbis_encode_ath_setup(vi,3); + } + + vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps); + + /* set bitrate readonlies and management */ + if(hi->bitrate_av>0) + vi->bitrate_nominal=hi->bitrate_av; + else{ + vi->bitrate_nominal=setting_to_approx_bitrate(vi); + } + + vi->bitrate_lower=hi->bitrate_min; + vi->bitrate_upper=hi->bitrate_max; + if(hi->bitrate_av) + vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av; + else + vi->bitrate_window=0.; + + if(hi->managed){ + ci->bi.avg_rate=hi->bitrate_av; + ci->bi.min_rate=hi->bitrate_min; + ci->bi.max_rate=hi->bitrate_max; + + ci->bi.reservoir_bits=hi->bitrate_reservoir; + ci->bi.reservoir_bias= + hi->bitrate_reservoir_bias; + + ci->bi.slew_damp=hi->bitrate_av_damp; + + } + + return(0); + +} + +static void vorbis_encode_setup_setting(vorbis_info *vi, + long channels, + long rate){ + int i,is; + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + highlevel_encode_setup *hi=&ci->hi; + const ve_setup_data_template *setup=(ve_setup_data_template*)hi->setup; + double ds; + + vi->version=0; + vi->channels=channels; + vi->rate=rate; + + hi->impulse_block_p=1; + hi->noise_normalize_p=1; + + is=hi->base_setting; + ds=hi->base_setting-is; + + hi->stereo_point_setting=hi->base_setting; + + if(!hi->lowpass_altered) + hi->lowpass_kHz= + setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds; + + hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+ + setup->psy_ath_float[is+1]*ds; + hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+ + setup->psy_ath_abs[is+1]*ds; + + hi->amplitude_track_dBpersec=-6.; + hi->trigger_setting=hi->base_setting; + + for(i=0;i<4;i++){ + hi->block[i].tone_mask_setting=hi->base_setting; + hi->block[i].tone_peaklimit_setting=hi->base_setting; + hi->block[i].noise_bias_setting=hi->base_setting; + hi->block[i].noise_compand_setting=hi->base_setting; + } +} + +int vorbis_encode_setup_vbr(vorbis_info *vi, + long channels, + long rate, + float quality){ + codec_setup_info *ci=(codec_setup_info*) vi->codec_setup; + highlevel_encode_setup *hi=&ci->hi; + + quality+=.0000001; + if(quality>=1.)quality=.9999; + + hi->req=quality; + hi->setup=get_setup_template(channels,rate,quality,0,&hi->base_setting); + if(!hi->setup)return OV_EIMPL; + + vorbis_encode_setup_setting(vi,channels,rate); + hi->managed=0; + hi->coupling_p=1; + + return 0; +} + +int vorbis_encode_init_vbr(vorbis_info *vi, + long channels, + long rate, + + float base_quality /* 0. to 1. */ + ){ + int ret=0; + + ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality); + + if(ret){ + vorbis_info_clear(vi); + return ret; + } + ret=vorbis_encode_setup_init(vi); + if(ret) + vorbis_info_clear(vi); + return(ret); +} + +int vorbis_encode_setup_managed(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate){ + + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + highlevel_encode_setup *hi=&ci->hi; + double tnominal=nominal_bitrate; + + if(nominal_bitrate<=0.){ + if(max_bitrate>0.){ + if(min_bitrate>0.) + nominal_bitrate=(max_bitrate+min_bitrate)*.5; + else + nominal_bitrate=max_bitrate*.875; + }else{ + if(min_bitrate>0.){ + nominal_bitrate=min_bitrate; + }else{ + return(OV_EINVAL); + } + } + } + + hi->req=nominal_bitrate; + hi->setup=get_setup_template(channels,rate,nominal_bitrate,1,&hi->base_setting); + if(!hi->setup)return OV_EIMPL; + + vorbis_encode_setup_setting(vi,channels,rate); + + /* initialize management with sane defaults */ + hi->coupling_p=1; + hi->managed=1; + hi->bitrate_min=min_bitrate; + hi->bitrate_max=max_bitrate; + hi->bitrate_av=tnominal; + hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */ + hi->bitrate_reservoir=nominal_bitrate*2; + hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */ + + return(0); + +} + +int vorbis_encode_init(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate){ + + int ret=vorbis_encode_setup_managed(vi,channels,rate, + max_bitrate, + nominal_bitrate, + min_bitrate); + if(ret){ + vorbis_info_clear(vi); + return(ret); + } + + ret=vorbis_encode_setup_init(vi); + if(ret) + vorbis_info_clear(vi); + return(ret); +} + +int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){ + if(vi){ + codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; + highlevel_encode_setup *hi=&ci->hi; + int setp=(number&0xf); /* a read request has a low nibble of 0 */ + + if(setp && hi->set_in_stone)return(OV_EINVAL); + + switch(number){ + + /* now deprecated *****************/ + case OV_ECTL_RATEMANAGE_GET: + { + + struct ovectl_ratemanage_arg *ai= + (struct ovectl_ratemanage_arg *)arg; + + ai->management_active=hi->managed; + ai->bitrate_hard_window=ai->bitrate_av_window= + (double)hi->bitrate_reservoir/vi->rate; + ai->bitrate_av_window_center=1.; + ai->bitrate_hard_min=hi->bitrate_min; + ai->bitrate_hard_max=hi->bitrate_max; + ai->bitrate_av_lo=hi->bitrate_av; + ai->bitrate_av_hi=hi->bitrate_av; + + } + return(0); + + /* now deprecated *****************/ + case OV_ECTL_RATEMANAGE_SET: + { + struct ovectl_ratemanage_arg *ai= + (struct ovectl_ratemanage_arg *)arg; + if(ai==NULL){ + hi->managed=0; + }else{ + hi->managed=ai->management_active; + vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg); + vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg); + } + } + return 0; + + /* now deprecated *****************/ + case OV_ECTL_RATEMANAGE_AVG: + { + struct ovectl_ratemanage_arg *ai= + (struct ovectl_ratemanage_arg *)arg; + if(ai==NULL){ + hi->bitrate_av=0; + }else{ + hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5; + } + } + return(0); + /* now deprecated *****************/ + case OV_ECTL_RATEMANAGE_HARD: + { + struct ovectl_ratemanage_arg *ai= + (struct ovectl_ratemanage_arg *)arg; + if(ai==NULL){ + hi->bitrate_min=0; + hi->bitrate_max=0; + }else{ + hi->bitrate_min=ai->bitrate_hard_min; + hi->bitrate_max=ai->bitrate_hard_max; + hi->bitrate_reservoir=ai->bitrate_hard_window* + (hi->bitrate_max+hi->bitrate_min)*.5; + } + if(hi->bitrate_reservoir<128.) + hi->bitrate_reservoir=128.; + } + return(0); + + /* replacement ratemanage interface */ + case OV_ECTL_RATEMANAGE2_GET: + { + struct ovectl_ratemanage2_arg *ai= + (struct ovectl_ratemanage2_arg *)arg; + if(ai==NULL)return OV_EINVAL; + + ai->management_active=hi->managed; + ai->bitrate_limit_min_kbps=hi->bitrate_min/1000; + ai->bitrate_limit_max_kbps=hi->bitrate_max/1000; + ai->bitrate_average_kbps=hi->bitrate_av/1000; + ai->bitrate_average_damping=hi->bitrate_av_damp; + ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir; + ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias; + } + return (0); + case OV_ECTL_RATEMANAGE2_SET: + { + struct ovectl_ratemanage2_arg *ai= + (struct ovectl_ratemanage2_arg *)arg; + if(ai==NULL){ + hi->managed=0; + }else{ + /* sanity check; only catch invariant violations */ + if(ai->bitrate_limit_min_kbps>0 && + ai->bitrate_average_kbps>0 && + ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps) + return OV_EINVAL; + + if(ai->bitrate_limit_max_kbps>0 && + ai->bitrate_average_kbps>0 && + ai->bitrate_limit_max_kbpsbitrate_average_kbps) + return OV_EINVAL; + + if(ai->bitrate_limit_min_kbps>0 && + ai->bitrate_limit_max_kbps>0 && + ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps) + return OV_EINVAL; + + if(ai->bitrate_average_damping <= 0.) + return OV_EINVAL; + + if(ai->bitrate_limit_reservoir_bits < 0) + return OV_EINVAL; + + if(ai->bitrate_limit_reservoir_bias < 0.) + return OV_EINVAL; + + if(ai->bitrate_limit_reservoir_bias > 1.) + return OV_EINVAL; + + hi->managed=ai->management_active; + hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000; + hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000; + hi->bitrate_av=ai->bitrate_average_kbps * 1000; + hi->bitrate_av_damp=ai->bitrate_average_damping; + hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits; + hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias; + } + } + return 0; + + case OV_ECTL_LOWPASS_GET: + { + double *farg=(double *)arg; + *farg=hi->lowpass_kHz; + } + return(0); + case OV_ECTL_LOWPASS_SET: + { + double *farg=(double *)arg; + hi->lowpass_kHz=*farg; + + if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.; + if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.; + hi->lowpass_altered=1; + } + return(0); + case OV_ECTL_IBLOCK_GET: + { + double *farg=(double *)arg; + *farg=hi->impulse_noisetune; + } + return(0); + case OV_ECTL_IBLOCK_SET: + { + double *farg=(double *)arg; + hi->impulse_noisetune=*farg; + + if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.; + if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.; + } + return(0); + case OV_ECTL_COUPLING_GET: + { + int *iarg=(int *)arg; + *iarg=hi->coupling_p; + } + return(0); + case OV_ECTL_COUPLING_SET: + { + const void *new_template; + double new_base=0.; + int *iarg=(int *)arg; + hi->coupling_p=((*iarg)!=0); + + /* Fetching a new template can alter the base_setting, which + many other parameters are based on. Right now, the only + parameter drawn from the base_setting that can be altered + by an encctl is the lowpass, so that is explictly flagged + to not be overwritten when we fetch a new template and + recompute the dependant settings */ + new_template = get_setup_template(hi->coupling_p?vi->channels:-1, + vi->rate, + hi->req, + hi->managed, + &new_base); + if(!hi->setup)return OV_EIMPL; + hi->setup=new_template; + hi->base_setting=new_base; + vorbis_encode_setup_setting(vi,vi->channels,vi->rate); + } + return(0); + } + return(OV_EIMPL); + } + return(OV_EINVAL); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c new file mode 100644 index 0000000000..79b668855c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c @@ -0,0 +1,2338 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + last mod: $Id: vorbisfile.c 17573 2010-10-27 14:53:59Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include +#include +#include + +#include "../../codec.h" +#include "../../vorbisfile.h" + +#include "os.h" +#include "misc.h" + +/* A 'chained bitstream' is a Vorbis bitstream that contains more than + one logical bitstream arranged end to end (the only form of Ogg + multiplexing allowed in a Vorbis bitstream; grouping [parallel + multiplexing] is not allowed in Vorbis) */ + +/* A Vorbis file can be played beginning to end (streamed) without + worrying ahead of time about chaining (see decoder_example.c). If + we have the whole file, however, and want random access + (seeking/scrubbing) or desire to know the total length/time of a + file, we need to account for the possibility of chaining. */ + +/* We can handle things a number of ways; we can determine the entire + bitstream structure right off the bat, or find pieces on demand. + This example determines and caches structure for the entire + bitstream, but builds a virtual decoder on the fly when moving + between links in the chain. */ + +/* There are also different ways to implement seeking. Enough + information exists in an Ogg bitstream to seek to + sample-granularity positions in the output. Or, one can seek by + picking some portion of the stream roughly in the desired area if + we only want coarse navigation through the stream. */ + +/************************************************************************* + * Many, many internal helpers. The intention is not to be confusing; + * rampant duplication and monolithic function implementation would be + * harder to understand anyway. The high level functions are last. Begin + * grokking near the end of the file */ + +/* read a little more data from the file/pipe into the ogg_sync framer +*/ +#define CHUNKSIZE 65536 /* greater-than-page-size granularity seeking */ +#define READSIZE 2048 /* a smaller read size is needed for low-rate streaming. */ + +static long _get_data(OggVorbis_File *vf){ + errno=0; + if(!(vf->callbacks.read_func))return(-1); + if(vf->datasource){ + char *buffer=ogg_sync_buffer(&vf->oy,READSIZE); + long bytes=(vf->callbacks.read_func)(buffer,1,READSIZE,vf->datasource); + if(bytes>0)ogg_sync_wrote(&vf->oy,bytes); + if(bytes==0 && errno)return(-1); + return(bytes); + }else + return(0); +} + +/* save a tiny smidge of verbosity to make the code more readable */ +static int _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){ + if(vf->datasource){ + if(!(vf->callbacks.seek_func)|| + (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET) == -1) + return OV_EREAD; + vf->offset=offset; + ogg_sync_reset(&vf->oy); + }else{ + /* shouldn't happen unless someone writes a broken callback */ + return OV_EFAULT; + } + return 0; +} + +/* The read/seek functions track absolute position within the stream */ + +/* from the head of the stream, get the next page. boundary specifies + if the function is allowed to fetch more data from the stream (and + how much) or only use internally buffered data. + + boundary: -1) unbounded search + 0) read no additional data; use cached only + n) search for a new page beginning for n bytes + + return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD) + n) found a page at absolute offset n */ + +static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og, + ogg_int64_t boundary){ + if(boundary>0)boundary+=vf->offset; + while(1){ + long more; + + if(boundary>0 && vf->offset>=boundary)return(OV_FALSE); + more=ogg_sync_pageseek(&vf->oy,og); + + if(more<0){ + /* skipped n bytes */ + vf->offset-=more; + }else{ + if(more==0){ + /* send more paramedics */ + if(!boundary)return(OV_FALSE); + { + long ret=_get_data(vf); + if(ret==0)return(OV_EOF); + if(ret<0)return(OV_EREAD); + } + }else{ + /* got a page. Return the offset at the page beginning, + advance the internal offset past the page end */ + ogg_int64_t ret=vf->offset; + vf->offset+=more; + return(ret); + + } + } + } +} + +/* find the latest page beginning before the current stream cursor + position. Much dirtier than the above as Ogg doesn't have any + backward search linkage. no 'readp' as it will certainly have to + read. */ +/* returns offset or OV_EREAD, OV_FAULT */ +static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){ + ogg_int64_t begin=vf->offset; + ogg_int64_t end=begin; + ogg_int64_t ret; + ogg_int64_t offset=-1; + + while(offset==-1){ + begin-=CHUNKSIZE; + if(begin<0) + begin=0; + + ret=_seek_helper(vf,begin); + if(ret)return(ret); + + while(vf->offsetoffset); + if(ret==OV_EREAD)return(OV_EREAD); + if(ret<0){ + break; + }else{ + offset=ret; + } + } + } + + /* In a fully compliant, non-multiplexed stream, we'll still be + holding the last page. In multiplexed (or noncompliant streams), + we will probably have to re-read the last page we saw */ + if(og->header_len==0){ + ret=_seek_helper(vf,offset); + if(ret)return(ret); + + ret=_get_next_page(vf,og,CHUNKSIZE); + if(ret<0) + /* this shouldn't be possible */ + return(OV_EFAULT); + } + + return(offset); +} + +static void _add_serialno(ogg_page *og,long **serialno_list, int *n){ + long s = ogg_page_serialno(og); + (*n)++; + + if(*serialno_list){ + *serialno_list = (long*)_ogg_realloc(*serialno_list, sizeof(**serialno_list)*(*n)); + }else{ + *serialno_list = (long*)_ogg_malloc(sizeof(**serialno_list)); + } + + (*serialno_list)[(*n)-1] = s; +} + +/* returns nonzero if found */ +static int _lookup_serialno(long s, long *serialno_list, int n){ + if(serialno_list){ + while(n--){ + if(*serialno_list == s) return 1; + serialno_list++; + } + } + return 0; +} + +static int _lookup_page_serialno(ogg_page *og, long *serialno_list, int n){ + long s = ogg_page_serialno(og); + return _lookup_serialno(s,serialno_list,n); +} + +/* performs the same search as _get_prev_page, but prefers pages of + the specified serial number. If a page of the specified serialno is + spotted during the seek-back-and-read-forward, it will return the + info of last page of the matching serial number instead of the very + last page. If no page of the specified serialno is seen, it will + return the info of last page and alter *serialno. */ +static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, + long *serial_list, int serial_n, + int *serialno, ogg_int64_t *granpos){ + ogg_page og; + ogg_int64_t begin=vf->offset; + ogg_int64_t end=begin; + ogg_int64_t ret; + + ogg_int64_t prefoffset=-1; + ogg_int64_t offset=-1; + ogg_int64_t ret_serialno=-1; + ogg_int64_t ret_gran=-1; + + while(offset==-1){ + begin-=CHUNKSIZE; + if(begin<0) + begin=0; + + ret=_seek_helper(vf,begin); + if(ret)return(ret); + + while(vf->offsetoffset); + if(ret==OV_EREAD)return(OV_EREAD); + if(ret<0){ + break; + }else{ + ret_serialno=ogg_page_serialno(&og); + ret_gran=ogg_page_granulepos(&og); + offset=ret; + + if(ret_serialno == *serialno){ + prefoffset=ret; + *granpos=ret_gran; + } + + if(!_lookup_serialno(ret_serialno,serial_list,serial_n)){ + /* we fell off the end of the link, which means we seeked + back too far and shouldn't have been looking in that link + to begin with. If we found the preferred serial number, + forget that we saw it. */ + prefoffset=-1; + } + } + } + } + + /* we're not interested in the page... just the serialno and granpos. */ + if(prefoffset>=0)return(prefoffset); + + *serialno = ret_serialno; + *granpos = ret_gran; + return(offset); + +} + +/* uses the local ogg_stream storage in vf; this is important for + non-streaming input sources */ +static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc, + long **serialno_list, int *serialno_n, + ogg_page *og_ptr){ + ogg_page og; + ogg_packet op; + int i,ret; + int allbos=0; + + if(!og_ptr){ + ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE); + if(llret==OV_EREAD)return(OV_EREAD); + if(llret<0)return(OV_ENOTVORBIS); + og_ptr=&og; + } + + vorbis_info_init(vi); + vorbis_comment_init(vc); + vf->ready_state=OPENED; + + /* extract the serialnos of all BOS pages + the first set of vorbis + headers we see in the link */ + + while(ogg_page_bos(og_ptr)){ + if(serialno_list){ + if(_lookup_page_serialno(og_ptr,*serialno_list,*serialno_n)){ + /* a dupe serialnumber in an initial header packet set == invalid stream */ + if(*serialno_list)_ogg_free(*serialno_list); + *serialno_list=0; + *serialno_n=0; + ret=OV_EBADHEADER; + goto bail_header; + } + + _add_serialno(og_ptr,serialno_list,serialno_n); + } + + if(vf->ready_stateos,ogg_page_serialno(og_ptr)); + ogg_stream_pagein(&vf->os,og_ptr); + + if(ogg_stream_packetout(&vf->os,&op) > 0 && + vorbis_synthesis_idheader(&op)){ + /* vorbis header; continue setup */ + vf->ready_state=STREAMSET; + if((ret=vorbis_synthesis_headerin(vi,vc,&op))){ + ret=OV_EBADHEADER; + goto bail_header; + } + } + } + + /* get next page */ + { + ogg_int64_t llret=_get_next_page(vf,og_ptr,CHUNKSIZE); + if(llret==OV_EREAD){ + ret=OV_EREAD; + goto bail_header; + } + if(llret<0){ + ret=OV_ENOTVORBIS; + goto bail_header; + } + + /* if this page also belongs to our vorbis stream, submit it and break */ + if(vf->ready_state==STREAMSET && + vf->os.serialno == ogg_page_serialno(og_ptr)){ + ogg_stream_pagein(&vf->os,og_ptr); + break; + } + } + } + + if(vf->ready_state!=STREAMSET){ + ret = OV_ENOTVORBIS; + goto bail_header; + } + + while(1){ + + i=0; + while(i<2){ /* get a page loop */ + + while(i<2){ /* get a packet loop */ + + int result=ogg_stream_packetout(&vf->os,&op); + if(result==0)break; + if(result==-1){ + ret=OV_EBADHEADER; + goto bail_header; + } + + if((ret=vorbis_synthesis_headerin(vi,vc,&op))) + goto bail_header; + + i++; + } + + while(i<2){ + if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){ + ret=OV_EBADHEADER; + goto bail_header; + } + + /* if this page belongs to the correct stream, go parse it */ + if(vf->os.serialno == ogg_page_serialno(og_ptr)){ + ogg_stream_pagein(&vf->os,og_ptr); + break; + } + + /* if we never see the final vorbis headers before the link + ends, abort */ + if(ogg_page_bos(og_ptr)){ + if(allbos){ + ret = OV_EBADHEADER; + goto bail_header; + }else + allbos=1; + } + + /* otherwise, keep looking */ + } + } + + return 0; + } + + bail_header: + vorbis_info_clear(vi); + vorbis_comment_clear(vc); + vf->ready_state=OPENED; + + return ret; +} + +/* Starting from current cursor position, get initial PCM offset of + next page. Consumes the page in the process without decoding + audio, however this is only called during stream parsing upon + seekable open. */ +static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi){ + ogg_page og; + ogg_int64_t accumulated=0; + long lastblock=-1; + int result; + int serialno = vf->os.serialno; + + while(1){ + ogg_packet op; + if(_get_next_page(vf,&og,-1)<0) + break; /* should not be possible unless the file is truncated/mangled */ + + if(ogg_page_bos(&og)) break; + if(ogg_page_serialno(&og)!=serialno) continue; + + /* count blocksizes of all frames in the page */ + ogg_stream_pagein(&vf->os,&og); + while((result=ogg_stream_packetout(&vf->os,&op))){ + if(result>0){ /* ignore holes */ + long thisblock=vorbis_packet_blocksize(vi,&op); + if(lastblock!=-1) + accumulated+=(lastblock+thisblock)>>2; + lastblock=thisblock; + } + } + + if(ogg_page_granulepos(&og)!=-1){ + /* pcm offset of last packet on the first audio page */ + accumulated= ogg_page_granulepos(&og)-accumulated; + break; + } + } + + /* less than zero? Either a corrupt file or a stream with samples + trimmed off the beginning, a normal occurrence; in both cases set + the offset to zero */ + if(accumulated<0)accumulated=0; + + return accumulated; +} + +/* finds each bitstream link one at a time using a bisection search + (has to begin by knowing the offset of the lb's initial page). + Recurses for each link so it can alloc the link storage after + finding them all, then unroll and fill the cache at the same time */ +static int _bisect_forward_serialno(OggVorbis_File *vf, + ogg_int64_t begin, + ogg_int64_t searched, + ogg_int64_t end, + ogg_int64_t endgran, + int endserial, + long *currentno_list, + int currentnos, + long m){ + ogg_int64_t pcmoffset; + ogg_int64_t dataoffset=searched; + ogg_int64_t endsearched=end; + ogg_int64_t next=end; + ogg_int64_t searchgran=-1; + ogg_page og; + ogg_int64_t ret,last; + int serialno = vf->os.serialno; + + /* invariants: + we have the headers and serialnos for the link beginning at 'begin' + we have the offset and granpos of the last page in the file (potentially + not a page we care about) + */ + + /* Is the last page in our list of current serialnumbers? */ + if(_lookup_serialno(endserial,currentno_list,currentnos)){ + + /* last page is in the starting serialno list, so we've bisected + down to (or just started with) a single link. Now we need to + find the last vorbis page belonging to the first vorbis stream + for this link. */ + + while(endserial != serialno){ + endserial = serialno; + vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&endserial,&endgran); + } + + vf->links=m+1; + if(vf->offsets)_ogg_free(vf->offsets); + if(vf->serialnos)_ogg_free(vf->serialnos); + if(vf->dataoffsets)_ogg_free(vf->dataoffsets); + + vf->offsets=(ogg_int64_t*)_ogg_malloc((vf->links+1)*sizeof(*vf->offsets)); + vf->vi=(vorbis_info*)_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi)); + vf->vc=(vorbis_comment*)_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc)); + vf->serialnos=(long*)_ogg_malloc(vf->links*sizeof(*vf->serialnos)); + vf->dataoffsets=(ogg_int64_t*)_ogg_malloc(vf->links*sizeof(*vf->dataoffsets)); + vf->pcmlengths=(ogg_int64_t*)_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths)); + + vf->offsets[m+1]=end; + vf->offsets[m]=begin; + vf->pcmlengths[m*2+1]=(endgran<0?0:endgran); + + }else{ + + long *next_serialno_list=NULL; + int next_serialnos=0; + vorbis_info vi; + vorbis_comment vc; + + /* the below guards against garbage seperating the last and + first pages of two links. */ + while(searchedoffset){ + ret=_seek_helper(vf,bisect); + if(ret)return(ret); + } + + last=_get_next_page(vf,&og,-1); + if(last==OV_EREAD)return(OV_EREAD); + if(last<0 || !_lookup_page_serialno(&og,currentno_list,currentnos)){ + endsearched=bisect; + if(last>=0)next=last; + }else{ + searched=vf->offset; + } + } + + /* Bisection point found */ + + /* for the time being, fetch end PCM offset the simple way */ + { + int testserial = serialno+1; + vf->offset = next; + while(testserial != serialno){ + testserial = serialno; + vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&testserial,&searchgran); + } + } + + if(vf->offset!=next){ + ret=_seek_helper(vf,next); + if(ret)return(ret); + } + + ret=_fetch_headers(vf,&vi,&vc,&next_serialno_list,&next_serialnos,NULL); + if(ret)return(ret); + serialno = vf->os.serialno; + dataoffset = vf->offset; + + /* this will consume a page, however the next bistection always + starts with a raw seek */ + pcmoffset = _initial_pcmoffset(vf,&vi); + + ret=_bisect_forward_serialno(vf,next,vf->offset,end,endgran,endserial, + next_serialno_list,next_serialnos,m+1); + if(ret)return(ret); + + if(next_serialno_list)_ogg_free(next_serialno_list); + + vf->offsets[m+1]=next; + vf->serialnos[m+1]=serialno; + vf->dataoffsets[m+1]=dataoffset; + + vf->vi[m+1]=vi; + vf->vc[m+1]=vc; + + vf->pcmlengths[m*2+1]=searchgran; + vf->pcmlengths[m*2+2]=pcmoffset; + vf->pcmlengths[m*2+3]-=pcmoffset; + if(vf->pcmlengths[m*2+3]<0)vf->pcmlengths[m*2+3]=0; + } + return(0); +} + +static int _make_decode_ready(OggVorbis_File *vf){ + if(vf->ready_state>STREAMSET)return 0; + if(vf->ready_stateseekable){ + if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link)) + return OV_EBADLINK; + }else{ + if(vorbis_synthesis_init(&vf->vd,vf->vi)) + return OV_EBADLINK; + } + vorbis_block_init(&vf->vd,&vf->vb); + vf->ready_state=INITSET; + vf->bittrack=0.f; + vf->samptrack=0.f; + return 0; +} + +static int _open_seekable2(OggVorbis_File *vf){ + ogg_int64_t dataoffset=vf->dataoffsets[0],end,endgran=-1; + int endserial=vf->os.serialno; + int serialno=vf->os.serialno; + + /* we're partially open and have a first link header state in + storage in vf */ + + /* fetch initial PCM offset */ + ogg_int64_t pcmoffset = _initial_pcmoffset(vf,vf->vi); + + /* we can seek, so set out learning all about this file */ + if(vf->callbacks.seek_func && vf->callbacks.tell_func){ + (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END); + vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource); + }else{ + vf->offset=vf->end=-1; + } + + /* If seek_func is implemented, tell_func must also be implemented */ + if(vf->end==-1) return(OV_EINVAL); + + /* Get the offset of the last page of the physical bitstream, or, if + we're lucky the last vorbis page of this link as most OggVorbis + files will contain a single logical bitstream */ + end=_get_prev_page_serial(vf,vf->serialnos+2,vf->serialnos[1],&endserial,&endgran); + if(end<0)return(end); + + /* now determine bitstream structure recursively */ + if(_bisect_forward_serialno(vf,0,dataoffset,vf->offset,endgran,endserial, + vf->serialnos+2,vf->serialnos[1],0)<0)return(OV_EREAD); + + vf->offsets[0]=0; + vf->serialnos[0]=serialno; + vf->dataoffsets[0]=dataoffset; + vf->pcmlengths[0]=pcmoffset; + vf->pcmlengths[1]-=pcmoffset; + if(vf->pcmlengths[1]<0)vf->pcmlengths[1]=0; + + return(ov_raw_seek(vf,dataoffset)); +} + +/* clear out the current logical bitstream decoder */ +static void _decode_clear(OggVorbis_File *vf){ + vorbis_dsp_clear(&vf->vd); + vorbis_block_clear(&vf->vb); + vf->ready_state=OPENED; +} + +/* fetch and process a packet. Handles the case where we're at a + bitstream boundary and dumps the decoding machine. If the decoding + machine is unloaded, it loads it. It also keeps pcm_offset up to + date (seek and read both use this. seek uses a special hack with + readp). + + return: <0) error, OV_HOLE (lost packet) or OV_EOF + 0) need more data (only if readp==0) + 1) got a packet +*/ + +static int _fetch_and_process_packet(OggVorbis_File *vf, + ogg_packet *op_in, + int readp, + int spanp){ + ogg_page og; + + /* handle one packet. Try to fetch it from current stream state */ + /* extract packets from page */ + while(1){ + + if(vf->ready_state==STREAMSET){ + int ret=_make_decode_ready(vf); + if(ret<0)return ret; + } + + /* process a packet if we can. */ + + if(vf->ready_state==INITSET){ + int hs=vorbis_synthesis_halfrate_p(vf->vi); + + while(1) { + ogg_packet op; + ogg_packet *op_ptr=(op_in?op_in:&op); + int result=ogg_stream_packetout(&vf->os,op_ptr); + ogg_int64_t granulepos; + + op_in=NULL; + if(result==-1)return(OV_HOLE); /* hole in the data. */ + if(result>0){ + /* got a packet. process it */ + granulepos=op_ptr->granulepos; + if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy + header handling. The + header packets aren't + audio, so if/when we + submit them, + vorbis_synthesis will + reject them */ + + /* suck in the synthesis data and track bitrate */ + { + int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL); + /* for proper use of libvorbis within libvorbisfile, + oldsamples will always be zero. */ + if(oldsamples)return(OV_EFAULT); + + vorbis_synthesis_blockin(&vf->vd,&vf->vb); + vf->samptrack+=(vorbis_synthesis_pcmout(&vf->vd,NULL)<bittrack+=op_ptr->bytes*8; + } + + /* update the pcm offset. */ + if(granulepos!=-1 && !op_ptr->e_o_s){ + int link=(vf->seekable?vf->current_link:0); + int i,samples; + + /* this packet has a pcm_offset on it (the last packet + completed on a page carries the offset) After processing + (above), we know the pcm position of the *last* sample + ready to be returned. Find the offset of the *first* + + As an aside, this trick is inaccurate if we begin + reading anew right at the last page; the end-of-stream + granulepos declares the last frame in the stream, and the + last packet of the last page may be a partial frame. + So, we need a previous granulepos from an in-sequence page + to have a reference point. Thus the !op_ptr->e_o_s clause + above */ + + if(vf->seekable && link>0) + granulepos-=vf->pcmlengths[link*2]; + if(granulepos<0)granulepos=0; /* actually, this + shouldn't be possible + here unless the stream + is very broken */ + + samples=(vorbis_synthesis_pcmout(&vf->vd,NULL)<pcmlengths[i*2+1]; + vf->pcm_offset=granulepos; + } + return(1); + } + } + else + break; + } + } + + if(vf->ready_state>=OPENED){ + ogg_int64_t ret; + + while(1){ + /* the loop is not strictly necessary, but there's no sense in + doing the extra checks of the larger loop for the common + case in a multiplexed bistream where the page is simply + part of a different logical bitstream; keep reading until + we get one with the correct serialno */ + + if(!readp)return(0); + if((ret=_get_next_page(vf,&og,-1))<0){ + return(OV_EOF); /* eof. leave unitialized */ + } + + /* bitrate tracking; add the header's bytes here, the body bytes + are done by packet above */ + vf->bittrack+=og.header_len*8; + + if(vf->ready_state==INITSET){ + if(vf->current_serialno!=ogg_page_serialno(&og)){ + + /* two possibilities: + 1) our decoding just traversed a bitstream boundary + 2) another stream is multiplexed into this logical section */ + + if(ogg_page_bos(&og)){ + /* boundary case */ + if(!spanp) + return(OV_EOF); + + _decode_clear(vf); + + if(!vf->seekable){ + vorbis_info_clear(vf->vi); + vorbis_comment_clear(vf->vc); + } + break; + + }else + continue; /* possibility #2 */ + } + } + + break; + } + } + + /* Do we need to load a new machine before submitting the page? */ + /* This is different in the seekable and non-seekable cases. + + In the seekable case, we already have all the header + information loaded and cached; we just initialize the machine + with it and continue on our merry way. + + In the non-seekable (streaming) case, we'll only be at a + boundary if we just left the previous logical bitstream and + we're now nominally at the header of the next bitstream + */ + + if(vf->ready_state!=INITSET){ + int link; + + if(vf->ready_stateseekable){ + long serialno = ogg_page_serialno(&og); + + /* match the serialno to bitstream section. We use this rather than + offset positions to avoid problems near logical bitstream + boundaries */ + + for(link=0;linklinks;link++) + if(vf->serialnos[link]==serialno)break; + + if(link==vf->links) continue; /* not the desired Vorbis + bitstream section; keep + trying */ + + vf->current_serialno=serialno; + vf->current_link=link; + + ogg_stream_reset_serialno(&vf->os,vf->current_serialno); + vf->ready_state=STREAMSET; + + }else{ + /* we're streaming */ + /* fetch the three header packets, build the info struct */ + + int ret=_fetch_headers(vf,vf->vi,vf->vc,NULL,NULL,&og); + if(ret)return(ret); + vf->current_serialno=vf->os.serialno; + vf->current_link++; + //link=0; + } + } + } + + /* the buffered page is the data we want, and we're ready for it; + add it to the stream state */ + ogg_stream_pagein(&vf->os,&og); + + } +} + +/* if, eg, 64 bit stdio is configured by default, this will build with + fseek64 */ +static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){ + if(f==NULL)return(-1); + return fseek(f,off,whence); +} + +static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial, + long ibytes, ov_callbacks callbacks){ + int offsettest=((f && callbacks.seek_func)?callbacks.seek_func(f,0,SEEK_CUR):-1); + long *serialno_list=NULL; + int serialno_list_size=0; + int ret; + + memset(vf,0,sizeof(*vf)); + vf->datasource=f; + vf->callbacks = callbacks; + + /* init the framing state */ + ogg_sync_init(&vf->oy); + + /* perhaps some data was previously read into a buffer for testing + against other stream types. Allow initialization from this + previously read data (especially as we may be reading from a + non-seekable stream) */ + if(initial){ + char *buffer=ogg_sync_buffer(&vf->oy,ibytes); + memcpy(buffer,initial,ibytes); + ogg_sync_wrote(&vf->oy,ibytes); + } + + /* can we seek? Stevens suggests the seek test was portable */ + if(offsettest!=-1)vf->seekable=1; + + /* No seeking yet; Set up a 'single' (current) logical bitstream + entry for partial open */ + vf->links=1; + vf->vi=(vorbis_info*) _ogg_calloc(vf->links,sizeof(*vf->vi)); + vf->vc=(vorbis_comment*) _ogg_calloc(vf->links,sizeof(*vf->vc)); + ogg_stream_init(&vf->os,-1); /* fill in the serialno later */ + + /* Fetch all BOS pages, store the vorbis header and all seen serial + numbers, load subsequent vorbis setup headers */ + if((ret=_fetch_headers(vf,vf->vi,vf->vc,&serialno_list,&serialno_list_size,NULL))<0){ + vf->datasource=NULL; + ov_clear(vf); + }else{ + /* serial number list for first link needs to be held somewhere + for second stage of seekable stream open; this saves having to + seek/reread first link's serialnumber data then. */ + vf->serialnos=(long*)_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos)); + vf->serialnos[0]=vf->current_serialno=vf->os.serialno; + vf->serialnos[1]=serialno_list_size; + memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos)); + + vf->offsets=(ogg_int64_t*)_ogg_calloc(1,sizeof(*vf->offsets)); + vf->dataoffsets=(ogg_int64_t*)_ogg_calloc(1,sizeof(*vf->dataoffsets)); + vf->offsets[0]=0; + vf->dataoffsets[0]=vf->offset; + + vf->ready_state=PARTOPEN; + } + if(serialno_list)_ogg_free(serialno_list); + return(ret); +} + +static int _ov_open2(OggVorbis_File *vf){ + if(vf->ready_state != PARTOPEN) return OV_EINVAL; + vf->ready_state=OPENED; + if(vf->seekable){ + int ret=_open_seekable2(vf); + if(ret){ + vf->datasource=NULL; + ov_clear(vf); + } + return(ret); + }else + vf->ready_state=STREAMSET; + + return 0; +} + + +/* clear out the OggVorbis_File struct */ +int ov_clear(OggVorbis_File *vf){ + if(vf){ + vorbis_block_clear(&vf->vb); + vorbis_dsp_clear(&vf->vd); + ogg_stream_clear(&vf->os); + + if(vf->vi && vf->links){ + int i; + for(i=0;ilinks;i++){ + vorbis_info_clear(vf->vi+i); + vorbis_comment_clear(vf->vc+i); + } + _ogg_free(vf->vi); + _ogg_free(vf->vc); + } + if(vf->dataoffsets)_ogg_free(vf->dataoffsets); + if(vf->pcmlengths)_ogg_free(vf->pcmlengths); + if(vf->serialnos)_ogg_free(vf->serialnos); + if(vf->offsets)_ogg_free(vf->offsets); + ogg_sync_clear(&vf->oy); + if(vf->datasource && vf->callbacks.close_func) + (vf->callbacks.close_func)(vf->datasource); + memset(vf,0,sizeof(*vf)); + } +#ifdef DEBUG_LEAKS + _VDBG_dump(); +#endif + return(0); +} + +/* inspects the OggVorbis file and finds/documents all the logical + bitstreams contained in it. Tries to be tolerant of logical + bitstream sections that are truncated/woogie. + + return: -1) error + 0) OK +*/ + +int ov_open_callbacks(void *f,OggVorbis_File *vf, + const char *initial,long ibytes,ov_callbacks callbacks){ + int ret=_ov_open1(f,vf,initial,ibytes,callbacks); + if(ret)return ret; + return _ov_open2(vf); +} + +int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ + ov_callbacks callbacks = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell + }; + + return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks); +} + +int ov_fopen(const char *path,OggVorbis_File *vf){ + int ret; + FILE *f = fopen(path,"rb"); + if(!f) return -1; + + ret = ov_open(f,vf,NULL,0); + if(ret) fclose(f); + return ret; +} + + +/* cheap hack for game usage where downsampling is desirable; there's + no need for SRC as we can just do it cheaply in libvorbis. */ + +int ov_halfrate(OggVorbis_File *vf,int flag){ + int i; + if(vf->vi==NULL)return OV_EINVAL; + if(vf->ready_state>STREAMSET){ + /* clear out stream state; dumping the decode machine is needed to + reinit the MDCT lookups. */ + vorbis_dsp_clear(&vf->vd); + vorbis_block_clear(&vf->vb); + vf->ready_state=STREAMSET; + if(vf->pcm_offset>=0){ + ogg_int64_t pos=vf->pcm_offset; + vf->pcm_offset=-1; /* make sure the pos is dumped if unseekable */ + ov_pcm_seek(vf,pos); + } + } + + for(i=0;ilinks;i++){ + if(vorbis_synthesis_halfrate(vf->vi+i,flag)){ + if(flag) ov_halfrate(vf,0); + return OV_EINVAL; + } + } + return 0; +} + +int ov_halfrate_p(OggVorbis_File *vf){ + if(vf->vi==NULL)return OV_EINVAL; + return vorbis_synthesis_halfrate_p(vf->vi); +} + +/* Only partially open the vorbis file; test for Vorbisness, and load + the headers for the first chain. Do not seek (although test for + seekability). Use ov_test_open to finish opening the file, else + ov_clear to close/free it. Same return codes as open. */ + +int ov_test_callbacks(void *f,OggVorbis_File *vf, + const char *initial,long ibytes,ov_callbacks callbacks) +{ + return _ov_open1(f,vf,initial,ibytes,callbacks); +} + +int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ + ov_callbacks callbacks = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell + }; + + return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks); +} + +int ov_test_open(OggVorbis_File *vf){ + if(vf->ready_state!=PARTOPEN)return(OV_EINVAL); + return _ov_open2(vf); +} + +/* How many logical bitstreams in this physical bitstream? */ +long ov_streams(OggVorbis_File *vf){ + return vf->links; +} + +/* Is the FILE * associated with vf seekable? */ +long ov_seekable(OggVorbis_File *vf){ + return vf->seekable; +} + +/* returns the bitrate for a given logical bitstream or the entire + physical bitstream. If the file is open for random access, it will + find the *actual* average bitrate. If the file is streaming, it + returns the nominal bitrate (if set) else the average of the + upper/lower bounds (if set) else -1 (unset). + + If you want the actual bitrate field settings, get them from the + vorbis_info structs */ + +long ov_bitrate(OggVorbis_File *vf,int i){ + if(vf->ready_state=vf->links)return(OV_EINVAL); + if(!vf->seekable && i!=0)return(ov_bitrate(vf,0)); + if(i<0){ + ogg_int64_t bits=0; + int i; + float br; + for(i=0;ilinks;i++) + bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8; + /* This once read: return(rint(bits/ov_time_total(vf,-1))); + * gcc 3.x on x86 miscompiled this at optimisation level 2 and above, + * so this is slightly transformed to make it work. + */ + br = bits/ov_time_total(vf,-1); + return(rint(br)); + }else{ + if(vf->seekable){ + /* return the actual bitrate */ + return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i))); + }else{ + /* return nominal if set */ + if(vf->vi[i].bitrate_nominal>0){ + return vf->vi[i].bitrate_nominal; + }else{ + if(vf->vi[i].bitrate_upper>0){ + if(vf->vi[i].bitrate_lower>0){ + return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2; + }else{ + return vf->vi[i].bitrate_upper; + } + } + return(OV_FALSE); + } + } + } +} + +/* returns the actual bitrate since last call. returns -1 if no + additional data to offer since last call (or at beginning of stream), + EINVAL if stream is only partially open +*/ +long ov_bitrate_instant(OggVorbis_File *vf){ + int link=(vf->seekable?vf->current_link:0); + long ret; + if(vf->ready_statesamptrack==0)return(OV_FALSE); + ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5; + vf->bittrack=0.f; + vf->samptrack=0.f; + return(ret); +} + +/* Guess */ +long ov_serialnumber(OggVorbis_File *vf,int i){ + if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1)); + if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1)); + if(i<0){ + return(vf->current_serialno); + }else{ + return(vf->serialnos[i]); + } +} + +/* returns: total raw (compressed) length of content if i==-1 + raw (compressed) length of that logical bitstream for i==0 to n + OV_EINVAL if the stream is not seekable (we can't know the length) + or if stream is only partially open +*/ +ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){ + if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); + if(i<0){ + ogg_int64_t acc=0; + int i; + for(i=0;ilinks;i++) + acc+=ov_raw_total(vf,i); + return(acc); + }else{ + return(vf->offsets[i+1]-vf->offsets[i]); + } +} + +/* returns: total PCM length (samples) of content if i==-1 PCM length + (samples) of that logical bitstream for i==0 to n + OV_EINVAL if the stream is not seekable (we can't know the + length) or only partially open +*/ +ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){ + if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); + if(i<0){ + ogg_int64_t acc=0; + int i; + for(i=0;ilinks;i++) + acc+=ov_pcm_total(vf,i); + return(acc); + }else{ + return(vf->pcmlengths[i*2+1]); + } +} + +/* returns: total seconds of content if i==-1 + seconds in that logical bitstream for i==0 to n + OV_EINVAL if the stream is not seekable (we can't know the + length) or only partially open +*/ +double ov_time_total(OggVorbis_File *vf,int i){ + if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); + if(i<0){ + double acc=0; + int i; + for(i=0;ilinks;i++) + acc+=ov_time_total(vf,i); + return(acc); + }else{ + return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate); + } +} + +/* seek to an offset relative to the *compressed* data. This also + scans packets to update the PCM cursor. It will cross a logical + bitstream boundary, but only if it can't get any packets out of the + tail of the bitstream we seek to (so no surprises). + + returns zero on success, nonzero on failure */ + +int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){ + ogg_stream_state work_os; + int ret; + + if(vf->ready_stateseekable) + return(OV_ENOSEEK); /* don't dump machine if we can't seek */ + + if(pos<0 || pos>vf->end)return(OV_EINVAL); + + /* is the seek position outside our current link [if any]? */ + if(vf->ready_state>=STREAMSET){ + if(posoffsets[vf->current_link] || pos>=vf->offsets[vf->current_link+1]) + _decode_clear(vf); /* clear out stream state */ + } + + /* don't yet clear out decoding machine (if it's initialized), in + the case we're in the same link. Restart the decode lapping, and + let _fetch_and_process_packet deal with a potential bitstream + boundary */ + vf->pcm_offset=-1; + ogg_stream_reset_serialno(&vf->os, + vf->current_serialno); /* must set serialno */ + vorbis_synthesis_restart(&vf->vd); + + ret=_seek_helper(vf,pos); + if(ret)goto seek_error; + + /* we need to make sure the pcm_offset is set, but we don't want to + advance the raw cursor past good packets just to get to the first + with a granulepos. That's not equivalent behavior to beginning + decoding as immediately after the seek position as possible. + + So, a hack. We use two stream states; a local scratch state and + the shared vf->os stream state. We use the local state to + scan, and the shared state as a buffer for later decode. + + Unfortuantely, on the last page we still advance to last packet + because the granulepos on the last page is not necessarily on a + packet boundary, and we need to make sure the granpos is + correct. + */ + + { + ogg_page og; + ogg_packet op; + int lastblock=0; + int accblock=0; + int thisblock=0; + int lastflag=0; + int firstflag=0; + ogg_int64_t pagepos=-1; + + ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */ + ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE + return from not necessarily + starting from the beginning */ + + while(1){ + if(vf->ready_state>=STREAMSET){ + /* snarf/scan a packet if we can */ + int result=ogg_stream_packetout(&work_os,&op); + + if(result>0){ + + if(vf->vi[vf->current_link].codec_setup){ + thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); + if(thisblock<0){ + ogg_stream_packetout(&vf->os,NULL); + thisblock=0; + }else{ + + /* We can't get a guaranteed correct pcm position out of the + last page in a stream because it might have a 'short' + granpos, which can only be detected in the presence of a + preceding page. However, if the last page is also the first + page, the granpos rules of a first page take precedence. Not + only that, but for first==last, the EOS page must be treated + as if its a normal first page for the stream to open/play. */ + if(lastflag && !firstflag) + ogg_stream_packetout(&vf->os,NULL); + else + if(lastblock)accblock+=(lastblock+thisblock)>>2; + } + + if(op.granulepos!=-1){ + int i,link=vf->current_link; + ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2]; + if(granulepos<0)granulepos=0; + + for(i=0;ipcmlengths[i*2+1]; + vf->pcm_offset=granulepos-accblock; + if(vf->pcm_offset<0)vf->pcm_offset=0; + break; + } + lastblock=thisblock; + continue; + }else + ogg_stream_packetout(&vf->os,NULL); + } + } + + if(!lastblock){ + pagepos=_get_next_page(vf,&og,-1); + if(pagepos<0){ + vf->pcm_offset=ov_pcm_total(vf,-1); + break; + } + }else{ + /* huh? Bogus stream with packets but no granulepos */ + vf->pcm_offset=-1; + break; + } + + /* has our decoding just traversed a bitstream boundary? */ + if(vf->ready_state>=STREAMSET){ + if(vf->current_serialno!=ogg_page_serialno(&og)){ + + /* two possibilities: + 1) our decoding just traversed a bitstream boundary + 2) another stream is multiplexed into this logical section? */ + + if(ogg_page_bos(&og)){ + /* we traversed */ + _decode_clear(vf); /* clear out stream state */ + ogg_stream_clear(&work_os); + } /* else, do nothing; next loop will scoop another page */ + } + } + + if(vf->ready_statelinks;link++) + if(vf->serialnos[link]==serialno)break; + + if(link==vf->links) continue; /* not the desired Vorbis + bitstream section; keep + trying */ + vf->current_link=link; + vf->current_serialno=serialno; + ogg_stream_reset_serialno(&vf->os,serialno); + ogg_stream_reset_serialno(&work_os,serialno); + vf->ready_state=STREAMSET; + firstflag=(pagepos<=vf->dataoffsets[link]); + } + + ogg_stream_pagein(&vf->os,&og); + ogg_stream_pagein(&work_os,&og); + lastflag=ogg_page_eos(&og); + + } + } + + ogg_stream_clear(&work_os); + vf->bittrack=0.f; + vf->samptrack=0.f; + return(0); + + seek_error: + /* dump the machine so we're in a known state */ + vf->pcm_offset=-1; + ogg_stream_clear(&work_os); + _decode_clear(vf); + return OV_EBADLINK; +} + +/* Page granularity seek (faster than sample granularity because we + don't do the last bit of decode to find a specific sample). + + Seek to the last [granule marked] page preceding the specified pos + location, such that decoding past the returned point will quickly + arrive at the requested position. */ +int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ + int link=-1; + ogg_int64_t result=0; + ogg_int64_t total=ov_pcm_total(vf,-1); + + if(vf->ready_stateseekable)return(OV_ENOSEEK); + + if(pos<0 || pos>total)return(OV_EINVAL); + + /* which bitstream section does this pcm offset occur in? */ + for(link=vf->links-1;link>=0;link--){ + total-=vf->pcmlengths[link*2+1]; + if(pos>=total)break; + } + + /* search within the logical bitstream for the page with the highest + pcm_pos preceding (or equal to) pos. There is a danger here; + missing pages or incorrect frame number information in the + bitstream could make our task impossible. Account for that (it + would be an error condition) */ + + /* new search algorithm by HB (Nicholas Vinen) */ + { + ogg_int64_t end=vf->offsets[link+1]; + ogg_int64_t begin=vf->offsets[link]; + ogg_int64_t begintime = vf->pcmlengths[link*2]; + ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime; + ogg_int64_t target=pos-total+begintime; + ogg_int64_t best=begin; + + ogg_page og; + while(beginoffset){ + result=_seek_helper(vf,bisect); + if(result) goto seek_error; + } + + while(beginoffset); + if(result==OV_EREAD) goto seek_error; + if(result<0){ + if(bisect<=begin+1) + end=begin; /* found it */ + else{ + if(bisect==0) goto seek_error; + bisect-=CHUNKSIZE; + if(bisect<=begin)bisect=begin+1; + result=_seek_helper(vf,bisect); + if(result) goto seek_error; + } + }else{ + ogg_int64_t granulepos; + + if(ogg_page_serialno(&og)!=vf->serialnos[link]) + continue; + + granulepos=ogg_page_granulepos(&og); + if(granulepos==-1)continue; + + if(granuleposoffset; /* raw offset of next page */ + begintime=granulepos; + + if(target-begintime>44100)break; + bisect=begin; /* *not* begin + 1 */ + }else{ + if(bisect<=begin+1) + end=begin; /* found it */ + else{ + if(end==vf->offset){ /* we're pretty close - we'd be stuck in */ + end=result; + bisect-=CHUNKSIZE; /* an endless loop otherwise. */ + if(bisect<=begin)bisect=begin+1; + result=_seek_helper(vf,bisect); + if(result) goto seek_error; + }else{ + end=bisect; + endtime=granulepos; + break; + } + } + } + } + } + } + + /* found our page. seek to it, update pcm offset. Easier case than + raw_seek, don't keep packets preceding granulepos. */ + { + ogg_page og; + ogg_packet op; + + /* seek */ + result=_seek_helper(vf,best); + vf->pcm_offset=-1; + if(result) goto seek_error; + result=_get_next_page(vf,&og,-1); + if(result<0) goto seek_error; + + if(link!=vf->current_link){ + /* Different link; dump entire decode machine */ + _decode_clear(vf); + + vf->current_link=link; + vf->current_serialno=vf->serialnos[link]; + vf->ready_state=STREAMSET; + + }else{ + vorbis_synthesis_restart(&vf->vd); + } + + ogg_stream_reset_serialno(&vf->os,vf->current_serialno); + ogg_stream_pagein(&vf->os,&og); + + /* pull out all but last packet; the one with granulepos */ + while(1){ + result=ogg_stream_packetpeek(&vf->os,&op); + if(result==0){ + /* !!! the packet finishing this page originated on a + preceding page. Keep fetching previous pages until we + get one with a granulepos or without the 'continued' flag + set. Then just use raw_seek for simplicity. */ + + result=_seek_helper(vf,best); + if(result<0) goto seek_error; + + while(1){ + result=_get_prev_page(vf,&og); + if(result<0) goto seek_error; + if(ogg_page_serialno(&og)==vf->current_serialno && + (ogg_page_granulepos(&og)>-1 || + !ogg_page_continued(&og))){ + return ov_raw_seek(vf,result); + } + vf->offset=result; + } + } + if(result<0){ + result = OV_EBADPACKET; + goto seek_error; + } + if(op.granulepos!=-1){ + vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; + if(vf->pcm_offset<0)vf->pcm_offset=0; + vf->pcm_offset+=total; + break; + }else + result=ogg_stream_packetout(&vf->os,NULL); + (void) result; + } + } + } + + /* verify result */ + if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){ + result=OV_EFAULT; + goto seek_error; + } + vf->bittrack=0.f; + vf->samptrack=0.f; + return(0); + + seek_error: + /* dump machine so we're in a known state */ + vf->pcm_offset=-1; + _decode_clear(vf); + return (int)result; +} + +/* seek to a sample offset relative to the decompressed pcm stream + returns zero on success, nonzero on failure */ + +int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ + int thisblock,lastblock=0; + int ret=ov_pcm_seek_page(vf,pos); + if(ret<0)return(ret); + if((ret=_make_decode_ready(vf)))return ret; + + /* discard leading packets we don't need for the lapping of the + position we want; don't decode them */ + + while(1){ + ogg_packet op; + ogg_page og; + + int ret=ogg_stream_packetpeek(&vf->os,&op); + if(ret>0){ + thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); + if(thisblock<0){ + ogg_stream_packetout(&vf->os,NULL); + continue; /* non audio packet */ + } + if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2; + + if(vf->pcm_offset+((thisblock+ + vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break; + + /* remove the packet from packet queue and track its granulepos */ + ogg_stream_packetout(&vf->os,NULL); + vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with + only tracking, no + pcm_decode */ + vorbis_synthesis_blockin(&vf->vd,&vf->vb); + + /* end of logical stream case is hard, especially with exact + length positioning. */ + + if(op.granulepos>-1){ + int i; + /* always believe the stream markers */ + vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; + if(vf->pcm_offset<0)vf->pcm_offset=0; + for(i=0;icurrent_link;i++) + vf->pcm_offset+=vf->pcmlengths[i*2+1]; + } + + lastblock=thisblock; + + }else{ + if(ret<0 && ret!=OV_HOLE)break; + + /* suck in a new page */ + if(_get_next_page(vf,&og,-1)<0)break; + if(ogg_page_bos(&og))_decode_clear(vf); + + if(vf->ready_statelinks;link++) + if(vf->serialnos[link]==serialno)break; + if(link==vf->links) continue; + vf->current_link=link; + + vf->ready_state=STREAMSET; + vf->current_serialno=ogg_page_serialno(&og); + ogg_stream_reset_serialno(&vf->os,serialno); + ret=_make_decode_ready(vf); + if(ret)return ret; + lastblock=0; + } + + ogg_stream_pagein(&vf->os,&og); + } + } + + vf->bittrack=0.f; + vf->samptrack=0.f; + /* discard samples until we reach the desired position. Crossing a + logical bitstream boundary with abandon is OK. */ + { + /* note that halfrate could be set differently in each link, but + vorbisfile encoforces all links are set or unset */ + int hs=vorbis_synthesis_halfrate_p(vf->vi); + while(vf->pcm_offset<((pos>>hs)<pcm_offset)>>hs; + long samples=vorbis_synthesis_pcmout(&vf->vd,NULL); + + if(samples>target)samples=target; + vorbis_synthesis_read(&vf->vd,samples); + vf->pcm_offset+=samples<pcm_offset=ov_pcm_total(vf,-1); /* eof */ + } + } + return 0; +} + +/* seek to a playback time relative to the decompressed pcm stream + returns zero on success, nonzero on failure */ +int ov_time_seek(OggVorbis_File *vf,double seconds){ + /* translate time to PCM position and call ov_pcm_seek */ + + int link=-1; + ogg_int64_t pcm_total=0; + double time_total=0.; + + if(vf->ready_stateseekable)return(OV_ENOSEEK); + if(seconds<0)return(OV_EINVAL); + + /* which bitstream section does this time offset occur in? */ + for(link=0;linklinks;link++){ + double addsec = ov_time_total(vf,link); + if(secondspcmlengths[link*2+1]; + } + + if(link==vf->links)return(OV_EINVAL); + + /* enough information to convert time offset to pcm offset */ + { + ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate; + return(ov_pcm_seek(vf,target)); + } +} + +/* page-granularity version of ov_time_seek + returns zero on success, nonzero on failure */ +int ov_time_seek_page(OggVorbis_File *vf,double seconds){ + /* translate time to PCM position and call ov_pcm_seek */ + + int link=-1; + ogg_int64_t pcm_total=0; + double time_total=0.; + + if(vf->ready_stateseekable)return(OV_ENOSEEK); + if(seconds<0)return(OV_EINVAL); + + /* which bitstream section does this time offset occur in? */ + for(link=0;linklinks;link++){ + double addsec = ov_time_total(vf,link); + if(secondspcmlengths[link*2+1]; + } + + if(link==vf->links)return(OV_EINVAL); + + /* enough information to convert time offset to pcm offset */ + { + ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate; + return(ov_pcm_seek_page(vf,target)); + } +} + +/* tell the current stream offset cursor. Note that seek followed by + tell will likely not give the set offset due to caching */ +ogg_int64_t ov_raw_tell(OggVorbis_File *vf){ + if(vf->ready_stateoffset); +} + +/* return PCM offset (sample) of next PCM sample to be read */ +ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ + if(vf->ready_statepcm_offset); +} + +/* return time offset (seconds) of next PCM sample to be read */ +double ov_time_tell(OggVorbis_File *vf){ + int link=0; + ogg_int64_t pcm_total=0; + double time_total=0.f; + + if(vf->ready_stateseekable){ + pcm_total=ov_pcm_total(vf,-1); + time_total=ov_time_total(vf,-1); + + /* which bitstream section does this time offset occur in? */ + for(link=vf->links-1;link>=0;link--){ + pcm_total-=vf->pcmlengths[link*2+1]; + time_total-=ov_time_total(vf,link); + if(vf->pcm_offset>=pcm_total)break; + } + } + + return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate); +} + +/* link: -1) return the vorbis_info struct for the bitstream section + currently being decoded + 0-n) to request information for a specific bitstream section + + In the case of a non-seekable bitstream, any call returns the + current bitstream. NULL in the case that the machine is not + initialized */ + +vorbis_info *ov_info(OggVorbis_File *vf,int link){ + if(vf->seekable){ + if(link<0) + if(vf->ready_state>=STREAMSET) + return vf->vi+vf->current_link; + else + return vf->vi; + else + if(link>=vf->links) + return NULL; + else + return vf->vi+link; + }else{ + return vf->vi; + } +} + +/* grr, strong typing, grr, no templates/inheritence, grr */ +vorbis_comment *ov_comment(OggVorbis_File *vf,int link){ + if(vf->seekable){ + if(link<0) + if(vf->ready_state>=STREAMSET) + return vf->vc+vf->current_link; + else + return vf->vc; + else + if(link>=vf->links) + return NULL; + else + return vf->vc+link; + }else{ + return vf->vc; + } +} + +static int host_is_big_endian() { + ogg_int32_t pattern = 0xfeedface; /* deadbeef */ + unsigned char *bytewise = (unsigned char *)&pattern; + if (bytewise[0] == 0xfe) return 1; + return 0; +} + +/* up to this point, everything could more or less hide the multiple + logical bitstream nature of chaining from the toplevel application + if the toplevel application didn't particularly care. However, at + the point that we actually read audio back, the multiple-section + nature must surface: Multiple bitstream sections do not necessarily + have to have the same number of channels or sampling rate. + + ov_read returns the sequential logical bitstream number currently + being decoded along with the PCM data in order that the toplevel + application can take action on channel/sample rate changes. This + number will be incremented even for streamed (non-seekable) streams + (for seekable streams, it represents the actual logical bitstream + index within the physical bitstream. Note that the accessor + functions above are aware of this dichotomy). + + ov_read_filter is exactly the same as ov_read except that it processes + the decoded audio data through a filter before packing it into the + requested format. This gives greater accuracy than applying a filter + after the audio has been converted into integral PCM. + + input values: buffer) a buffer to hold packed PCM data for return + length) the byte length requested to be placed into buffer + bigendianp) should the data be packed LSB first (0) or + MSB first (1) + word) word size for output. currently 1 (byte) or + 2 (16 bit short) + + return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) + 0) EOF + n) number of bytes of PCM actually returned. The + below works on a packet-by-packet basis, so the + return length is not related to the 'length' passed + in, just guaranteed to fit. + + *section) set to the logical bitstream number */ + +long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream, + void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param){ + int i,j; + int host_endian = host_is_big_endian(); + int hs; + + float **pcm; + long samples; + + if(vf->ready_stateready_state==INITSET){ + samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); + if(samples)break; + } + + /* suck in another packet */ + { + int ret=_fetch_and_process_packet(vf,NULL,1,1); + if(ret==OV_EOF) + return(0); + if(ret<=0) + return(ret); + } + + } + + if(samples>0){ + + /* yay! proceed to pack data into the byte buffer */ + + long channels=ov_info(vf,-1)->channels; + long bytespersample=word * channels; + vorbis_fpu_control fpu; + (void) fpu; + if(samples>length/bytespersample)samples=length/bytespersample; + + if(samples <= 0) + return OV_EINVAL; + + /* Here. */ + if(filter) + filter(pcm,channels,samples,filter_param); + + /* a tight loop to pack each size */ + { + int val; + if(word==1){ + int off=(sgned?0:128); + vorbis_fpu_setround(&fpu); + for(j=0;j127)val=127; + else if(val<-128)val=-128; + *buffer++=val+off; + } + vorbis_fpu_restore(fpu); + }else{ + int off=(sgned?0:32768); + + if(host_endian==bigendianp){ + if(sgned){ + + vorbis_fpu_setround(&fpu); + for(i=0;i32767)val=32767; + else if(val<-32768)val=-32768; + *dest=val; + dest+=channels; + } + } + vorbis_fpu_restore(fpu); + + }else{ + + vorbis_fpu_setround(&fpu); + for(i=0;i32767)val=32767; + else if(val<-32768)val=-32768; + *dest=val+off; + dest+=channels; + } + } + vorbis_fpu_restore(fpu); + + } + }else if(bigendianp){ + + vorbis_fpu_setround(&fpu); + for(j=0;j32767)val=32767; + else if(val<-32768)val=-32768; + val+=off; + *buffer++=(val>>8); + *buffer++=(val&0xff); + } + vorbis_fpu_restore(fpu); + + }else{ + int val; + vorbis_fpu_setround(&fpu); + for(j=0;j32767)val=32767; + else if(val<-32768)val=-32768; + val+=off; + *buffer++=(val&0xff); + *buffer++=(val>>8); + } + vorbis_fpu_restore(fpu); + + } + } + } + + vorbis_synthesis_read(&vf->vd,samples); + hs=vorbis_synthesis_halfrate_p(vf->vi); + vf->pcm_offset+=(samples<current_link; + return(samples*bytespersample); + }else{ + return(samples); + } +} + +long ov_read(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream){ + return ov_read_filter(vf, buffer, length, bigendianp, word, sgned, bitstream, NULL, NULL); +} + +/* input values: pcm_channels) a float vector per channel of output + length) the sample length being read by the app + + return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) + 0) EOF + n) number of samples of PCM actually returned. The + below works on a packet-by-packet basis, so the + return length is not related to the 'length' passed + in, just guaranteed to fit. + + *section) set to the logical bitstream number */ + + + +long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length, + int *bitstream){ + + if(vf->ready_stateready_state==INITSET){ + float **pcm; + long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); + if(samples){ + int hs=vorbis_synthesis_halfrate_p(vf->vi); + if(pcm_channels)*pcm_channels=pcm; + if(samples>length)samples=length; + vorbis_synthesis_read(&vf->vd,samples); + vf->pcm_offset+=samples<current_link; + return samples; + + } + } + + /* suck in another packet */ + { + int ret=_fetch_and_process_packet(vf,NULL,1,1); + if(ret==OV_EOF)return(0); + if(ret<=0)return(ret); + } + + } +} + +extern float *vorbis_window(vorbis_dsp_state *v,int W); + +static void _ov_splice(float **pcm,float **lappcm, + int n1, int n2, + int ch1, int ch2, + float *w1, float *w2){ + int i,j; + float *w=w1; + int n=n1; + + if(n1>n2){ + n=n2; + w=w2; + } + + /* splice */ + for(j=0;jready_state==INITSET)break; + /* suck in another packet */ + { + int ret=_fetch_and_process_packet(vf,NULL,1,0); + if(ret<0 && ret!=OV_HOLE)return(ret); + } + } + return 0; +} + +/* make sure vf is INITSET and that we have a primed buffer; if + we're crosslapping at a stream section boundary, this also makes + sure we're sanity checking against the right stream information */ +static int _ov_initprime(OggVorbis_File *vf){ + vorbis_dsp_state *vd=&vf->vd; + while(1){ + if(vf->ready_state==INITSET) + if(vorbis_synthesis_pcmout(vd,NULL))break; + + /* suck in another packet */ + { + int ret=_fetch_and_process_packet(vf,NULL,1,0); + if(ret<0 && ret!=OV_HOLE)return(ret); + } + } + return 0; +} + +/* grab enough data for lapping from vf; this may be in the form of + unreturned, already-decoded pcm, remaining PCM we will need to + decode, or synthetic postextrapolation from last packets. */ +static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd, + float **lappcm,int lapsize){ + int lapcount=0,i; + float **pcm; + + /* try first to decode the lapping data */ + while(lapcountlapsize-lapcount)samples=lapsize-lapcount; + for(i=0;ichannels;i++) + memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples); + lapcount+=samples; + vorbis_synthesis_read(vd,samples); + }else{ + /* suck in another packet */ + int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */ + if(ret==OV_EOF)break; + } + } + if(lapcountvd,&pcm); + if(samples==0){ + for(i=0;ichannels;i++) + memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount); + lapcount=lapsize; + }else{ + if(samples>lapsize-lapcount)samples=lapsize-lapcount; + for(i=0;ichannels;i++) + memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples); + lapcount+=samples; + } + + (void) lapcount; + } +} + +/* this sets up crosslapping of a sample by using trailing data from + sample 1 and lapping it into the windowing buffer of sample 2 */ +int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){ + vorbis_info *vi1,*vi2; + float **lappcm; + float **pcm; + float *w1,*w2; + int n1,n2,i,ret,hs1,hs2; + + if(vf1==vf2)return(0); /* degenerate case */ + if(vf1->ready_stateready_statechannels); + n1=vorbis_info_blocksize(vi1,0)>>(1+hs1); + n2=vorbis_info_blocksize(vi2,0)>>(1+hs2); + w1=vorbis_window(&vf1->vd,0); + w2=vorbis_window(&vf2->vd,0); + + for(i=0;ichannels;i++) + lappcm[i]=(float*) alloca(sizeof(**lappcm)*n1); + + _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1); + + /* have a lapping buffer from vf1; now to splice it into the lapping + buffer of vf2 */ + /* consolidate and expose the buffer. */ + vorbis_synthesis_lapout(&vf2->vd,&pcm); + +#if 0 + _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0); + _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0); +#endif + + /* splice */ + _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2); + + /* done */ + return(0); +} + +static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos, + int (*localseek)(OggVorbis_File *,ogg_int64_t)){ + vorbis_info *vi; + float **lappcm; + float **pcm; + float *w1,*w2; + int n1,n2,ch1,ch2,hs; + int i,ret; + + if(vf->ready_statechannels; + n1=vorbis_info_blocksize(vi,0)>>(1+hs); + w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are + persistent; even if the decode state + from this link gets dumped, this + window array continues to exist */ + + lappcm=(float**) alloca(sizeof(*lappcm)*ch1); + for(i=0;ivd,lappcm,n1); + + /* have lapping data; seek and prime the buffer */ + ret=localseek(vf,pos); + if(ret)return ret; + ret=_ov_initprime(vf); + if(ret)return(ret); + + /* Guard against cross-link changes; they're perfectly legal */ + vi=ov_info(vf,-1); + ch2=vi->channels; + n2=vorbis_info_blocksize(vi,0)>>(1+hs); + w2=vorbis_window(&vf->vd,0); + + /* consolidate and expose the buffer. */ + vorbis_synthesis_lapout(&vf->vd,&pcm); + + /* splice */ + _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2); + + /* done */ + return(0); +} + +int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){ + return _ov_64_seek_lap(vf,pos,ov_raw_seek); +} + +int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){ + return _ov_64_seek_lap(vf,pos,ov_pcm_seek); +} + +int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){ + return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page); +} + +static int _ov_d_seek_lap(OggVorbis_File *vf,double pos, + int (*localseek)(OggVorbis_File *,double)){ + vorbis_info *vi; + float **lappcm; + float **pcm; + float *w1,*w2; + int n1,n2,ch1,ch2,hs; + int i,ret; + + if(vf->ready_statechannels; + n1=vorbis_info_blocksize(vi,0)>>(1+hs); + w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are + persistent; even if the decode state + from this link gets dumped, this + window array continues to exist */ + + lappcm=(float**) alloca(sizeof(*lappcm)*ch1); + for(i=0;ivd,lappcm,n1); + + /* have lapping data; seek and prime the buffer */ + ret=localseek(vf,pos); + if(ret)return ret; + ret=_ov_initprime(vf); + if(ret)return(ret); + + /* Guard against cross-link changes; they're perfectly legal */ + vi=ov_info(vf,-1); + ch2=vi->channels; + n2=vorbis_info_blocksize(vi,0)>>(1+hs); + w2=vorbis_window(&vf->vd,0); + + /* consolidate and expose the buffer. */ + vorbis_synthesis_lapout(&vf->vd,&pcm); + + /* splice */ + _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2); + + /* done */ + return(0); +} + +int ov_time_seek_lap(OggVorbis_File *vf,double pos){ + return _ov_d_seek_lap(vf,pos,ov_time_seek); +} + +int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){ + return _ov_d_seek_lap(vf,pos,ov_time_seek_page); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c new file mode 100644 index 0000000000..0dfe3f963b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c @@ -0,0 +1,2135 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: window functions + last mod: $Id: window.c 16227 2009-07-08 06:58:46Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include "os.h" +#include "misc.h" + +static float vwin64[32] = { + 0.0009460463F, 0.0085006468F, 0.0235352254F, 0.0458950567F, + 0.0753351908F, 0.1115073077F, 0.1539457973F, 0.2020557475F, + 0.2551056759F, 0.3122276645F, 0.3724270287F, 0.4346027792F, + 0.4975789974F, 0.5601459521F, 0.6211085051F, 0.6793382689F, + 0.7338252629F, 0.7837245849F, 0.8283939355F, 0.8674186656F, + 0.9006222429F, 0.9280614787F, 0.9500073081F, 0.9669131782F, + 0.9793740220F, 0.9880792941F, 0.9937636139F, 0.9971582668F, + 0.9989462667F, 0.9997230082F, 0.9999638688F, 0.9999995525F, +}; + +static float vwin128[64] = { + 0.0002365472F, 0.0021280687F, 0.0059065254F, 0.0115626550F, + 0.0190823442F, 0.0284463735F, 0.0396300935F, 0.0526030430F, + 0.0673285281F, 0.0837631763F, 0.1018564887F, 0.1215504095F, + 0.1427789367F, 0.1654677960F, 0.1895342001F, 0.2148867160F, + 0.2414252576F, 0.2690412240F, 0.2976177952F, 0.3270303960F, + 0.3571473350F, 0.3878306189F, 0.4189369387F, 0.4503188188F, + 0.4818259135F, 0.5133064334F, 0.5446086751F, 0.5755826278F, + 0.6060816248F, 0.6359640047F, 0.6650947483F, 0.6933470543F, + 0.7206038179F, 0.7467589810F, 0.7717187213F, 0.7954024542F, + 0.8177436264F, 0.8386902831F, 0.8582053981F, 0.8762669622F, + 0.8928678298F, 0.9080153310F, 0.9217306608F, 0.9340480615F, + 0.9450138200F, 0.9546851041F, 0.9631286621F, 0.9704194171F, + 0.9766389810F, 0.9818741197F, 0.9862151938F, 0.9897546035F, + 0.9925852598F, 0.9947991032F, 0.9964856900F, 0.9977308602F, + 0.9986155015F, 0.9992144193F, 0.9995953200F, 0.9998179155F, + 0.9999331503F, 0.9999825563F, 0.9999977357F, 0.9999999720F, +}; + +static float vwin256[128] = { + 0.0000591390F, 0.0005321979F, 0.0014780301F, 0.0028960636F, + 0.0047854363F, 0.0071449926F, 0.0099732775F, 0.0132685298F, + 0.0170286741F, 0.0212513119F, 0.0259337111F, 0.0310727950F, + 0.0366651302F, 0.0427069140F, 0.0491939614F, 0.0561216907F, + 0.0634851102F, 0.0712788035F, 0.0794969160F, 0.0881331402F, + 0.0971807028F, 0.1066323515F, 0.1164803426F, 0.1267164297F, + 0.1373318534F, 0.1483173323F, 0.1596630553F, 0.1713586755F, + 0.1833933062F, 0.1957555184F, 0.2084333404F, 0.2214142599F, + 0.2346852280F, 0.2482326664F, 0.2620424757F, 0.2761000481F, + 0.2903902813F, 0.3048975959F, 0.3196059553F, 0.3344988887F, + 0.3495595160F, 0.3647705766F, 0.3801144597F, 0.3955732382F, + 0.4111287047F, 0.4267624093F, 0.4424557009F, 0.4581897696F, + 0.4739456913F, 0.4897044744F, 0.5054471075F, 0.5211546088F, + 0.5368080763F, 0.5523887395F, 0.5678780103F, 0.5832575361F, + 0.5985092508F, 0.6136154277F, 0.6285587300F, 0.6433222619F, + 0.6578896175F, 0.6722449294F, 0.6863729144F, 0.7002589187F, + 0.7138889597F, 0.7272497662F, 0.7403288154F, 0.7531143679F, + 0.7655954985F, 0.7777621249F, 0.7896050322F, 0.8011158947F, + 0.8122872932F, 0.8231127294F, 0.8335866365F, 0.8437043850F, + 0.8534622861F, 0.8628575905F, 0.8718884835F, 0.8805540765F, + 0.8888543947F, 0.8967903616F, 0.9043637797F, 0.9115773078F, + 0.9184344360F, 0.9249394562F, 0.9310974312F, 0.9369141608F, + 0.9423961446F, 0.9475505439F, 0.9523851406F, 0.9569082947F, + 0.9611289005F, 0.9650563408F, 0.9687004405F, 0.9720714191F, + 0.9751798427F, 0.9780365753F, 0.9806527301F, 0.9830396204F, + 0.9852087111F, 0.9871715701F, 0.9889398207F, 0.9905250941F, + 0.9919389832F, 0.9931929973F, 0.9942985174F, 0.9952667537F, + 0.9961087037F, 0.9968351119F, 0.9974564312F, 0.9979827858F, + 0.9984239359F, 0.9987892441F, 0.9990876435F, 0.9993276081F, + 0.9995171241F, 0.9996636648F, 0.9997741654F, 0.9998550016F, + 0.9999119692F, 0.9999502656F, 0.9999744742F, 0.9999885497F, + 0.9999958064F, 0.9999989077F, 0.9999998584F, 0.9999999983F, +}; + +static float vwin512[256] = { + 0.0000147849F, 0.0001330607F, 0.0003695946F, 0.0007243509F, + 0.0011972759F, 0.0017882983F, 0.0024973285F, 0.0033242588F, + 0.0042689632F, 0.0053312973F, 0.0065110982F, 0.0078081841F, + 0.0092223540F, 0.0107533880F, 0.0124010466F, 0.0141650703F, + 0.0160451800F, 0.0180410758F, 0.0201524373F, 0.0223789233F, + 0.0247201710F, 0.0271757958F, 0.0297453914F, 0.0324285286F, + 0.0352247556F, 0.0381335972F, 0.0411545545F, 0.0442871045F, + 0.0475306997F, 0.0508847676F, 0.0543487103F, 0.0579219038F, + 0.0616036982F, 0.0653934164F, 0.0692903546F, 0.0732937809F, + 0.0774029356F, 0.0816170305F, 0.0859352485F, 0.0903567428F, + 0.0948806375F, 0.0995060259F, 0.1042319712F, 0.1090575056F, + 0.1139816300F, 0.1190033137F, 0.1241214941F, 0.1293350764F, + 0.1346429333F, 0.1400439046F, 0.1455367974F, 0.1511203852F, + 0.1567934083F, 0.1625545735F, 0.1684025537F, 0.1743359881F, + 0.1803534820F, 0.1864536069F, 0.1926349000F, 0.1988958650F, + 0.2052349715F, 0.2116506555F, 0.2181413191F, 0.2247053313F, + 0.2313410275F, 0.2380467105F, 0.2448206500F, 0.2516610835F, + 0.2585662164F, 0.2655342226F, 0.2725632448F, 0.2796513950F, + 0.2867967551F, 0.2939973773F, 0.3012512852F, 0.3085564739F, + 0.3159109111F, 0.3233125375F, 0.3307592680F, 0.3382489922F, + 0.3457795756F, 0.3533488602F, 0.3609546657F, 0.3685947904F, + 0.3762670121F, 0.3839690896F, 0.3916987634F, 0.3994537572F, + 0.4072317788F, 0.4150305215F, 0.4228476653F, 0.4306808783F, + 0.4385278181F, 0.4463861329F, 0.4542534630F, 0.4621274424F, + 0.4700057001F, 0.4778858615F, 0.4857655502F, 0.4936423891F, + 0.5015140023F, 0.5093780165F, 0.5172320626F, 0.5250737772F, + 0.5329008043F, 0.5407107971F, 0.5485014192F, 0.5562703465F, + 0.5640152688F, 0.5717338914F, 0.5794239366F, 0.5870831457F, + 0.5947092801F, 0.6023001235F, 0.6098534829F, 0.6173671907F, + 0.6248391059F, 0.6322671161F, 0.6396491384F, 0.6469831217F, + 0.6542670475F, 0.6614989319F, 0.6686768267F, 0.6757988210F, + 0.6828630426F, 0.6898676592F, 0.6968108799F, 0.7036909564F, + 0.7105061843F, 0.7172549043F, 0.7239355032F, 0.7305464154F, + 0.7370861235F, 0.7435531598F, 0.7499461068F, 0.7562635986F, + 0.7625043214F, 0.7686670148F, 0.7747504721F, 0.7807535410F, + 0.7866751247F, 0.7925141825F, 0.7982697296F, 0.8039408387F, + 0.8095266395F, 0.8150263196F, 0.8204391248F, 0.8257643590F, + 0.8310013848F, 0.8361496236F, 0.8412085555F, 0.8461777194F, + 0.8510567129F, 0.8558451924F, 0.8605428730F, 0.8651495278F, + 0.8696649882F, 0.8740891432F, 0.8784219392F, 0.8826633797F, + 0.8868135244F, 0.8908724888F, 0.8948404441F, 0.8987176157F, + 0.9025042831F, 0.9062007791F, 0.9098074886F, 0.9133248482F, + 0.9167533451F, 0.9200935163F, 0.9233459472F, 0.9265112712F, + 0.9295901680F, 0.9325833632F, 0.9354916263F, 0.9383157705F, + 0.9410566504F, 0.9437151618F, 0.9462922398F, 0.9487888576F, + 0.9512060252F, 0.9535447882F, 0.9558062262F, 0.9579914516F, + 0.9601016078F, 0.9621378683F, 0.9641014348F, 0.9659935361F, + 0.9678154261F, 0.9695683830F, 0.9712537071F, 0.9728727198F, + 0.9744267618F, 0.9759171916F, 0.9773453842F, 0.9787127293F, + 0.9800206298F, 0.9812705006F, 0.9824637665F, 0.9836018613F, + 0.9846862258F, 0.9857183066F, 0.9866995544F, 0.9876314227F, + 0.9885153662F, 0.9893528393F, 0.9901452948F, 0.9908941823F, + 0.9916009470F, 0.9922670279F, 0.9928938570F, 0.9934828574F, + 0.9940354423F, 0.9945530133F, 0.9950369595F, 0.9954886562F, + 0.9959094633F, 0.9963007242F, 0.9966637649F, 0.9969998925F, + 0.9973103939F, 0.9975965351F, 0.9978595598F, 0.9981006885F, + 0.9983211172F, 0.9985220166F, 0.9987045311F, 0.9988697776F, + 0.9990188449F, 0.9991527924F, 0.9992726499F, 0.9993794157F, + 0.9994740570F, 0.9995575079F, 0.9996306699F, 0.9996944099F, + 0.9997495605F, 0.9997969190F, 0.9998372465F, 0.9998712678F, + 0.9998996704F, 0.9999231041F, 0.9999421807F, 0.9999574732F, + 0.9999695157F, 0.9999788026F, 0.9999857885F, 0.9999908879F, + 0.9999944746F, 0.9999968817F, 0.9999984010F, 0.9999992833F, + 0.9999997377F, 0.9999999317F, 0.9999999911F, 0.9999999999F, +}; + +static float vwin1024[512] = { + 0.0000036962F, 0.0000332659F, 0.0000924041F, 0.0001811086F, + 0.0002993761F, 0.0004472021F, 0.0006245811F, 0.0008315063F, + 0.0010679699F, 0.0013339631F, 0.0016294757F, 0.0019544965F, + 0.0023090133F, 0.0026930125F, 0.0031064797F, 0.0035493989F, + 0.0040217533F, 0.0045235250F, 0.0050546946F, 0.0056152418F, + 0.0062051451F, 0.0068243817F, 0.0074729278F, 0.0081507582F, + 0.0088578466F, 0.0095941655F, 0.0103596863F, 0.0111543789F, + 0.0119782122F, 0.0128311538F, 0.0137131701F, 0.0146242260F, + 0.0155642855F, 0.0165333111F, 0.0175312640F, 0.0185581042F, + 0.0196137903F, 0.0206982797F, 0.0218115284F, 0.0229534910F, + 0.0241241208F, 0.0253233698F, 0.0265511886F, 0.0278075263F, + 0.0290923308F, 0.0304055484F, 0.0317471241F, 0.0331170013F, + 0.0345151222F, 0.0359414274F, 0.0373958560F, 0.0388783456F, + 0.0403888325F, 0.0419272511F, 0.0434935347F, 0.0450876148F, + 0.0467094213F, 0.0483588828F, 0.0500359261F, 0.0517404765F, + 0.0534724575F, 0.0552317913F, 0.0570183983F, 0.0588321971F, + 0.0606731048F, 0.0625410369F, 0.0644359070F, 0.0663576272F, + 0.0683061077F, 0.0702812571F, 0.0722829821F, 0.0743111878F, + 0.0763657775F, 0.0784466526F, 0.0805537129F, 0.0826868561F, + 0.0848459782F, 0.0870309736F, 0.0892417345F, 0.0914781514F, + 0.0937401128F, 0.0960275056F, 0.0983402145F, 0.1006781223F, + 0.1030411101F, 0.1054290568F, 0.1078418397F, 0.1102793336F, + 0.1127414119F, 0.1152279457F, 0.1177388042F, 0.1202738544F, + 0.1228329618F, 0.1254159892F, 0.1280227980F, 0.1306532471F, + 0.1333071937F, 0.1359844927F, 0.1386849970F, 0.1414085575F, + 0.1441550230F, 0.1469242403F, 0.1497160539F, 0.1525303063F, + 0.1553668381F, 0.1582254875F, 0.1611060909F, 0.1640084822F, + 0.1669324936F, 0.1698779549F, 0.1728446939F, 0.1758325362F, + 0.1788413055F, 0.1818708232F, 0.1849209084F, 0.1879913785F, + 0.1910820485F, 0.1941927312F, 0.1973232376F, 0.2004733764F, + 0.2036429541F, 0.2068317752F, 0.2100396421F, 0.2132663552F, + 0.2165117125F, 0.2197755102F, 0.2230575422F, 0.2263576007F, + 0.2296754753F, 0.2330109540F, 0.2363638225F, 0.2397338646F, + 0.2431208619F, 0.2465245941F, 0.2499448389F, 0.2533813719F, + 0.2568339669F, 0.2603023956F, 0.2637864277F, 0.2672858312F, + 0.2708003718F, 0.2743298135F, 0.2778739186F, 0.2814324472F, + 0.2850051576F, 0.2885918065F, 0.2921921485F, 0.2958059366F, + 0.2994329219F, 0.3030728538F, 0.3067254799F, 0.3103905462F, + 0.3140677969F, 0.3177569747F, 0.3214578205F, 0.3251700736F, + 0.3288934718F, 0.3326277513F, 0.3363726468F, 0.3401278914F, + 0.3438932168F, 0.3476683533F, 0.3514530297F, 0.3552469734F, + 0.3590499106F, 0.3628615659F, 0.3666816630F, 0.3705099239F, + 0.3743460698F, 0.3781898204F, 0.3820408945F, 0.3858990095F, + 0.3897638820F, 0.3936352274F, 0.3975127601F, 0.4013961936F, + 0.4052852405F, 0.4091796123F, 0.4130790198F, 0.4169831732F, + 0.4208917815F, 0.4248045534F, 0.4287211965F, 0.4326414181F, + 0.4365649248F, 0.4404914225F, 0.4444206167F, 0.4483522125F, + 0.4522859146F, 0.4562214270F, 0.4601584538F, 0.4640966984F, + 0.4680358644F, 0.4719756548F, 0.4759157726F, 0.4798559209F, + 0.4837958024F, 0.4877351199F, 0.4916735765F, 0.4956108751F, + 0.4995467188F, 0.5034808109F, 0.5074128550F, 0.5113425550F, + 0.5152696149F, 0.5191937395F, 0.5231146336F, 0.5270320028F, + 0.5309455530F, 0.5348549910F, 0.5387600239F, 0.5426603597F, + 0.5465557070F, 0.5504457754F, 0.5543302752F, 0.5582089175F, + 0.5620814145F, 0.5659474793F, 0.5698068262F, 0.5736591704F, + 0.5775042283F, 0.5813417176F, 0.5851713571F, 0.5889928670F, + 0.5928059689F, 0.5966103856F, 0.6004058415F, 0.6041920626F, + 0.6079687761F, 0.6117357113F, 0.6154925986F, 0.6192391705F, + 0.6229751612F, 0.6267003064F, 0.6304143441F, 0.6341170137F, + 0.6378080569F, 0.6414872173F, 0.6451542405F, 0.6488088741F, + 0.6524508681F, 0.6560799742F, 0.6596959469F, 0.6632985424F, + 0.6668875197F, 0.6704626398F, 0.6740236662F, 0.6775703649F, + 0.6811025043F, 0.6846198554F, 0.6881221916F, 0.6916092892F, + 0.6950809269F, 0.6985368861F, 0.7019769510F, 0.7054009085F, + 0.7088085484F, 0.7121996632F, 0.7155740484F, 0.7189315023F, + 0.7222718263F, 0.7255948245F, 0.7289003043F, 0.7321880760F, + 0.7354579530F, 0.7387097518F, 0.7419432921F, 0.7451583966F, + 0.7483548915F, 0.7515326059F, 0.7546913723F, 0.7578310265F, + 0.7609514077F, 0.7640523581F, 0.7671337237F, 0.7701953535F, + 0.7732371001F, 0.7762588195F, 0.7792603711F, 0.7822416178F, + 0.7852024259F, 0.7881426654F, 0.7910622097F, 0.7939609356F, + 0.7968387237F, 0.7996954579F, 0.8025310261F, 0.8053453193F, + 0.8081382324F, 0.8109096638F, 0.8136595156F, 0.8163876936F, + 0.8190941071F, 0.8217786690F, 0.8244412960F, 0.8270819086F, + 0.8297004305F, 0.8322967896F, 0.8348709171F, 0.8374227481F, + 0.8399522213F, 0.8424592789F, 0.8449438672F, 0.8474059356F, + 0.8498454378F, 0.8522623306F, 0.8546565748F, 0.8570281348F, + 0.8593769787F, 0.8617030779F, 0.8640064080F, 0.8662869477F, + 0.8685446796F, 0.8707795899F, 0.8729916682F, 0.8751809079F, + 0.8773473059F, 0.8794908626F, 0.8816115819F, 0.8837094713F, + 0.8857845418F, 0.8878368079F, 0.8898662874F, 0.8918730019F, + 0.8938569760F, 0.8958182380F, 0.8977568194F, 0.8996727552F, + 0.9015660837F, 0.9034368465F, 0.9052850885F, 0.9071108577F, + 0.9089142057F, 0.9106951869F, 0.9124538591F, 0.9141902832F, + 0.9159045233F, 0.9175966464F, 0.9192667228F, 0.9209148257F, + 0.9225410313F, 0.9241454187F, 0.9257280701F, 0.9272890704F, + 0.9288285075F, 0.9303464720F, 0.9318430576F, 0.9333183603F, + 0.9347724792F, 0.9362055158F, 0.9376175745F, 0.9390087622F, + 0.9403791881F, 0.9417289644F, 0.9430582055F, 0.9443670283F, + 0.9456555521F, 0.9469238986F, 0.9481721917F, 0.9494005577F, + 0.9506091252F, 0.9517980248F, 0.9529673894F, 0.9541173540F, + 0.9552480557F, 0.9563596334F, 0.9574522282F, 0.9585259830F, + 0.9595810428F, 0.9606175542F, 0.9616356656F, 0.9626355274F, + 0.9636172915F, 0.9645811114F, 0.9655271425F, 0.9664555414F, + 0.9673664664F, 0.9682600774F, 0.9691365355F, 0.9699960034F, + 0.9708386448F, 0.9716646250F, 0.9724741103F, 0.9732672685F, + 0.9740442683F, 0.9748052795F, 0.9755504729F, 0.9762800205F, + 0.9769940950F, 0.9776928703F, 0.9783765210F, 0.9790452223F, + 0.9796991504F, 0.9803384823F, 0.9809633954F, 0.9815740679F, + 0.9821706784F, 0.9827534063F, 0.9833224312F, 0.9838779332F, + 0.9844200928F, 0.9849490910F, 0.9854651087F, 0.9859683274F, + 0.9864589286F, 0.9869370940F, 0.9874030054F, 0.9878568447F, + 0.9882987937F, 0.9887290343F, 0.9891477481F, 0.9895551169F, + 0.9899513220F, 0.9903365446F, 0.9907109658F, 0.9910747662F, + 0.9914281260F, 0.9917712252F, 0.9921042433F, 0.9924273593F, + 0.9927407516F, 0.9930445982F, 0.9933390763F, 0.9936243626F, + 0.9939006331F, 0.9941680631F, 0.9944268269F, 0.9946770982F, + 0.9949190498F, 0.9951528537F, 0.9953786808F, 0.9955967011F, + 0.9958070836F, 0.9960099963F, 0.9962056061F, 0.9963940787F, + 0.9965755786F, 0.9967502693F, 0.9969183129F, 0.9970798704F, + 0.9972351013F, 0.9973841640F, 0.9975272151F, 0.9976644103F, + 0.9977959036F, 0.9979218476F, 0.9980423932F, 0.9981576901F, + 0.9982678862F, 0.9983731278F, 0.9984735596F, 0.9985693247F, + 0.9986605645F, 0.9987474186F, 0.9988300248F, 0.9989085193F, + 0.9989830364F, 0.9990537085F, 0.9991206662F, 0.9991840382F, + 0.9992439513F, 0.9993005303F, 0.9993538982F, 0.9994041757F, + 0.9994514817F, 0.9994959330F, 0.9995376444F, 0.9995767286F, + 0.9996132960F, 0.9996474550F, 0.9996793121F, 0.9997089710F, + 0.9997365339F, 0.9997621003F, 0.9997857677F, 0.9998076311F, + 0.9998277836F, 0.9998463156F, 0.9998633155F, 0.9998788692F, + 0.9998930603F, 0.9999059701F, 0.9999176774F, 0.9999282586F, + 0.9999377880F, 0.9999463370F, 0.9999539749F, 0.9999607685F, + 0.9999667820F, 0.9999720773F, 0.9999767136F, 0.9999807479F, + 0.9999842344F, 0.9999872249F, 0.9999897688F, 0.9999919127F, + 0.9999937009F, 0.9999951749F, 0.9999963738F, 0.9999973342F, + 0.9999980900F, 0.9999986724F, 0.9999991103F, 0.9999994297F, + 0.9999996543F, 0.9999998049F, 0.9999999000F, 0.9999999552F, + 0.9999999836F, 0.9999999957F, 0.9999999994F, 1.0000000000F, +}; + +static float vwin2048[1024] = { + 0.0000009241F, 0.0000083165F, 0.0000231014F, 0.0000452785F, + 0.0000748476F, 0.0001118085F, 0.0001561608F, 0.0002079041F, + 0.0002670379F, 0.0003335617F, 0.0004074748F, 0.0004887765F, + 0.0005774661F, 0.0006735427F, 0.0007770054F, 0.0008878533F, + 0.0010060853F, 0.0011317002F, 0.0012646969F, 0.0014050742F, + 0.0015528307F, 0.0017079650F, 0.0018704756F, 0.0020403610F, + 0.0022176196F, 0.0024022497F, 0.0025942495F, 0.0027936173F, + 0.0030003511F, 0.0032144490F, 0.0034359088F, 0.0036647286F, + 0.0039009061F, 0.0041444391F, 0.0043953253F, 0.0046535621F, + 0.0049191472F, 0.0051920781F, 0.0054723520F, 0.0057599664F, + 0.0060549184F, 0.0063572052F, 0.0066668239F, 0.0069837715F, + 0.0073080449F, 0.0076396410F, 0.0079785566F, 0.0083247884F, + 0.0086783330F, 0.0090391871F, 0.0094073470F, 0.0097828092F, + 0.0101655700F, 0.0105556258F, 0.0109529726F, 0.0113576065F, + 0.0117695237F, 0.0121887200F, 0.0126151913F, 0.0130489335F, + 0.0134899422F, 0.0139382130F, 0.0143937415F, 0.0148565233F, + 0.0153265536F, 0.0158038279F, 0.0162883413F, 0.0167800889F, + 0.0172790660F, 0.0177852675F, 0.0182986882F, 0.0188193231F, + 0.0193471668F, 0.0198822141F, 0.0204244594F, 0.0209738974F, + 0.0215305225F, 0.0220943289F, 0.0226653109F, 0.0232434627F, + 0.0238287784F, 0.0244212519F, 0.0250208772F, 0.0256276481F, + 0.0262415582F, 0.0268626014F, 0.0274907711F, 0.0281260608F, + 0.0287684638F, 0.0294179736F, 0.0300745833F, 0.0307382859F, + 0.0314090747F, 0.0320869424F, 0.0327718819F, 0.0334638860F, + 0.0341629474F, 0.0348690586F, 0.0355822122F, 0.0363024004F, + 0.0370296157F, 0.0377638502F, 0.0385050960F, 0.0392533451F, + 0.0400085896F, 0.0407708211F, 0.0415400315F, 0.0423162123F, + 0.0430993552F, 0.0438894515F, 0.0446864926F, 0.0454904698F, + 0.0463013742F, 0.0471191969F, 0.0479439288F, 0.0487755607F, + 0.0496140836F, 0.0504594879F, 0.0513117642F, 0.0521709031F, + 0.0530368949F, 0.0539097297F, 0.0547893979F, 0.0556758894F, + 0.0565691941F, 0.0574693019F, 0.0583762026F, 0.0592898858F, + 0.0602103410F, 0.0611375576F, 0.0620715250F, 0.0630122324F, + 0.0639596688F, 0.0649138234F, 0.0658746848F, 0.0668422421F, + 0.0678164838F, 0.0687973985F, 0.0697849746F, 0.0707792005F, + 0.0717800645F, 0.0727875547F, 0.0738016591F, 0.0748223656F, + 0.0758496620F, 0.0768835359F, 0.0779239751F, 0.0789709668F, + 0.0800244985F, 0.0810845574F, 0.0821511306F, 0.0832242052F, + 0.0843037679F, 0.0853898056F, 0.0864823050F, 0.0875812525F, + 0.0886866347F, 0.0897984378F, 0.0909166480F, 0.0920412513F, + 0.0931722338F, 0.0943095813F, 0.0954532795F, 0.0966033140F, + 0.0977596702F, 0.0989223336F, 0.1000912894F, 0.1012665227F, + 0.1024480185F, 0.1036357616F, 0.1048297369F, 0.1060299290F, + 0.1072363224F, 0.1084489014F, 0.1096676504F, 0.1108925534F, + 0.1121235946F, 0.1133607577F, 0.1146040267F, 0.1158533850F, + 0.1171088163F, 0.1183703040F, 0.1196378312F, 0.1209113812F, + 0.1221909370F, 0.1234764815F, 0.1247679974F, 0.1260654674F, + 0.1273688740F, 0.1286781995F, 0.1299934263F, 0.1313145365F, + 0.1326415121F, 0.1339743349F, 0.1353129866F, 0.1366574490F, + 0.1380077035F, 0.1393637315F, 0.1407255141F, 0.1420930325F, + 0.1434662677F, 0.1448452004F, 0.1462298115F, 0.1476200814F, + 0.1490159906F, 0.1504175195F, 0.1518246482F, 0.1532373569F, + 0.1546556253F, 0.1560794333F, 0.1575087606F, 0.1589435866F, + 0.1603838909F, 0.1618296526F, 0.1632808509F, 0.1647374648F, + 0.1661994731F, 0.1676668546F, 0.1691395880F, 0.1706176516F, + 0.1721010238F, 0.1735896829F, 0.1750836068F, 0.1765827736F, + 0.1780871610F, 0.1795967468F, 0.1811115084F, 0.1826314234F, + 0.1841564689F, 0.1856866221F, 0.1872218600F, 0.1887621595F, + 0.1903074974F, 0.1918578503F, 0.1934131947F, 0.1949735068F, + 0.1965387630F, 0.1981089393F, 0.1996840117F, 0.2012639560F, + 0.2028487479F, 0.2044383630F, 0.2060327766F, 0.2076319642F, + 0.2092359007F, 0.2108445614F, 0.2124579211F, 0.2140759545F, + 0.2156986364F, 0.2173259411F, 0.2189578432F, 0.2205943168F, + 0.2222353361F, 0.2238808751F, 0.2255309076F, 0.2271854073F, + 0.2288443480F, 0.2305077030F, 0.2321754457F, 0.2338475493F, + 0.2355239869F, 0.2372047315F, 0.2388897560F, 0.2405790329F, + 0.2422725350F, 0.2439702347F, 0.2456721043F, 0.2473781159F, + 0.2490882418F, 0.2508024539F, 0.2525207240F, 0.2542430237F, + 0.2559693248F, 0.2576995986F, 0.2594338166F, 0.2611719498F, + 0.2629139695F, 0.2646598466F, 0.2664095520F, 0.2681630564F, + 0.2699203304F, 0.2716813445F, 0.2734460691F, 0.2752144744F, + 0.2769865307F, 0.2787622079F, 0.2805414760F, 0.2823243047F, + 0.2841106637F, 0.2859005227F, 0.2876938509F, 0.2894906179F, + 0.2912907928F, 0.2930943447F, 0.2949012426F, 0.2967114554F, + 0.2985249520F, 0.3003417009F, 0.3021616708F, 0.3039848301F, + 0.3058111471F, 0.3076405901F, 0.3094731273F, 0.3113087266F, + 0.3131473560F, 0.3149889833F, 0.3168335762F, 0.3186811024F, + 0.3205315294F, 0.3223848245F, 0.3242409552F, 0.3260998886F, + 0.3279615918F, 0.3298260319F, 0.3316931758F, 0.3335629903F, + 0.3354354423F, 0.3373104982F, 0.3391881247F, 0.3410682882F, + 0.3429509551F, 0.3448360917F, 0.3467236642F, 0.3486136387F, + 0.3505059811F, 0.3524006575F, 0.3542976336F, 0.3561968753F, + 0.3580983482F, 0.3600020179F, 0.3619078499F, 0.3638158096F, + 0.3657258625F, 0.3676379737F, 0.3695521086F, 0.3714682321F, + 0.3733863094F, 0.3753063055F, 0.3772281852F, 0.3791519134F, + 0.3810774548F, 0.3830047742F, 0.3849338362F, 0.3868646053F, + 0.3887970459F, 0.3907311227F, 0.3926667998F, 0.3946040417F, + 0.3965428125F, 0.3984830765F, 0.4004247978F, 0.4023679403F, + 0.4043124683F, 0.4062583455F, 0.4082055359F, 0.4101540034F, + 0.4121037117F, 0.4140546246F, 0.4160067058F, 0.4179599190F, + 0.4199142277F, 0.4218695956F, 0.4238259861F, 0.4257833627F, + 0.4277416888F, 0.4297009279F, 0.4316610433F, 0.4336219983F, + 0.4355837562F, 0.4375462803F, 0.4395095337F, 0.4414734797F, + 0.4434380815F, 0.4454033021F, 0.4473691046F, 0.4493354521F, + 0.4513023078F, 0.4532696345F, 0.4552373954F, 0.4572055533F, + 0.4591740713F, 0.4611429123F, 0.4631120393F, 0.4650814151F, + 0.4670510028F, 0.4690207650F, 0.4709906649F, 0.4729606651F, + 0.4749307287F, 0.4769008185F, 0.4788708972F, 0.4808409279F, + 0.4828108732F, 0.4847806962F, 0.4867503597F, 0.4887198264F, + 0.4906890593F, 0.4926580213F, 0.4946266753F, 0.4965949840F, + 0.4985629105F, 0.5005304176F, 0.5024974683F, 0.5044640255F, + 0.5064300522F, 0.5083955114F, 0.5103603659F, 0.5123245790F, + 0.5142881136F, 0.5162509328F, 0.5182129997F, 0.5201742774F, + 0.5221347290F, 0.5240943178F, 0.5260530070F, 0.5280107598F, + 0.5299675395F, 0.5319233095F, 0.5338780330F, 0.5358316736F, + 0.5377841946F, 0.5397355596F, 0.5416857320F, 0.5436346755F, + 0.5455823538F, 0.5475287304F, 0.5494737691F, 0.5514174337F, + 0.5533596881F, 0.5553004962F, 0.5572398218F, 0.5591776291F, + 0.5611138821F, 0.5630485449F, 0.5649815818F, 0.5669129570F, + 0.5688426349F, 0.5707705799F, 0.5726967564F, 0.5746211290F, + 0.5765436624F, 0.5784643212F, 0.5803830702F, 0.5822998743F, + 0.5842146984F, 0.5861275076F, 0.5880382669F, 0.5899469416F, + 0.5918534968F, 0.5937578981F, 0.5956601107F, 0.5975601004F, + 0.5994578326F, 0.6013532732F, 0.6032463880F, 0.6051371429F, + 0.6070255039F, 0.6089114372F, 0.6107949090F, 0.6126758856F, + 0.6145543334F, 0.6164302191F, 0.6183035092F, 0.6201741706F, + 0.6220421700F, 0.6239074745F, 0.6257700513F, 0.6276298674F, + 0.6294868903F, 0.6313410873F, 0.6331924262F, 0.6350408745F, + 0.6368864001F, 0.6387289710F, 0.6405685552F, 0.6424051209F, + 0.6442386364F, 0.6460690702F, 0.6478963910F, 0.6497205673F, + 0.6515415682F, 0.6533593625F, 0.6551739194F, 0.6569852082F, + 0.6587931984F, 0.6605978593F, 0.6623991609F, 0.6641970728F, + 0.6659915652F, 0.6677826081F, 0.6695701718F, 0.6713542268F, + 0.6731347437F, 0.6749116932F, 0.6766850461F, 0.6784547736F, + 0.6802208469F, 0.6819832374F, 0.6837419164F, 0.6854968559F, + 0.6872480275F, 0.6889954034F, 0.6907389556F, 0.6924786566F, + 0.6942144788F, 0.6959463950F, 0.6976743780F, 0.6993984008F, + 0.7011184365F, 0.7028344587F, 0.7045464407F, 0.7062543564F, + 0.7079581796F, 0.7096578844F, 0.7113534450F, 0.7130448359F, + 0.7147320316F, 0.7164150070F, 0.7180937371F, 0.7197681970F, + 0.7214383620F, 0.7231042077F, 0.7247657098F, 0.7264228443F, + 0.7280755871F, 0.7297239147F, 0.7313678035F, 0.7330072301F, + 0.7346421715F, 0.7362726046F, 0.7378985069F, 0.7395198556F, + 0.7411366285F, 0.7427488034F, 0.7443563584F, 0.7459592717F, + 0.7475575218F, 0.7491510873F, 0.7507399471F, 0.7523240803F, + 0.7539034661F, 0.7554780839F, 0.7570479136F, 0.7586129349F, + 0.7601731279F, 0.7617284730F, 0.7632789506F, 0.7648245416F, + 0.7663652267F, 0.7679009872F, 0.7694318044F, 0.7709576599F, + 0.7724785354F, 0.7739944130F, 0.7755052749F, 0.7770111035F, + 0.7785118815F, 0.7800075916F, 0.7814982170F, 0.7829837410F, + 0.7844641472F, 0.7859394191F, 0.7874095408F, 0.7888744965F, + 0.7903342706F, 0.7917888476F, 0.7932382124F, 0.7946823501F, + 0.7961212460F, 0.7975548855F, 0.7989832544F, 0.8004063386F, + 0.8018241244F, 0.8032365981F, 0.8046437463F, 0.8060455560F, + 0.8074420141F, 0.8088331080F, 0.8102188253F, 0.8115991536F, + 0.8129740810F, 0.8143435957F, 0.8157076861F, 0.8170663409F, + 0.8184195489F, 0.8197672994F, 0.8211095817F, 0.8224463853F, + 0.8237777001F, 0.8251035161F, 0.8264238235F, 0.8277386129F, + 0.8290478750F, 0.8303516008F, 0.8316497814F, 0.8329424083F, + 0.8342294731F, 0.8355109677F, 0.8367868841F, 0.8380572148F, + 0.8393219523F, 0.8405810893F, 0.8418346190F, 0.8430825345F, + 0.8443248294F, 0.8455614974F, 0.8467925323F, 0.8480179285F, + 0.8492376802F, 0.8504517822F, 0.8516602292F, 0.8528630164F, + 0.8540601391F, 0.8552515928F, 0.8564373733F, 0.8576174766F, + 0.8587918990F, 0.8599606368F, 0.8611236868F, 0.8622810460F, + 0.8634327113F, 0.8645786802F, 0.8657189504F, 0.8668535195F, + 0.8679823857F, 0.8691055472F, 0.8702230025F, 0.8713347503F, + 0.8724407896F, 0.8735411194F, 0.8746357394F, 0.8757246489F, + 0.8768078479F, 0.8778853364F, 0.8789571146F, 0.8800231832F, + 0.8810835427F, 0.8821381942F, 0.8831871387F, 0.8842303777F, + 0.8852679127F, 0.8862997456F, 0.8873258784F, 0.8883463132F, + 0.8893610527F, 0.8903700994F, 0.8913734562F, 0.8923711263F, + 0.8933631129F, 0.8943494196F, 0.8953300500F, 0.8963050083F, + 0.8972742985F, 0.8982379249F, 0.8991958922F, 0.9001482052F, + 0.9010948688F, 0.9020358883F, 0.9029712690F, 0.9039010165F, + 0.9048251367F, 0.9057436357F, 0.9066565195F, 0.9075637946F, + 0.9084654678F, 0.9093615456F, 0.9102520353F, 0.9111369440F, + 0.9120162792F, 0.9128900484F, 0.9137582595F, 0.9146209204F, + 0.9154780394F, 0.9163296248F, 0.9171756853F, 0.9180162296F, + 0.9188512667F, 0.9196808057F, 0.9205048559F, 0.9213234270F, + 0.9221365285F, 0.9229441704F, 0.9237463629F, 0.9245431160F, + 0.9253344404F, 0.9261203465F, 0.9269008453F, 0.9276759477F, + 0.9284456648F, 0.9292100080F, 0.9299689889F, 0.9307226190F, + 0.9314709103F, 0.9322138747F, 0.9329515245F, 0.9336838721F, + 0.9344109300F, 0.9351327108F, 0.9358492275F, 0.9365604931F, + 0.9372665208F, 0.9379673239F, 0.9386629160F, 0.9393533107F, + 0.9400385220F, 0.9407185637F, 0.9413934501F, 0.9420631954F, + 0.9427278141F, 0.9433873208F, 0.9440417304F, 0.9446910576F, + 0.9453353176F, 0.9459745255F, 0.9466086968F, 0.9472378469F, + 0.9478619915F, 0.9484811463F, 0.9490953274F, 0.9497045506F, + 0.9503088323F, 0.9509081888F, 0.9515026365F, 0.9520921921F, + 0.9526768723F, 0.9532566940F, 0.9538316742F, 0.9544018300F, + 0.9549671786F, 0.9555277375F, 0.9560835241F, 0.9566345562F, + 0.9571808513F, 0.9577224275F, 0.9582593027F, 0.9587914949F, + 0.9593190225F, 0.9598419038F, 0.9603601571F, 0.9608738012F, + 0.9613828546F, 0.9618873361F, 0.9623872646F, 0.9628826591F, + 0.9633735388F, 0.9638599227F, 0.9643418303F, 0.9648192808F, + 0.9652922939F, 0.9657608890F, 0.9662250860F, 0.9666849046F, + 0.9671403646F, 0.9675914861F, 0.9680382891F, 0.9684807937F, + 0.9689190202F, 0.9693529890F, 0.9697827203F, 0.9702082347F, + 0.9706295529F, 0.9710466953F, 0.9714596828F, 0.9718685362F, + 0.9722732762F, 0.9726739240F, 0.9730705005F, 0.9734630267F, + 0.9738515239F, 0.9742360134F, 0.9746165163F, 0.9749930540F, + 0.9753656481F, 0.9757343198F, 0.9760990909F, 0.9764599829F, + 0.9768170175F, 0.9771702164F, 0.9775196013F, 0.9778651941F, + 0.9782070167F, 0.9785450909F, 0.9788794388F, 0.9792100824F, + 0.9795370437F, 0.9798603449F, 0.9801800080F, 0.9804960554F, + 0.9808085092F, 0.9811173916F, 0.9814227251F, 0.9817245318F, + 0.9820228343F, 0.9823176549F, 0.9826090160F, 0.9828969402F, + 0.9831814498F, 0.9834625674F, 0.9837403156F, 0.9840147169F, + 0.9842857939F, 0.9845535692F, 0.9848180654F, 0.9850793052F, + 0.9853373113F, 0.9855921062F, 0.9858437127F, 0.9860921535F, + 0.9863374512F, 0.9865796287F, 0.9868187085F, 0.9870547136F, + 0.9872876664F, 0.9875175899F, 0.9877445067F, 0.9879684396F, + 0.9881894112F, 0.9884074444F, 0.9886225619F, 0.9888347863F, + 0.9890441404F, 0.9892506468F, 0.9894543284F, 0.9896552077F, + 0.9898533074F, 0.9900486502F, 0.9902412587F, 0.9904311555F, + 0.9906183633F, 0.9908029045F, 0.9909848019F, 0.9911640779F, + 0.9913407550F, 0.9915148557F, 0.9916864025F, 0.9918554179F, + 0.9920219241F, 0.9921859437F, 0.9923474989F, 0.9925066120F, + 0.9926633054F, 0.9928176012F, 0.9929695218F, 0.9931190891F, + 0.9932663254F, 0.9934112527F, 0.9935538932F, 0.9936942686F, + 0.9938324012F, 0.9939683126F, 0.9941020248F, 0.9942335597F, + 0.9943629388F, 0.9944901841F, 0.9946153170F, 0.9947383593F, + 0.9948593325F, 0.9949782579F, 0.9950951572F, 0.9952100516F, + 0.9953229625F, 0.9954339111F, 0.9955429186F, 0.9956500062F, + 0.9957551948F, 0.9958585056F, 0.9959599593F, 0.9960595769F, + 0.9961573792F, 0.9962533869F, 0.9963476206F, 0.9964401009F, + 0.9965308483F, 0.9966198833F, 0.9967072261F, 0.9967928971F, + 0.9968769164F, 0.9969593041F, 0.9970400804F, 0.9971192651F, + 0.9971968781F, 0.9972729391F, 0.9973474680F, 0.9974204842F, + 0.9974920074F, 0.9975620569F, 0.9976306521F, 0.9976978122F, + 0.9977635565F, 0.9978279039F, 0.9978908736F, 0.9979524842F, + 0.9980127547F, 0.9980717037F, 0.9981293499F, 0.9981857116F, + 0.9982408073F, 0.9982946554F, 0.9983472739F, 0.9983986810F, + 0.9984488947F, 0.9984979328F, 0.9985458132F, 0.9985925534F, + 0.9986381711F, 0.9986826838F, 0.9987261086F, 0.9987684630F, + 0.9988097640F, 0.9988500286F, 0.9988892738F, 0.9989275163F, + 0.9989647727F, 0.9990010597F, 0.9990363938F, 0.9990707911F, + 0.9991042679F, 0.9991368404F, 0.9991685244F, 0.9991993358F, + 0.9992292905F, 0.9992584038F, 0.9992866914F, 0.9993141686F, + 0.9993408506F, 0.9993667526F, 0.9993918895F, 0.9994162761F, + 0.9994399273F, 0.9994628576F, 0.9994850815F, 0.9995066133F, + 0.9995274672F, 0.9995476574F, 0.9995671978F, 0.9995861021F, + 0.9996043841F, 0.9996220573F, 0.9996391352F, 0.9996556310F, + 0.9996715579F, 0.9996869288F, 0.9997017568F, 0.9997160543F, + 0.9997298342F, 0.9997431088F, 0.9997558905F, 0.9997681914F, + 0.9997800236F, 0.9997913990F, 0.9998023292F, 0.9998128261F, + 0.9998229009F, 0.9998325650F, 0.9998418296F, 0.9998507058F, + 0.9998592044F, 0.9998673362F, 0.9998751117F, 0.9998825415F, + 0.9998896358F, 0.9998964047F, 0.9999028584F, 0.9999090066F, + 0.9999148590F, 0.9999204253F, 0.9999257148F, 0.9999307368F, + 0.9999355003F, 0.9999400144F, 0.9999442878F, 0.9999483293F, + 0.9999521472F, 0.9999557499F, 0.9999591457F, 0.9999623426F, + 0.9999653483F, 0.9999681708F, 0.9999708175F, 0.9999732959F, + 0.9999756132F, 0.9999777765F, 0.9999797928F, 0.9999816688F, + 0.9999834113F, 0.9999850266F, 0.9999865211F, 0.9999879009F, + 0.9999891721F, 0.9999903405F, 0.9999914118F, 0.9999923914F, + 0.9999932849F, 0.9999940972F, 0.9999948336F, 0.9999954989F, + 0.9999960978F, 0.9999966349F, 0.9999971146F, 0.9999975411F, + 0.9999979185F, 0.9999982507F, 0.9999985414F, 0.9999987944F, + 0.9999990129F, 0.9999992003F, 0.9999993596F, 0.9999994939F, + 0.9999996059F, 0.9999996981F, 0.9999997732F, 0.9999998333F, + 0.9999998805F, 0.9999999170F, 0.9999999444F, 0.9999999643F, + 0.9999999784F, 0.9999999878F, 0.9999999937F, 0.9999999972F, + 0.9999999990F, 0.9999999997F, 1.0000000000F, 1.0000000000F, +}; + +static float vwin4096[2048] = { + 0.0000002310F, 0.0000020791F, 0.0000057754F, 0.0000113197F, + 0.0000187121F, 0.0000279526F, 0.0000390412F, 0.0000519777F, + 0.0000667623F, 0.0000833949F, 0.0001018753F, 0.0001222036F, + 0.0001443798F, 0.0001684037F, 0.0001942754F, 0.0002219947F, + 0.0002515616F, 0.0002829761F, 0.0003162380F, 0.0003513472F, + 0.0003883038F, 0.0004271076F, 0.0004677584F, 0.0005102563F, + 0.0005546011F, 0.0006007928F, 0.0006488311F, 0.0006987160F, + 0.0007504474F, 0.0008040251F, 0.0008594490F, 0.0009167191F, + 0.0009758351F, 0.0010367969F, 0.0010996044F, 0.0011642574F, + 0.0012307558F, 0.0012990994F, 0.0013692880F, 0.0014413216F, + 0.0015151998F, 0.0015909226F, 0.0016684898F, 0.0017479011F, + 0.0018291565F, 0.0019122556F, 0.0019971983F, 0.0020839845F, + 0.0021726138F, 0.0022630861F, 0.0023554012F, 0.0024495588F, + 0.0025455588F, 0.0026434008F, 0.0027430847F, 0.0028446103F, + 0.0029479772F, 0.0030531853F, 0.0031602342F, 0.0032691238F, + 0.0033798538F, 0.0034924239F, 0.0036068338F, 0.0037230833F, + 0.0038411721F, 0.0039610999F, 0.0040828664F, 0.0042064714F, + 0.0043319145F, 0.0044591954F, 0.0045883139F, 0.0047192696F, + 0.0048520622F, 0.0049866914F, 0.0051231569F, 0.0052614583F, + 0.0054015953F, 0.0055435676F, 0.0056873748F, 0.0058330166F, + 0.0059804926F, 0.0061298026F, 0.0062809460F, 0.0064339226F, + 0.0065887320F, 0.0067453738F, 0.0069038476F, 0.0070641531F, + 0.0072262899F, 0.0073902575F, 0.0075560556F, 0.0077236838F, + 0.0078931417F, 0.0080644288F, 0.0082375447F, 0.0084124891F, + 0.0085892615F, 0.0087678614F, 0.0089482885F, 0.0091305422F, + 0.0093146223F, 0.0095005281F, 0.0096882592F, 0.0098778153F, + 0.0100691958F, 0.0102624002F, 0.0104574281F, 0.0106542791F, + 0.0108529525F, 0.0110534480F, 0.0112557651F, 0.0114599032F, + 0.0116658618F, 0.0118736405F, 0.0120832387F, 0.0122946560F, + 0.0125078917F, 0.0127229454F, 0.0129398166F, 0.0131585046F, + 0.0133790090F, 0.0136013292F, 0.0138254647F, 0.0140514149F, + 0.0142791792F, 0.0145087572F, 0.0147401481F, 0.0149733515F, + 0.0152083667F, 0.0154451932F, 0.0156838304F, 0.0159242777F, + 0.0161665345F, 0.0164106001F, 0.0166564741F, 0.0169041557F, + 0.0171536443F, 0.0174049393F, 0.0176580401F, 0.0179129461F, + 0.0181696565F, 0.0184281708F, 0.0186884883F, 0.0189506084F, + 0.0192145303F, 0.0194802535F, 0.0197477772F, 0.0200171008F, + 0.0202882236F, 0.0205611449F, 0.0208358639F, 0.0211123801F, + 0.0213906927F, 0.0216708011F, 0.0219527043F, 0.0222364019F, + 0.0225218930F, 0.0228091769F, 0.0230982529F, 0.0233891203F, + 0.0236817782F, 0.0239762259F, 0.0242724628F, 0.0245704880F, + 0.0248703007F, 0.0251719002F, 0.0254752858F, 0.0257804565F, + 0.0260874117F, 0.0263961506F, 0.0267066722F, 0.0270189760F, + 0.0273330609F, 0.0276489263F, 0.0279665712F, 0.0282859949F, + 0.0286071966F, 0.0289301753F, 0.0292549303F, 0.0295814607F, + 0.0299097656F, 0.0302398442F, 0.0305716957F, 0.0309053191F, + 0.0312407135F, 0.0315778782F, 0.0319168122F, 0.0322575145F, + 0.0325999844F, 0.0329442209F, 0.0332902231F, 0.0336379900F, + 0.0339875208F, 0.0343388146F, 0.0346918703F, 0.0350466871F, + 0.0354032640F, 0.0357616000F, 0.0361216943F, 0.0364835458F, + 0.0368471535F, 0.0372125166F, 0.0375796339F, 0.0379485046F, + 0.0383191276F, 0.0386915020F, 0.0390656267F, 0.0394415008F, + 0.0398191231F, 0.0401984927F, 0.0405796086F, 0.0409624698F, + 0.0413470751F, 0.0417334235F, 0.0421215141F, 0.0425113457F, + 0.0429029172F, 0.0432962277F, 0.0436912760F, 0.0440880610F, + 0.0444865817F, 0.0448868370F, 0.0452888257F, 0.0456925468F, + 0.0460979992F, 0.0465051816F, 0.0469140931F, 0.0473247325F, + 0.0477370986F, 0.0481511902F, 0.0485670064F, 0.0489845458F, + 0.0494038074F, 0.0498247899F, 0.0502474922F, 0.0506719131F, + 0.0510980514F, 0.0515259060F, 0.0519554756F, 0.0523867590F, + 0.0528197550F, 0.0532544624F, 0.0536908800F, 0.0541290066F, + 0.0545688408F, 0.0550103815F, 0.0554536274F, 0.0558985772F, + 0.0563452297F, 0.0567935837F, 0.0572436377F, 0.0576953907F, + 0.0581488412F, 0.0586039880F, 0.0590608297F, 0.0595193651F, + 0.0599795929F, 0.0604415117F, 0.0609051202F, 0.0613704170F, + 0.0618374009F, 0.0623060704F, 0.0627764243F, 0.0632484611F, + 0.0637221795F, 0.0641975781F, 0.0646746555F, 0.0651534104F, + 0.0656338413F, 0.0661159469F, 0.0665997257F, 0.0670851763F, + 0.0675722973F, 0.0680610873F, 0.0685515448F, 0.0690436684F, + 0.0695374567F, 0.0700329081F, 0.0705300213F, 0.0710287947F, + 0.0715292269F, 0.0720313163F, 0.0725350616F, 0.0730404612F, + 0.0735475136F, 0.0740562172F, 0.0745665707F, 0.0750785723F, + 0.0755922207F, 0.0761075143F, 0.0766244515F, 0.0771430307F, + 0.0776632505F, 0.0781851092F, 0.0787086052F, 0.0792337371F, + 0.0797605032F, 0.0802889018F, 0.0808189315F, 0.0813505905F, + 0.0818838773F, 0.0824187903F, 0.0829553277F, 0.0834934881F, + 0.0840332697F, 0.0845746708F, 0.0851176899F, 0.0856623252F, + 0.0862085751F, 0.0867564379F, 0.0873059119F, 0.0878569954F, + 0.0884096867F, 0.0889639840F, 0.0895198858F, 0.0900773902F, + 0.0906364955F, 0.0911972000F, 0.0917595019F, 0.0923233995F, + 0.0928888909F, 0.0934559745F, 0.0940246485F, 0.0945949110F, + 0.0951667604F, 0.0957401946F, 0.0963152121F, 0.0968918109F, + 0.0974699893F, 0.0980497454F, 0.0986310773F, 0.0992139832F, + 0.0997984614F, 0.1003845098F, 0.1009721267F, 0.1015613101F, + 0.1021520582F, 0.1027443692F, 0.1033382410F, 0.1039336718F, + 0.1045306597F, 0.1051292027F, 0.1057292990F, 0.1063309466F, + 0.1069341435F, 0.1075388878F, 0.1081451776F, 0.1087530108F, + 0.1093623856F, 0.1099732998F, 0.1105857516F, 0.1111997389F, + 0.1118152597F, 0.1124323121F, 0.1130508939F, 0.1136710032F, + 0.1142926379F, 0.1149157960F, 0.1155404755F, 0.1161666742F, + 0.1167943901F, 0.1174236211F, 0.1180543652F, 0.1186866202F, + 0.1193203841F, 0.1199556548F, 0.1205924300F, 0.1212307078F, + 0.1218704860F, 0.1225117624F, 0.1231545349F, 0.1237988013F, + 0.1244445596F, 0.1250918074F, 0.1257405427F, 0.1263907632F, + 0.1270424667F, 0.1276956512F, 0.1283503142F, 0.1290064537F, + 0.1296640674F, 0.1303231530F, 0.1309837084F, 0.1316457312F, + 0.1323092193F, 0.1329741703F, 0.1336405820F, 0.1343084520F, + 0.1349777782F, 0.1356485582F, 0.1363207897F, 0.1369944704F, + 0.1376695979F, 0.1383461700F, 0.1390241842F, 0.1397036384F, + 0.1403845300F, 0.1410668567F, 0.1417506162F, 0.1424358061F, + 0.1431224240F, 0.1438104674F, 0.1444999341F, 0.1451908216F, + 0.1458831274F, 0.1465768492F, 0.1472719844F, 0.1479685308F, + 0.1486664857F, 0.1493658468F, 0.1500666115F, 0.1507687775F, + 0.1514723422F, 0.1521773031F, 0.1528836577F, 0.1535914035F, + 0.1543005380F, 0.1550110587F, 0.1557229631F, 0.1564362485F, + 0.1571509124F, 0.1578669524F, 0.1585843657F, 0.1593031499F, + 0.1600233024F, 0.1607448205F, 0.1614677017F, 0.1621919433F, + 0.1629175428F, 0.1636444975F, 0.1643728047F, 0.1651024619F, + 0.1658334665F, 0.1665658156F, 0.1672995067F, 0.1680345371F, + 0.1687709041F, 0.1695086050F, 0.1702476372F, 0.1709879978F, + 0.1717296843F, 0.1724726938F, 0.1732170237F, 0.1739626711F, + 0.1747096335F, 0.1754579079F, 0.1762074916F, 0.1769583819F, + 0.1777105760F, 0.1784640710F, 0.1792188642F, 0.1799749529F, + 0.1807323340F, 0.1814910049F, 0.1822509628F, 0.1830122046F, + 0.1837747277F, 0.1845385292F, 0.1853036062F, 0.1860699558F, + 0.1868375751F, 0.1876064613F, 0.1883766114F, 0.1891480226F, + 0.1899206919F, 0.1906946164F, 0.1914697932F, 0.1922462194F, + 0.1930238919F, 0.1938028079F, 0.1945829643F, 0.1953643583F, + 0.1961469868F, 0.1969308468F, 0.1977159353F, 0.1985022494F, + 0.1992897859F, 0.2000785420F, 0.2008685145F, 0.2016597005F, + 0.2024520968F, 0.2032457005F, 0.2040405084F, 0.2048365175F, + 0.2056337247F, 0.2064321269F, 0.2072317211F, 0.2080325041F, + 0.2088344727F, 0.2096376240F, 0.2104419547F, 0.2112474618F, + 0.2120541420F, 0.2128619923F, 0.2136710094F, 0.2144811902F, + 0.2152925315F, 0.2161050301F, 0.2169186829F, 0.2177334866F, + 0.2185494381F, 0.2193665340F, 0.2201847712F, 0.2210041465F, + 0.2218246565F, 0.2226462981F, 0.2234690680F, 0.2242929629F, + 0.2251179796F, 0.2259441147F, 0.2267713650F, 0.2275997272F, + 0.2284291979F, 0.2292597739F, 0.2300914518F, 0.2309242283F, + 0.2317581001F, 0.2325930638F, 0.2334291160F, 0.2342662534F, + 0.2351044727F, 0.2359437703F, 0.2367841431F, 0.2376255875F, + 0.2384681001F, 0.2393116776F, 0.2401563165F, 0.2410020134F, + 0.2418487649F, 0.2426965675F, 0.2435454178F, 0.2443953122F, + 0.2452462474F, 0.2460982199F, 0.2469512262F, 0.2478052628F, + 0.2486603262F, 0.2495164129F, 0.2503735194F, 0.2512316421F, + 0.2520907776F, 0.2529509222F, 0.2538120726F, 0.2546742250F, + 0.2555373760F, 0.2564015219F, 0.2572666593F, 0.2581327845F, + 0.2589998939F, 0.2598679840F, 0.2607370510F, 0.2616070916F, + 0.2624781019F, 0.2633500783F, 0.2642230173F, 0.2650969152F, + 0.2659717684F, 0.2668475731F, 0.2677243257F, 0.2686020226F, + 0.2694806601F, 0.2703602344F, 0.2712407419F, 0.2721221789F, + 0.2730045417F, 0.2738878265F, 0.2747720297F, 0.2756571474F, + 0.2765431760F, 0.2774301117F, 0.2783179508F, 0.2792066895F, + 0.2800963240F, 0.2809868505F, 0.2818782654F, 0.2827705647F, + 0.2836637447F, 0.2845578016F, 0.2854527315F, 0.2863485307F, + 0.2872451953F, 0.2881427215F, 0.2890411055F, 0.2899403433F, + 0.2908404312F, 0.2917413654F, 0.2926431418F, 0.2935457567F, + 0.2944492061F, 0.2953534863F, 0.2962585932F, 0.2971645230F, + 0.2980712717F, 0.2989788356F, 0.2998872105F, 0.3007963927F, + 0.3017063781F, 0.3026171629F, 0.3035287430F, 0.3044411145F, + 0.3053542736F, 0.3062682161F, 0.3071829381F, 0.3080984356F, + 0.3090147047F, 0.3099317413F, 0.3108495414F, 0.3117681011F, + 0.3126874163F, 0.3136074830F, 0.3145282972F, 0.3154498548F, + 0.3163721517F, 0.3172951841F, 0.3182189477F, 0.3191434385F, + 0.3200686525F, 0.3209945856F, 0.3219212336F, 0.3228485927F, + 0.3237766585F, 0.3247054271F, 0.3256348943F, 0.3265650560F, + 0.3274959081F, 0.3284274465F, 0.3293596671F, 0.3302925657F, + 0.3312261382F, 0.3321603804F, 0.3330952882F, 0.3340308574F, + 0.3349670838F, 0.3359039634F, 0.3368414919F, 0.3377796651F, + 0.3387184789F, 0.3396579290F, 0.3405980113F, 0.3415387216F, + 0.3424800556F, 0.3434220091F, 0.3443645779F, 0.3453077578F, + 0.3462515446F, 0.3471959340F, 0.3481409217F, 0.3490865036F, + 0.3500326754F, 0.3509794328F, 0.3519267715F, 0.3528746873F, + 0.3538231759F, 0.3547722330F, 0.3557218544F, 0.3566720357F, + 0.3576227727F, 0.3585740610F, 0.3595258964F, 0.3604782745F, + 0.3614311910F, 0.3623846417F, 0.3633386221F, 0.3642931280F, + 0.3652481549F, 0.3662036987F, 0.3671597548F, 0.3681163191F, + 0.3690733870F, 0.3700309544F, 0.3709890167F, 0.3719475696F, + 0.3729066089F, 0.3738661299F, 0.3748261285F, 0.3757866002F, + 0.3767475406F, 0.3777089453F, 0.3786708100F, 0.3796331302F, + 0.3805959014F, 0.3815591194F, 0.3825227796F, 0.3834868777F, + 0.3844514093F, 0.3854163698F, 0.3863817549F, 0.3873475601F, + 0.3883137810F, 0.3892804131F, 0.3902474521F, 0.3912148933F, + 0.3921827325F, 0.3931509650F, 0.3941195865F, 0.3950885925F, + 0.3960579785F, 0.3970277400F, 0.3979978725F, 0.3989683716F, + 0.3999392328F, 0.4009104516F, 0.4018820234F, 0.4028539438F, + 0.4038262084F, 0.4047988125F, 0.4057717516F, 0.4067450214F, + 0.4077186172F, 0.4086925345F, 0.4096667688F, 0.4106413155F, + 0.4116161703F, 0.4125913284F, 0.4135667854F, 0.4145425368F, + 0.4155185780F, 0.4164949044F, 0.4174715116F, 0.4184483949F, + 0.4194255498F, 0.4204029718F, 0.4213806563F, 0.4223585987F, + 0.4233367946F, 0.4243152392F, 0.4252939281F, 0.4262728566F, + 0.4272520202F, 0.4282314144F, 0.4292110345F, 0.4301908760F, + 0.4311709343F, 0.4321512047F, 0.4331316828F, 0.4341123639F, + 0.4350932435F, 0.4360743168F, 0.4370555794F, 0.4380370267F, + 0.4390186540F, 0.4400004567F, 0.4409824303F, 0.4419645701F, + 0.4429468716F, 0.4439293300F, 0.4449119409F, 0.4458946996F, + 0.4468776014F, 0.4478606418F, 0.4488438162F, 0.4498271199F, + 0.4508105483F, 0.4517940967F, 0.4527777607F, 0.4537615355F, + 0.4547454165F, 0.4557293991F, 0.4567134786F, 0.4576976505F, + 0.4586819101F, 0.4596662527F, 0.4606506738F, 0.4616351687F, + 0.4626197328F, 0.4636043614F, 0.4645890499F, 0.4655737936F, + 0.4665585880F, 0.4675434284F, 0.4685283101F, 0.4695132286F, + 0.4704981791F, 0.4714831570F, 0.4724681577F, 0.4734531766F, + 0.4744382089F, 0.4754232501F, 0.4764082956F, 0.4773933406F, + 0.4783783806F, 0.4793634108F, 0.4803484267F, 0.4813334237F, + 0.4823183969F, 0.4833033419F, 0.4842882540F, 0.4852731285F, + 0.4862579608F, 0.4872427462F, 0.4882274802F, 0.4892121580F, + 0.4901967751F, 0.4911813267F, 0.4921658083F, 0.4931502151F, + 0.4941345427F, 0.4951187863F, 0.4961029412F, 0.4970870029F, + 0.4980709667F, 0.4990548280F, 0.5000385822F, 0.5010222245F, + 0.5020057505F, 0.5029891553F, 0.5039724345F, 0.5049555834F, + 0.5059385973F, 0.5069214716F, 0.5079042018F, 0.5088867831F, + 0.5098692110F, 0.5108514808F, 0.5118335879F, 0.5128155277F, + 0.5137972956F, 0.5147788869F, 0.5157602971F, 0.5167415215F, + 0.5177225555F, 0.5187033945F, 0.5196840339F, 0.5206644692F, + 0.5216446956F, 0.5226247086F, 0.5236045035F, 0.5245840759F, + 0.5255634211F, 0.5265425344F, 0.5275214114F, 0.5285000474F, + 0.5294784378F, 0.5304565781F, 0.5314344637F, 0.5324120899F, + 0.5333894522F, 0.5343665461F, 0.5353433670F, 0.5363199102F, + 0.5372961713F, 0.5382721457F, 0.5392478287F, 0.5402232159F, + 0.5411983027F, 0.5421730845F, 0.5431475569F, 0.5441217151F, + 0.5450955548F, 0.5460690714F, 0.5470422602F, 0.5480151169F, + 0.5489876368F, 0.5499598155F, 0.5509316484F, 0.5519031310F, + 0.5528742587F, 0.5538450271F, 0.5548154317F, 0.5557854680F, + 0.5567551314F, 0.5577244174F, 0.5586933216F, 0.5596618395F, + 0.5606299665F, 0.5615976983F, 0.5625650302F, 0.5635319580F, + 0.5644984770F, 0.5654645828F, 0.5664302709F, 0.5673955370F, + 0.5683603765F, 0.5693247850F, 0.5702887580F, 0.5712522912F, + 0.5722153800F, 0.5731780200F, 0.5741402069F, 0.5751019362F, + 0.5760632034F, 0.5770240042F, 0.5779843341F, 0.5789441889F, + 0.5799035639F, 0.5808624549F, 0.5818208575F, 0.5827787673F, + 0.5837361800F, 0.5846930910F, 0.5856494961F, 0.5866053910F, + 0.5875607712F, 0.5885156324F, 0.5894699703F, 0.5904237804F, + 0.5913770586F, 0.5923298004F, 0.5932820016F, 0.5942336578F, + 0.5951847646F, 0.5961353179F, 0.5970853132F, 0.5980347464F, + 0.5989836131F, 0.5999319090F, 0.6008796298F, 0.6018267713F, + 0.6027733292F, 0.6037192993F, 0.6046646773F, 0.6056094589F, + 0.6065536400F, 0.6074972162F, 0.6084401833F, 0.6093825372F, + 0.6103242736F, 0.6112653884F, 0.6122058772F, 0.6131457359F, + 0.6140849604F, 0.6150235464F, 0.6159614897F, 0.6168987862F, + 0.6178354318F, 0.6187714223F, 0.6197067535F, 0.6206414213F, + 0.6215754215F, 0.6225087501F, 0.6234414028F, 0.6243733757F, + 0.6253046646F, 0.6262352654F, 0.6271651739F, 0.6280943862F, + 0.6290228982F, 0.6299507057F, 0.6308778048F, 0.6318041913F, + 0.6327298612F, 0.6336548105F, 0.6345790352F, 0.6355025312F, + 0.6364252945F, 0.6373473211F, 0.6382686070F, 0.6391891483F, + 0.6401089409F, 0.6410279808F, 0.6419462642F, 0.6428637869F, + 0.6437805452F, 0.6446965350F, 0.6456117524F, 0.6465261935F, + 0.6474398544F, 0.6483527311F, 0.6492648197F, 0.6501761165F, + 0.6510866174F, 0.6519963186F, 0.6529052162F, 0.6538133064F, + 0.6547205854F, 0.6556270492F, 0.6565326941F, 0.6574375162F, + 0.6583415117F, 0.6592446769F, 0.6601470079F, 0.6610485009F, + 0.6619491521F, 0.6628489578F, 0.6637479143F, 0.6646460177F, + 0.6655432643F, 0.6664396505F, 0.6673351724F, 0.6682298264F, + 0.6691236087F, 0.6700165157F, 0.6709085436F, 0.6717996889F, + 0.6726899478F, 0.6735793167F, 0.6744677918F, 0.6753553697F, + 0.6762420466F, 0.6771278190F, 0.6780126832F, 0.6788966357F, + 0.6797796728F, 0.6806617909F, 0.6815429866F, 0.6824232562F, + 0.6833025961F, 0.6841810030F, 0.6850584731F, 0.6859350031F, + 0.6868105894F, 0.6876852284F, 0.6885589168F, 0.6894316510F, + 0.6903034275F, 0.6911742430F, 0.6920440939F, 0.6929129769F, + 0.6937808884F, 0.6946478251F, 0.6955137837F, 0.6963787606F, + 0.6972427525F, 0.6981057560F, 0.6989677678F, 0.6998287845F, + 0.7006888028F, 0.7015478194F, 0.7024058309F, 0.7032628340F, + 0.7041188254F, 0.7049738019F, 0.7058277601F, 0.7066806969F, + 0.7075326089F, 0.7083834929F, 0.7092333457F, 0.7100821640F, + 0.7109299447F, 0.7117766846F, 0.7126223804F, 0.7134670291F, + 0.7143106273F, 0.7151531721F, 0.7159946602F, 0.7168350885F, + 0.7176744539F, 0.7185127534F, 0.7193499837F, 0.7201861418F, + 0.7210212247F, 0.7218552293F, 0.7226881526F, 0.7235199914F, + 0.7243507428F, 0.7251804039F, 0.7260089715F, 0.7268364426F, + 0.7276628144F, 0.7284880839F, 0.7293122481F, 0.7301353040F, + 0.7309572487F, 0.7317780794F, 0.7325977930F, 0.7334163868F, + 0.7342338579F, 0.7350502033F, 0.7358654202F, 0.7366795059F, + 0.7374924573F, 0.7383042718F, 0.7391149465F, 0.7399244787F, + 0.7407328655F, 0.7415401041F, 0.7423461920F, 0.7431511261F, + 0.7439549040F, 0.7447575227F, 0.7455589797F, 0.7463592723F, + 0.7471583976F, 0.7479563532F, 0.7487531363F, 0.7495487443F, + 0.7503431745F, 0.7511364244F, 0.7519284913F, 0.7527193726F, + 0.7535090658F, 0.7542975683F, 0.7550848776F, 0.7558709910F, + 0.7566559062F, 0.7574396205F, 0.7582221314F, 0.7590034366F, + 0.7597835334F, 0.7605624194F, 0.7613400923F, 0.7621165495F, + 0.7628917886F, 0.7636658072F, 0.7644386030F, 0.7652101735F, + 0.7659805164F, 0.7667496292F, 0.7675175098F, 0.7682841556F, + 0.7690495645F, 0.7698137341F, 0.7705766622F, 0.7713383463F, + 0.7720987844F, 0.7728579741F, 0.7736159132F, 0.7743725994F, + 0.7751280306F, 0.7758822046F, 0.7766351192F, 0.7773867722F, + 0.7781371614F, 0.7788862848F, 0.7796341401F, 0.7803807253F, + 0.7811260383F, 0.7818700769F, 0.7826128392F, 0.7833543230F, + 0.7840945263F, 0.7848334471F, 0.7855710833F, 0.7863074330F, + 0.7870424941F, 0.7877762647F, 0.7885087428F, 0.7892399264F, + 0.7899698137F, 0.7906984026F, 0.7914256914F, 0.7921516780F, + 0.7928763607F, 0.7935997375F, 0.7943218065F, 0.7950425661F, + 0.7957620142F, 0.7964801492F, 0.7971969692F, 0.7979124724F, + 0.7986266570F, 0.7993395214F, 0.8000510638F, 0.8007612823F, + 0.8014701754F, 0.8021777413F, 0.8028839784F, 0.8035888849F, + 0.8042924592F, 0.8049946997F, 0.8056956048F, 0.8063951727F, + 0.8070934020F, 0.8077902910F, 0.8084858381F, 0.8091800419F, + 0.8098729007F, 0.8105644130F, 0.8112545774F, 0.8119433922F, + 0.8126308561F, 0.8133169676F, 0.8140017251F, 0.8146851272F, + 0.8153671726F, 0.8160478598F, 0.8167271874F, 0.8174051539F, + 0.8180817582F, 0.8187569986F, 0.8194308741F, 0.8201033831F, + 0.8207745244F, 0.8214442966F, 0.8221126986F, 0.8227797290F, + 0.8234453865F, 0.8241096700F, 0.8247725781F, 0.8254341097F, + 0.8260942636F, 0.8267530385F, 0.8274104334F, 0.8280664470F, + 0.8287210782F, 0.8293743259F, 0.8300261889F, 0.8306766662F, + 0.8313257566F, 0.8319734591F, 0.8326197727F, 0.8332646963F, + 0.8339082288F, 0.8345503692F, 0.8351911167F, 0.8358304700F, + 0.8364684284F, 0.8371049907F, 0.8377401562F, 0.8383739238F, + 0.8390062927F, 0.8396372618F, 0.8402668305F, 0.8408949977F, + 0.8415217626F, 0.8421471245F, 0.8427710823F, 0.8433936354F, + 0.8440147830F, 0.8446345242F, 0.8452528582F, 0.8458697844F, + 0.8464853020F, 0.8470994102F, 0.8477121084F, 0.8483233958F, + 0.8489332718F, 0.8495417356F, 0.8501487866F, 0.8507544243F, + 0.8513586479F, 0.8519614568F, 0.8525628505F, 0.8531628283F, + 0.8537613897F, 0.8543585341F, 0.8549542611F, 0.8555485699F, + 0.8561414603F, 0.8567329315F, 0.8573229832F, 0.8579116149F, + 0.8584988262F, 0.8590846165F, 0.8596689855F, 0.8602519327F, + 0.8608334577F, 0.8614135603F, 0.8619922399F, 0.8625694962F, + 0.8631453289F, 0.8637197377F, 0.8642927222F, 0.8648642821F, + 0.8654344172F, 0.8660031272F, 0.8665704118F, 0.8671362708F, + 0.8677007039F, 0.8682637109F, 0.8688252917F, 0.8693854460F, + 0.8699441737F, 0.8705014745F, 0.8710573485F, 0.8716117953F, + 0.8721648150F, 0.8727164073F, 0.8732665723F, 0.8738153098F, + 0.8743626197F, 0.8749085021F, 0.8754529569F, 0.8759959840F, + 0.8765375835F, 0.8770777553F, 0.8776164996F, 0.8781538162F, + 0.8786897054F, 0.8792241670F, 0.8797572013F, 0.8802888082F, + 0.8808189880F, 0.8813477407F, 0.8818750664F, 0.8824009653F, + 0.8829254375F, 0.8834484833F, 0.8839701028F, 0.8844902961F, + 0.8850090636F, 0.8855264054F, 0.8860423218F, 0.8865568131F, + 0.8870698794F, 0.8875815212F, 0.8880917386F, 0.8886005319F, + 0.8891079016F, 0.8896138479F, 0.8901183712F, 0.8906214719F, + 0.8911231503F, 0.8916234067F, 0.8921222417F, 0.8926196556F, + 0.8931156489F, 0.8936102219F, 0.8941033752F, 0.8945951092F, + 0.8950854244F, 0.8955743212F, 0.8960618003F, 0.8965478621F, + 0.8970325071F, 0.8975157359F, 0.8979975490F, 0.8984779471F, + 0.8989569307F, 0.8994345004F, 0.8999106568F, 0.9003854005F, + 0.9008587323F, 0.9013306526F, 0.9018011623F, 0.9022702619F, + 0.9027379521F, 0.9032042337F, 0.9036691074F, 0.9041325739F, + 0.9045946339F, 0.9050552882F, 0.9055145376F, 0.9059723828F, + 0.9064288246F, 0.9068838638F, 0.9073375013F, 0.9077897379F, + 0.9082405743F, 0.9086900115F, 0.9091380503F, 0.9095846917F, + 0.9100299364F, 0.9104737854F, 0.9109162397F, 0.9113573001F, + 0.9117969675F, 0.9122352430F, 0.9126721275F, 0.9131076219F, + 0.9135417273F, 0.9139744447F, 0.9144057750F, 0.9148357194F, + 0.9152642787F, 0.9156914542F, 0.9161172468F, 0.9165416576F, + 0.9169646877F, 0.9173863382F, 0.9178066102F, 0.9182255048F, + 0.9186430232F, 0.9190591665F, 0.9194739359F, 0.9198873324F, + 0.9202993574F, 0.9207100120F, 0.9211192973F, 0.9215272147F, + 0.9219337653F, 0.9223389504F, 0.9227427713F, 0.9231452290F, + 0.9235463251F, 0.9239460607F, 0.9243444371F, 0.9247414557F, + 0.9251371177F, 0.9255314245F, 0.9259243774F, 0.9263159778F, + 0.9267062270F, 0.9270951264F, 0.9274826774F, 0.9278688814F, + 0.9282537398F, 0.9286372540F, 0.9290194254F, 0.9294002555F, + 0.9297797458F, 0.9301578976F, 0.9305347125F, 0.9309101919F, + 0.9312843373F, 0.9316571503F, 0.9320286323F, 0.9323987849F, + 0.9327676097F, 0.9331351080F, 0.9335012816F, 0.9338661320F, + 0.9342296607F, 0.9345918694F, 0.9349527596F, 0.9353123330F, + 0.9356705911F, 0.9360275357F, 0.9363831683F, 0.9367374905F, + 0.9370905042F, 0.9374422108F, 0.9377926122F, 0.9381417099F, + 0.9384895057F, 0.9388360014F, 0.9391811985F, 0.9395250989F, + 0.9398677043F, 0.9402090165F, 0.9405490371F, 0.9408877680F, + 0.9412252110F, 0.9415613678F, 0.9418962402F, 0.9422298301F, + 0.9425621392F, 0.9428931695F, 0.9432229226F, 0.9435514005F, + 0.9438786050F, 0.9442045381F, 0.9445292014F, 0.9448525971F, + 0.9451747268F, 0.9454955926F, 0.9458151963F, 0.9461335399F, + 0.9464506253F, 0.9467664545F, 0.9470810293F, 0.9473943517F, + 0.9477064238F, 0.9480172474F, 0.9483268246F, 0.9486351573F, + 0.9489422475F, 0.9492480973F, 0.9495527087F, 0.9498560837F, + 0.9501582243F, 0.9504591325F, 0.9507588105F, 0.9510572603F, + 0.9513544839F, 0.9516504834F, 0.9519452609F, 0.9522388186F, + 0.9525311584F, 0.9528222826F, 0.9531121932F, 0.9534008923F, + 0.9536883821F, 0.9539746647F, 0.9542597424F, 0.9545436171F, + 0.9548262912F, 0.9551077667F, 0.9553880459F, 0.9556671309F, + 0.9559450239F, 0.9562217272F, 0.9564972429F, 0.9567715733F, + 0.9570447206F, 0.9573166871F, 0.9575874749F, 0.9578570863F, + 0.9581255236F, 0.9583927890F, 0.9586588849F, 0.9589238134F, + 0.9591875769F, 0.9594501777F, 0.9597116180F, 0.9599719003F, + 0.9602310267F, 0.9604889995F, 0.9607458213F, 0.9610014942F, + 0.9612560206F, 0.9615094028F, 0.9617616433F, 0.9620127443F, + 0.9622627083F, 0.9625115376F, 0.9627592345F, 0.9630058016F, + 0.9632512411F, 0.9634955555F, 0.9637387471F, 0.9639808185F, + 0.9642217720F, 0.9644616100F, 0.9647003349F, 0.9649379493F, + 0.9651744556F, 0.9654098561F, 0.9656441534F, 0.9658773499F, + 0.9661094480F, 0.9663404504F, 0.9665703593F, 0.9667991774F, + 0.9670269071F, 0.9672535509F, 0.9674791114F, 0.9677035909F, + 0.9679269921F, 0.9681493174F, 0.9683705694F, 0.9685907506F, + 0.9688098636F, 0.9690279108F, 0.9692448948F, 0.9694608182F, + 0.9696756836F, 0.9698894934F, 0.9701022503F, 0.9703139569F, + 0.9705246156F, 0.9707342291F, 0.9709428000F, 0.9711503309F, + 0.9713568243F, 0.9715622829F, 0.9717667093F, 0.9719701060F, + 0.9721724757F, 0.9723738210F, 0.9725741446F, 0.9727734490F, + 0.9729717369F, 0.9731690109F, 0.9733652737F, 0.9735605279F, + 0.9737547762F, 0.9739480212F, 0.9741402656F, 0.9743315120F, + 0.9745217631F, 0.9747110216F, 0.9748992901F, 0.9750865714F, + 0.9752728681F, 0.9754581829F, 0.9756425184F, 0.9758258775F, + 0.9760082627F, 0.9761896768F, 0.9763701224F, 0.9765496024F, + 0.9767281193F, 0.9769056760F, 0.9770822751F, 0.9772579193F, + 0.9774326114F, 0.9776063542F, 0.9777791502F, 0.9779510023F, + 0.9781219133F, 0.9782918858F, 0.9784609226F, 0.9786290264F, + 0.9787962000F, 0.9789624461F, 0.9791277676F, 0.9792921671F, + 0.9794556474F, 0.9796182113F, 0.9797798615F, 0.9799406009F, + 0.9801004321F, 0.9802593580F, 0.9804173813F, 0.9805745049F, + 0.9807307314F, 0.9808860637F, 0.9810405046F, 0.9811940568F, + 0.9813467232F, 0.9814985065F, 0.9816494095F, 0.9817994351F, + 0.9819485860F, 0.9820968650F, 0.9822442750F, 0.9823908186F, + 0.9825364988F, 0.9826813184F, 0.9828252801F, 0.9829683868F, + 0.9831106413F, 0.9832520463F, 0.9833926048F, 0.9835323195F, + 0.9836711932F, 0.9838092288F, 0.9839464291F, 0.9840827969F, + 0.9842183351F, 0.9843530464F, 0.9844869337F, 0.9846199998F, + 0.9847522475F, 0.9848836798F, 0.9850142993F, 0.9851441090F, + 0.9852731117F, 0.9854013101F, 0.9855287073F, 0.9856553058F, + 0.9857811087F, 0.9859061188F, 0.9860303388F, 0.9861537717F, + 0.9862764202F, 0.9863982872F, 0.9865193756F, 0.9866396882F, + 0.9867592277F, 0.9868779972F, 0.9869959993F, 0.9871132370F, + 0.9872297131F, 0.9873454304F, 0.9874603918F, 0.9875746001F, + 0.9876880581F, 0.9878007688F, 0.9879127348F, 0.9880239592F, + 0.9881344447F, 0.9882441941F, 0.9883532104F, 0.9884614962F, + 0.9885690546F, 0.9886758883F, 0.9887820001F, 0.9888873930F, + 0.9889920697F, 0.9890960331F, 0.9891992859F, 0.9893018312F, + 0.9894036716F, 0.9895048100F, 0.9896052493F, 0.9897049923F, + 0.9898040418F, 0.9899024006F, 0.9900000717F, 0.9900970577F, + 0.9901933616F, 0.9902889862F, 0.9903839343F, 0.9904782087F, + 0.9905718122F, 0.9906647477F, 0.9907570180F, 0.9908486259F, + 0.9909395742F, 0.9910298658F, 0.9911195034F, 0.9912084899F, + 0.9912968281F, 0.9913845208F, 0.9914715708F, 0.9915579810F, + 0.9916437540F, 0.9917288928F, 0.9918134001F, 0.9918972788F, + 0.9919805316F, 0.9920631613F, 0.9921451707F, 0.9922265626F, + 0.9923073399F, 0.9923875052F, 0.9924670615F, 0.9925460114F, + 0.9926243577F, 0.9927021033F, 0.9927792508F, 0.9928558032F, + 0.9929317631F, 0.9930071333F, 0.9930819167F, 0.9931561158F, + 0.9932297337F, 0.9933027728F, 0.9933752362F, 0.9934471264F, + 0.9935184462F, 0.9935891985F, 0.9936593859F, 0.9937290112F, + 0.9937980771F, 0.9938665864F, 0.9939345418F, 0.9940019460F, + 0.9940688018F, 0.9941351118F, 0.9942008789F, 0.9942661057F, + 0.9943307950F, 0.9943949494F, 0.9944585717F, 0.9945216645F, + 0.9945842307F, 0.9946462728F, 0.9947077936F, 0.9947687957F, + 0.9948292820F, 0.9948892550F, 0.9949487174F, 0.9950076719F, + 0.9950661212F, 0.9951240679F, 0.9951815148F, 0.9952384645F, + 0.9952949196F, 0.9953508828F, 0.9954063568F, 0.9954613442F, + 0.9955158476F, 0.9955698697F, 0.9956234132F, 0.9956764806F, + 0.9957290746F, 0.9957811978F, 0.9958328528F, 0.9958840423F, + 0.9959347688F, 0.9959850351F, 0.9960348435F, 0.9960841969F, + 0.9961330977F, 0.9961815486F, 0.9962295521F, 0.9962771108F, + 0.9963242274F, 0.9963709043F, 0.9964171441F, 0.9964629494F, + 0.9965083228F, 0.9965532668F, 0.9965977840F, 0.9966418768F, + 0.9966855479F, 0.9967287998F, 0.9967716350F, 0.9968140559F, + 0.9968560653F, 0.9968976655F, 0.9969388591F, 0.9969796485F, + 0.9970200363F, 0.9970600250F, 0.9970996170F, 0.9971388149F, + 0.9971776211F, 0.9972160380F, 0.9972540683F, 0.9972917142F, + 0.9973289783F, 0.9973658631F, 0.9974023709F, 0.9974385042F, + 0.9974742655F, 0.9975096571F, 0.9975446816F, 0.9975793413F, + 0.9976136386F, 0.9976475759F, 0.9976811557F, 0.9977143803F, + 0.9977472521F, 0.9977797736F, 0.9978119470F, 0.9978437748F, + 0.9978752593F, 0.9979064029F, 0.9979372079F, 0.9979676768F, + 0.9979978117F, 0.9980276151F, 0.9980570893F, 0.9980862367F, + 0.9981150595F, 0.9981435600F, 0.9981717406F, 0.9981996035F, + 0.9982271511F, 0.9982543856F, 0.9982813093F, 0.9983079246F, + 0.9983342336F, 0.9983602386F, 0.9983859418F, 0.9984113456F, + 0.9984364522F, 0.9984612638F, 0.9984857825F, 0.9985100108F, + 0.9985339507F, 0.9985576044F, 0.9985809743F, 0.9986040624F, + 0.9986268710F, 0.9986494022F, 0.9986716583F, 0.9986936413F, + 0.9987153535F, 0.9987367969F, 0.9987579738F, 0.9987788864F, + 0.9987995366F, 0.9988199267F, 0.9988400587F, 0.9988599348F, + 0.9988795572F, 0.9988989278F, 0.9989180487F, 0.9989369222F, + 0.9989555501F, 0.9989739347F, 0.9989920780F, 0.9990099820F, + 0.9990276487F, 0.9990450803F, 0.9990622787F, 0.9990792460F, + 0.9990959841F, 0.9991124952F, 0.9991287812F, 0.9991448440F, + 0.9991606858F, 0.9991763084F, 0.9991917139F, 0.9992069042F, + 0.9992218813F, 0.9992366471F, 0.9992512035F, 0.9992655525F, + 0.9992796961F, 0.9992936361F, 0.9993073744F, 0.9993209131F, + 0.9993342538F, 0.9993473987F, 0.9993603494F, 0.9993731080F, + 0.9993856762F, 0.9993980559F, 0.9994102490F, 0.9994222573F, + 0.9994340827F, 0.9994457269F, 0.9994571918F, 0.9994684793F, + 0.9994795910F, 0.9994905288F, 0.9995012945F, 0.9995118898F, + 0.9995223165F, 0.9995325765F, 0.9995426713F, 0.9995526029F, + 0.9995623728F, 0.9995719829F, 0.9995814349F, 0.9995907304F, + 0.9995998712F, 0.9996088590F, 0.9996176954F, 0.9996263821F, + 0.9996349208F, 0.9996433132F, 0.9996515609F, 0.9996596656F, + 0.9996676288F, 0.9996754522F, 0.9996831375F, 0.9996906862F, + 0.9996981000F, 0.9997053804F, 0.9997125290F, 0.9997195474F, + 0.9997264371F, 0.9997331998F, 0.9997398369F, 0.9997463500F, + 0.9997527406F, 0.9997590103F, 0.9997651606F, 0.9997711930F, + 0.9997771089F, 0.9997829098F, 0.9997885973F, 0.9997941728F, + 0.9997996378F, 0.9998049936F, 0.9998102419F, 0.9998153839F, + 0.9998204211F, 0.9998253550F, 0.9998301868F, 0.9998349182F, + 0.9998395503F, 0.9998440847F, 0.9998485226F, 0.9998528654F, + 0.9998571146F, 0.9998612713F, 0.9998653370F, 0.9998693130F, + 0.9998732007F, 0.9998770012F, 0.9998807159F, 0.9998843461F, + 0.9998878931F, 0.9998913581F, 0.9998947424F, 0.9998980473F, + 0.9999012740F, 0.9999044237F, 0.9999074976F, 0.9999104971F, + 0.9999134231F, 0.9999162771F, 0.9999190601F, 0.9999217733F, + 0.9999244179F, 0.9999269950F, 0.9999295058F, 0.9999319515F, + 0.9999343332F, 0.9999366519F, 0.9999389088F, 0.9999411050F, + 0.9999432416F, 0.9999453196F, 0.9999473402F, 0.9999493044F, + 0.9999512132F, 0.9999530677F, 0.9999548690F, 0.9999566180F, + 0.9999583157F, 0.9999599633F, 0.9999615616F, 0.9999631116F, + 0.9999646144F, 0.9999660709F, 0.9999674820F, 0.9999688487F, + 0.9999701719F, 0.9999714526F, 0.9999726917F, 0.9999738900F, + 0.9999750486F, 0.9999761682F, 0.9999772497F, 0.9999782941F, + 0.9999793021F, 0.9999802747F, 0.9999812126F, 0.9999821167F, + 0.9999829878F, 0.9999838268F, 0.9999846343F, 0.9999854113F, + 0.9999861584F, 0.9999868765F, 0.9999875664F, 0.9999882287F, + 0.9999888642F, 0.9999894736F, 0.9999900577F, 0.9999906172F, + 0.9999911528F, 0.9999916651F, 0.9999921548F, 0.9999926227F, + 0.9999930693F, 0.9999934954F, 0.9999939015F, 0.9999942883F, + 0.9999946564F, 0.9999950064F, 0.9999953390F, 0.9999956547F, + 0.9999959541F, 0.9999962377F, 0.9999965062F, 0.9999967601F, + 0.9999969998F, 0.9999972260F, 0.9999974392F, 0.9999976399F, + 0.9999978285F, 0.9999980056F, 0.9999981716F, 0.9999983271F, + 0.9999984724F, 0.9999986081F, 0.9999987345F, 0.9999988521F, + 0.9999989613F, 0.9999990625F, 0.9999991562F, 0.9999992426F, + 0.9999993223F, 0.9999993954F, 0.9999994625F, 0.9999995239F, + 0.9999995798F, 0.9999996307F, 0.9999996768F, 0.9999997184F, + 0.9999997559F, 0.9999997895F, 0.9999998195F, 0.9999998462F, + 0.9999998698F, 0.9999998906F, 0.9999999088F, 0.9999999246F, + 0.9999999383F, 0.9999999500F, 0.9999999600F, 0.9999999684F, + 0.9999999754F, 0.9999999811F, 0.9999999858F, 0.9999999896F, + 0.9999999925F, 0.9999999948F, 0.9999999965F, 0.9999999978F, + 0.9999999986F, 0.9999999992F, 0.9999999996F, 0.9999999998F, + 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, +}; + +static float vwin8192[4096] = { + 0.0000000578F, 0.0000005198F, 0.0000014438F, 0.0000028299F, + 0.0000046780F, 0.0000069882F, 0.0000097604F, 0.0000129945F, + 0.0000166908F, 0.0000208490F, 0.0000254692F, 0.0000305515F, + 0.0000360958F, 0.0000421021F, 0.0000485704F, 0.0000555006F, + 0.0000628929F, 0.0000707472F, 0.0000790635F, 0.0000878417F, + 0.0000970820F, 0.0001067842F, 0.0001169483F, 0.0001275744F, + 0.0001386625F, 0.0001502126F, 0.0001622245F, 0.0001746984F, + 0.0001876343F, 0.0002010320F, 0.0002148917F, 0.0002292132F, + 0.0002439967F, 0.0002592421F, 0.0002749493F, 0.0002911184F, + 0.0003077493F, 0.0003248421F, 0.0003423967F, 0.0003604132F, + 0.0003788915F, 0.0003978316F, 0.0004172335F, 0.0004370971F, + 0.0004574226F, 0.0004782098F, 0.0004994587F, 0.0005211694F, + 0.0005433418F, 0.0005659759F, 0.0005890717F, 0.0006126292F, + 0.0006366484F, 0.0006611292F, 0.0006860716F, 0.0007114757F, + 0.0007373414F, 0.0007636687F, 0.0007904576F, 0.0008177080F, + 0.0008454200F, 0.0008735935F, 0.0009022285F, 0.0009313250F, + 0.0009608830F, 0.0009909025F, 0.0010213834F, 0.0010523257F, + 0.0010837295F, 0.0011155946F, 0.0011479211F, 0.0011807090F, + 0.0012139582F, 0.0012476687F, 0.0012818405F, 0.0013164736F, + 0.0013515679F, 0.0013871235F, 0.0014231402F, 0.0014596182F, + 0.0014965573F, 0.0015339576F, 0.0015718190F, 0.0016101415F, + 0.0016489251F, 0.0016881698F, 0.0017278754F, 0.0017680421F, + 0.0018086698F, 0.0018497584F, 0.0018913080F, 0.0019333185F, + 0.0019757898F, 0.0020187221F, 0.0020621151F, 0.0021059690F, + 0.0021502837F, 0.0021950591F, 0.0022402953F, 0.0022859921F, + 0.0023321497F, 0.0023787679F, 0.0024258467F, 0.0024733861F, + 0.0025213861F, 0.0025698466F, 0.0026187676F, 0.0026681491F, + 0.0027179911F, 0.0027682935F, 0.0028190562F, 0.0028702794F, + 0.0029219628F, 0.0029741066F, 0.0030267107F, 0.0030797749F, + 0.0031332994F, 0.0031872841F, 0.0032417289F, 0.0032966338F, + 0.0033519988F, 0.0034078238F, 0.0034641089F, 0.0035208539F, + 0.0035780589F, 0.0036357237F, 0.0036938485F, 0.0037524331F, + 0.0038114775F, 0.0038709817F, 0.0039309456F, 0.0039913692F, + 0.0040522524F, 0.0041135953F, 0.0041753978F, 0.0042376599F, + 0.0043003814F, 0.0043635624F, 0.0044272029F, 0.0044913028F, + 0.0045558620F, 0.0046208806F, 0.0046863585F, 0.0047522955F, + 0.0048186919F, 0.0048855473F, 0.0049528619F, 0.0050206356F, + 0.0050888684F, 0.0051575601F, 0.0052267108F, 0.0052963204F, + 0.0053663890F, 0.0054369163F, 0.0055079025F, 0.0055793474F, + 0.0056512510F, 0.0057236133F, 0.0057964342F, 0.0058697137F, + 0.0059434517F, 0.0060176482F, 0.0060923032F, 0.0061674166F, + 0.0062429883F, 0.0063190183F, 0.0063955066F, 0.0064724532F, + 0.0065498579F, 0.0066277207F, 0.0067060416F, 0.0067848205F, + 0.0068640575F, 0.0069437523F, 0.0070239051F, 0.0071045157F, + 0.0071855840F, 0.0072671102F, 0.0073490940F, 0.0074315355F, + 0.0075144345F, 0.0075977911F, 0.0076816052F, 0.0077658768F, + 0.0078506057F, 0.0079357920F, 0.0080214355F, 0.0081075363F, + 0.0081940943F, 0.0082811094F, 0.0083685816F, 0.0084565108F, + 0.0085448970F, 0.0086337401F, 0.0087230401F, 0.0088127969F, + 0.0089030104F, 0.0089936807F, 0.0090848076F, 0.0091763911F, + 0.0092684311F, 0.0093609276F, 0.0094538805F, 0.0095472898F, + 0.0096411554F, 0.0097354772F, 0.0098302552F, 0.0099254894F, + 0.0100211796F, 0.0101173259F, 0.0102139281F, 0.0103109863F, + 0.0104085002F, 0.0105064700F, 0.0106048955F, 0.0107037766F, + 0.0108031133F, 0.0109029056F, 0.0110031534F, 0.0111038565F, + 0.0112050151F, 0.0113066289F, 0.0114086980F, 0.0115112222F, + 0.0116142015F, 0.0117176359F, 0.0118215252F, 0.0119258695F, + 0.0120306686F, 0.0121359225F, 0.0122416312F, 0.0123477944F, + 0.0124544123F, 0.0125614847F, 0.0126690116F, 0.0127769928F, + 0.0128854284F, 0.0129943182F, 0.0131036623F, 0.0132134604F, + 0.0133237126F, 0.0134344188F, 0.0135455790F, 0.0136571929F, + 0.0137692607F, 0.0138817821F, 0.0139947572F, 0.0141081859F, + 0.0142220681F, 0.0143364037F, 0.0144511927F, 0.0145664350F, + 0.0146821304F, 0.0147982791F, 0.0149148808F, 0.0150319355F, + 0.0151494431F, 0.0152674036F, 0.0153858168F, 0.0155046828F, + 0.0156240014F, 0.0157437726F, 0.0158639962F, 0.0159846723F, + 0.0161058007F, 0.0162273814F, 0.0163494142F, 0.0164718991F, + 0.0165948361F, 0.0167182250F, 0.0168420658F, 0.0169663584F, + 0.0170911027F, 0.0172162987F, 0.0173419462F, 0.0174680452F, + 0.0175945956F, 0.0177215974F, 0.0178490504F, 0.0179769545F, + 0.0181053098F, 0.0182341160F, 0.0183633732F, 0.0184930812F, + 0.0186232399F, 0.0187538494F, 0.0188849094F, 0.0190164200F, + 0.0191483809F, 0.0192807923F, 0.0194136539F, 0.0195469656F, + 0.0196807275F, 0.0198149394F, 0.0199496012F, 0.0200847128F, + 0.0202202742F, 0.0203562853F, 0.0204927460F, 0.0206296561F, + 0.0207670157F, 0.0209048245F, 0.0210430826F, 0.0211817899F, + 0.0213209462F, 0.0214605515F, 0.0216006057F, 0.0217411086F, + 0.0218820603F, 0.0220234605F, 0.0221653093F, 0.0223076066F, + 0.0224503521F, 0.0225935459F, 0.0227371879F, 0.0228812779F, + 0.0230258160F, 0.0231708018F, 0.0233162355F, 0.0234621169F, + 0.0236084459F, 0.0237552224F, 0.0239024462F, 0.0240501175F, + 0.0241982359F, 0.0243468015F, 0.0244958141F, 0.0246452736F, + 0.0247951800F, 0.0249455331F, 0.0250963329F, 0.0252475792F, + 0.0253992720F, 0.0255514111F, 0.0257039965F, 0.0258570281F, + 0.0260105057F, 0.0261644293F, 0.0263187987F, 0.0264736139F, + 0.0266288747F, 0.0267845811F, 0.0269407330F, 0.0270973302F, + 0.0272543727F, 0.0274118604F, 0.0275697930F, 0.0277281707F, + 0.0278869932F, 0.0280462604F, 0.0282059723F, 0.0283661287F, + 0.0285267295F, 0.0286877747F, 0.0288492641F, 0.0290111976F, + 0.0291735751F, 0.0293363965F, 0.0294996617F, 0.0296633706F, + 0.0298275231F, 0.0299921190F, 0.0301571583F, 0.0303226409F, + 0.0304885667F, 0.0306549354F, 0.0308217472F, 0.0309890017F, + 0.0311566989F, 0.0313248388F, 0.0314934211F, 0.0316624459F, + 0.0318319128F, 0.0320018220F, 0.0321721732F, 0.0323429663F, + 0.0325142013F, 0.0326858779F, 0.0328579962F, 0.0330305559F, + 0.0332035570F, 0.0333769994F, 0.0335508829F, 0.0337252074F, + 0.0338999728F, 0.0340751790F, 0.0342508259F, 0.0344269134F, + 0.0346034412F, 0.0347804094F, 0.0349578178F, 0.0351356663F, + 0.0353139548F, 0.0354926831F, 0.0356718511F, 0.0358514588F, + 0.0360315059F, 0.0362119924F, 0.0363929182F, 0.0365742831F, + 0.0367560870F, 0.0369383297F, 0.0371210113F, 0.0373041315F, + 0.0374876902F, 0.0376716873F, 0.0378561226F, 0.0380409961F, + 0.0382263077F, 0.0384120571F, 0.0385982443F, 0.0387848691F, + 0.0389719315F, 0.0391594313F, 0.0393473683F, 0.0395357425F, + 0.0397245537F, 0.0399138017F, 0.0401034866F, 0.0402936080F, + 0.0404841660F, 0.0406751603F, 0.0408665909F, 0.0410584576F, + 0.0412507603F, 0.0414434988F, 0.0416366731F, 0.0418302829F, + 0.0420243282F, 0.0422188088F, 0.0424137246F, 0.0426090755F, + 0.0428048613F, 0.0430010819F, 0.0431977371F, 0.0433948269F, + 0.0435923511F, 0.0437903095F, 0.0439887020F, 0.0441875285F, + 0.0443867889F, 0.0445864830F, 0.0447866106F, 0.0449871717F, + 0.0451881661F, 0.0453895936F, 0.0455914542F, 0.0457937477F, + 0.0459964738F, 0.0461996326F, 0.0464032239F, 0.0466072475F, + 0.0468117032F, 0.0470165910F, 0.0472219107F, 0.0474276622F, + 0.0476338452F, 0.0478404597F, 0.0480475056F, 0.0482549827F, + 0.0484628907F, 0.0486712297F, 0.0488799994F, 0.0490891998F, + 0.0492988306F, 0.0495088917F, 0.0497193830F, 0.0499303043F, + 0.0501416554F, 0.0503534363F, 0.0505656468F, 0.0507782867F, + 0.0509913559F, 0.0512048542F, 0.0514187815F, 0.0516331376F, + 0.0518479225F, 0.0520631358F, 0.0522787775F, 0.0524948475F, + 0.0527113455F, 0.0529282715F, 0.0531456252F, 0.0533634066F, + 0.0535816154F, 0.0538002515F, 0.0540193148F, 0.0542388051F, + 0.0544587222F, 0.0546790660F, 0.0548998364F, 0.0551210331F, + 0.0553426561F, 0.0555647051F, 0.0557871801F, 0.0560100807F, + 0.0562334070F, 0.0564571587F, 0.0566813357F, 0.0569059378F, + 0.0571309649F, 0.0573564168F, 0.0575822933F, 0.0578085942F, + 0.0580353195F, 0.0582624689F, 0.0584900423F, 0.0587180396F, + 0.0589464605F, 0.0591753049F, 0.0594045726F, 0.0596342635F, + 0.0598643774F, 0.0600949141F, 0.0603258735F, 0.0605572555F, + 0.0607890597F, 0.0610212862F, 0.0612539346F, 0.0614870049F, + 0.0617204968F, 0.0619544103F, 0.0621887451F, 0.0624235010F, + 0.0626586780F, 0.0628942758F, 0.0631302942F, 0.0633667331F, + 0.0636035923F, 0.0638408717F, 0.0640785710F, 0.0643166901F, + 0.0645552288F, 0.0647941870F, 0.0650335645F, 0.0652733610F, + 0.0655135765F, 0.0657542108F, 0.0659952636F, 0.0662367348F, + 0.0664786242F, 0.0667209316F, 0.0669636570F, 0.0672068000F, + 0.0674503605F, 0.0676943384F, 0.0679387334F, 0.0681835454F, + 0.0684287742F, 0.0686744196F, 0.0689204814F, 0.0691669595F, + 0.0694138536F, 0.0696611637F, 0.0699088894F, 0.0701570307F, + 0.0704055873F, 0.0706545590F, 0.0709039458F, 0.0711537473F, + 0.0714039634F, 0.0716545939F, 0.0719056387F, 0.0721570975F, + 0.0724089702F, 0.0726612565F, 0.0729139563F, 0.0731670694F, + 0.0734205956F, 0.0736745347F, 0.0739288866F, 0.0741836510F, + 0.0744388277F, 0.0746944166F, 0.0749504175F, 0.0752068301F, + 0.0754636543F, 0.0757208899F, 0.0759785367F, 0.0762365946F, + 0.0764950632F, 0.0767539424F, 0.0770132320F, 0.0772729319F, + 0.0775330418F, 0.0777935616F, 0.0780544909F, 0.0783158298F, + 0.0785775778F, 0.0788397349F, 0.0791023009F, 0.0793652755F, + 0.0796286585F, 0.0798924498F, 0.0801566492F, 0.0804212564F, + 0.0806862712F, 0.0809516935F, 0.0812175231F, 0.0814837597F, + 0.0817504031F, 0.0820174532F, 0.0822849097F, 0.0825527724F, + 0.0828210412F, 0.0830897158F, 0.0833587960F, 0.0836282816F, + 0.0838981724F, 0.0841684682F, 0.0844391688F, 0.0847102740F, + 0.0849817835F, 0.0852536973F, 0.0855260150F, 0.0857987364F, + 0.0860718614F, 0.0863453897F, 0.0866193211F, 0.0868936554F, + 0.0871683924F, 0.0874435319F, 0.0877190737F, 0.0879950175F, + 0.0882713632F, 0.0885481105F, 0.0888252592F, 0.0891028091F, + 0.0893807600F, 0.0896591117F, 0.0899378639F, 0.0902170165F, + 0.0904965692F, 0.0907765218F, 0.0910568740F, 0.0913376258F, + 0.0916187767F, 0.0919003268F, 0.0921822756F, 0.0924646230F, + 0.0927473687F, 0.0930305126F, 0.0933140545F, 0.0935979940F, + 0.0938823310F, 0.0941670653F, 0.0944521966F, 0.0947377247F, + 0.0950236494F, 0.0953099704F, 0.0955966876F, 0.0958838007F, + 0.0961713094F, 0.0964592136F, 0.0967475131F, 0.0970362075F, + 0.0973252967F, 0.0976147805F, 0.0979046585F, 0.0981949307F, + 0.0984855967F, 0.0987766563F, 0.0990681093F, 0.0993599555F, + 0.0996521945F, 0.0999448263F, 0.1002378506F, 0.1005312671F, + 0.1008250755F, 0.1011192757F, 0.1014138675F, 0.1017088505F, + 0.1020042246F, 0.1022999895F, 0.1025961450F, 0.1028926909F, + 0.1031896268F, 0.1034869526F, 0.1037846680F, 0.1040827729F, + 0.1043812668F, 0.1046801497F, 0.1049794213F, 0.1052790813F, + 0.1055791294F, 0.1058795656F, 0.1061803894F, 0.1064816006F, + 0.1067831991F, 0.1070851846F, 0.1073875568F, 0.1076903155F, + 0.1079934604F, 0.1082969913F, 0.1086009079F, 0.1089052101F, + 0.1092098975F, 0.1095149699F, 0.1098204270F, 0.1101262687F, + 0.1104324946F, 0.1107391045F, 0.1110460982F, 0.1113534754F, + 0.1116612359F, 0.1119693793F, 0.1122779055F, 0.1125868142F, + 0.1128961052F, 0.1132057781F, 0.1135158328F, 0.1138262690F, + 0.1141370863F, 0.1144482847F, 0.1147598638F, 0.1150718233F, + 0.1153841631F, 0.1156968828F, 0.1160099822F, 0.1163234610F, + 0.1166373190F, 0.1169515559F, 0.1172661714F, 0.1175811654F, + 0.1178965374F, 0.1182122874F, 0.1185284149F, 0.1188449198F, + 0.1191618018F, 0.1194790606F, 0.1197966960F, 0.1201147076F, + 0.1204330953F, 0.1207518587F, 0.1210709976F, 0.1213905118F, + 0.1217104009F, 0.1220306647F, 0.1223513029F, 0.1226723153F, + 0.1229937016F, 0.1233154615F, 0.1236375948F, 0.1239601011F, + 0.1242829803F, 0.1246062319F, 0.1249298559F, 0.1252538518F, + 0.1255782195F, 0.1259029586F, 0.1262280689F, 0.1265535501F, + 0.1268794019F, 0.1272056241F, 0.1275322163F, 0.1278591784F, + 0.1281865099F, 0.1285142108F, 0.1288422805F, 0.1291707190F, + 0.1294995259F, 0.1298287009F, 0.1301582437F, 0.1304881542F, + 0.1308184319F, 0.1311490766F, 0.1314800881F, 0.1318114660F, + 0.1321432100F, 0.1324753200F, 0.1328077955F, 0.1331406364F, + 0.1334738422F, 0.1338074129F, 0.1341413479F, 0.1344756472F, + 0.1348103103F, 0.1351453370F, 0.1354807270F, 0.1358164801F, + 0.1361525959F, 0.1364890741F, 0.1368259145F, 0.1371631167F, + 0.1375006805F, 0.1378386056F, 0.1381768917F, 0.1385155384F, + 0.1388545456F, 0.1391939129F, 0.1395336400F, 0.1398737266F, + 0.1402141724F, 0.1405549772F, 0.1408961406F, 0.1412376623F, + 0.1415795421F, 0.1419217797F, 0.1422643746F, 0.1426073268F, + 0.1429506358F, 0.1432943013F, 0.1436383231F, 0.1439827008F, + 0.1443274342F, 0.1446725229F, 0.1450179667F, 0.1453637652F, + 0.1457099181F, 0.1460564252F, 0.1464032861F, 0.1467505006F, + 0.1470980682F, 0.1474459888F, 0.1477942620F, 0.1481428875F, + 0.1484918651F, 0.1488411942F, 0.1491908748F, 0.1495409065F, + 0.1498912889F, 0.1502420218F, 0.1505931048F, 0.1509445376F, + 0.1512963200F, 0.1516484516F, 0.1520009321F, 0.1523537612F, + 0.1527069385F, 0.1530604638F, 0.1534143368F, 0.1537685571F, + 0.1541231244F, 0.1544780384F, 0.1548332987F, 0.1551889052F, + 0.1555448574F, 0.1559011550F, 0.1562577978F, 0.1566147853F, + 0.1569721173F, 0.1573297935F, 0.1576878135F, 0.1580461771F, + 0.1584048838F, 0.1587639334F, 0.1591233255F, 0.1594830599F, + 0.1598431361F, 0.1602035540F, 0.1605643131F, 0.1609254131F, + 0.1612868537F, 0.1616486346F, 0.1620107555F, 0.1623732160F, + 0.1627360158F, 0.1630991545F, 0.1634626319F, 0.1638264476F, + 0.1641906013F, 0.1645550926F, 0.1649199212F, 0.1652850869F, + 0.1656505892F, 0.1660164278F, 0.1663826024F, 0.1667491127F, + 0.1671159583F, 0.1674831388F, 0.1678506541F, 0.1682185036F, + 0.1685866872F, 0.1689552044F, 0.1693240549F, 0.1696932384F, + 0.1700627545F, 0.1704326029F, 0.1708027833F, 0.1711732952F, + 0.1715441385F, 0.1719153127F, 0.1722868175F, 0.1726586526F, + 0.1730308176F, 0.1734033121F, 0.1737761359F, 0.1741492886F, + 0.1745227698F, 0.1748965792F, 0.1752707164F, 0.1756451812F, + 0.1760199731F, 0.1763950918F, 0.1767705370F, 0.1771463083F, + 0.1775224054F, 0.1778988279F, 0.1782755754F, 0.1786526477F, + 0.1790300444F, 0.1794077651F, 0.1797858094F, 0.1801641771F, + 0.1805428677F, 0.1809218810F, 0.1813012165F, 0.1816808739F, + 0.1820608528F, 0.1824411530F, 0.1828217739F, 0.1832027154F, + 0.1835839770F, 0.1839655584F, 0.1843474592F, 0.1847296790F, + 0.1851122175F, 0.1854950744F, 0.1858782492F, 0.1862617417F, + 0.1866455514F, 0.1870296780F, 0.1874141211F, 0.1877988804F, + 0.1881839555F, 0.1885693461F, 0.1889550517F, 0.1893410721F, + 0.1897274068F, 0.1901140555F, 0.1905010178F, 0.1908882933F, + 0.1912758818F, 0.1916637828F, 0.1920519959F, 0.1924405208F, + 0.1928293571F, 0.1932185044F, 0.1936079625F, 0.1939977308F, + 0.1943878091F, 0.1947781969F, 0.1951688939F, 0.1955598998F, + 0.1959512141F, 0.1963428364F, 0.1967347665F, 0.1971270038F, + 0.1975195482F, 0.1979123990F, 0.1983055561F, 0.1986990190F, + 0.1990927873F, 0.1994868607F, 0.1998812388F, 0.2002759212F, + 0.2006709075F, 0.2010661974F, 0.2014617904F, 0.2018576862F, + 0.2022538844F, 0.2026503847F, 0.2030471865F, 0.2034442897F, + 0.2038416937F, 0.2042393982F, 0.2046374028F, 0.2050357071F, + 0.2054343107F, 0.2058332133F, 0.2062324145F, 0.2066319138F, + 0.2070317110F, 0.2074318055F, 0.2078321970F, 0.2082328852F, + 0.2086338696F, 0.2090351498F, 0.2094367255F, 0.2098385962F, + 0.2102407617F, 0.2106432213F, 0.2110459749F, 0.2114490220F, + 0.2118523621F, 0.2122559950F, 0.2126599202F, 0.2130641373F, + 0.2134686459F, 0.2138734456F, 0.2142785361F, 0.2146839168F, + 0.2150895875F, 0.2154955478F, 0.2159017972F, 0.2163083353F, + 0.2167151617F, 0.2171222761F, 0.2175296780F, 0.2179373670F, + 0.2183453428F, 0.2187536049F, 0.2191621529F, 0.2195709864F, + 0.2199801051F, 0.2203895085F, 0.2207991961F, 0.2212091677F, + 0.2216194228F, 0.2220299610F, 0.2224407818F, 0.2228518850F, + 0.2232632699F, 0.2236749364F, 0.2240868839F, 0.2244991121F, + 0.2249116204F, 0.2253244086F, 0.2257374763F, 0.2261508229F, + 0.2265644481F, 0.2269783514F, 0.2273925326F, 0.2278069911F, + 0.2282217265F, 0.2286367384F, 0.2290520265F, 0.2294675902F, + 0.2298834292F, 0.2302995431F, 0.2307159314F, 0.2311325937F, + 0.2315495297F, 0.2319667388F, 0.2323842207F, 0.2328019749F, + 0.2332200011F, 0.2336382988F, 0.2340568675F, 0.2344757070F, + 0.2348948166F, 0.2353141961F, 0.2357338450F, 0.2361537629F, + 0.2365739493F, 0.2369944038F, 0.2374151261F, 0.2378361156F, + 0.2382573720F, 0.2386788948F, 0.2391006836F, 0.2395227380F, + 0.2399450575F, 0.2403676417F, 0.2407904902F, 0.2412136026F, + 0.2416369783F, 0.2420606171F, 0.2424845185F, 0.2429086820F, + 0.2433331072F, 0.2437577936F, 0.2441827409F, 0.2446079486F, + 0.2450334163F, 0.2454591435F, 0.2458851298F, 0.2463113747F, + 0.2467378779F, 0.2471646389F, 0.2475916573F, 0.2480189325F, + 0.2484464643F, 0.2488742521F, 0.2493022955F, 0.2497305940F, + 0.2501591473F, 0.2505879549F, 0.2510170163F, 0.2514463311F, + 0.2518758989F, 0.2523057193F, 0.2527357916F, 0.2531661157F, + 0.2535966909F, 0.2540275169F, 0.2544585931F, 0.2548899193F, + 0.2553214948F, 0.2557533193F, 0.2561853924F, 0.2566177135F, + 0.2570502822F, 0.2574830981F, 0.2579161608F, 0.2583494697F, + 0.2587830245F, 0.2592168246F, 0.2596508697F, 0.2600851593F, + 0.2605196929F, 0.2609544701F, 0.2613894904F, 0.2618247534F, + 0.2622602586F, 0.2626960055F, 0.2631319938F, 0.2635682230F, + 0.2640046925F, 0.2644414021F, 0.2648783511F, 0.2653155391F, + 0.2657529657F, 0.2661906305F, 0.2666285329F, 0.2670666725F, + 0.2675050489F, 0.2679436616F, 0.2683825101F, 0.2688215940F, + 0.2692609127F, 0.2697004660F, 0.2701402532F, 0.2705802739F, + 0.2710205278F, 0.2714610142F, 0.2719017327F, 0.2723426830F, + 0.2727838644F, 0.2732252766F, 0.2736669191F, 0.2741087914F, + 0.2745508930F, 0.2749932235F, 0.2754357824F, 0.2758785693F, + 0.2763215837F, 0.2767648251F, 0.2772082930F, 0.2776519870F, + 0.2780959066F, 0.2785400513F, 0.2789844207F, 0.2794290143F, + 0.2798738316F, 0.2803188722F, 0.2807641355F, 0.2812096211F, + 0.2816553286F, 0.2821012574F, 0.2825474071F, 0.2829937773F, + 0.2834403673F, 0.2838871768F, 0.2843342053F, 0.2847814523F, + 0.2852289174F, 0.2856765999F, 0.2861244996F, 0.2865726159F, + 0.2870209482F, 0.2874694962F, 0.2879182594F, 0.2883672372F, + 0.2888164293F, 0.2892658350F, 0.2897154540F, 0.2901652858F, + 0.2906153298F, 0.2910655856F, 0.2915160527F, 0.2919667306F, + 0.2924176189F, 0.2928687171F, 0.2933200246F, 0.2937715409F, + 0.2942232657F, 0.2946751984F, 0.2951273386F, 0.2955796856F, + 0.2960322391F, 0.2964849986F, 0.2969379636F, 0.2973911335F, + 0.2978445080F, 0.2982980864F, 0.2987518684F, 0.2992058534F, + 0.2996600409F, 0.3001144305F, 0.3005690217F, 0.3010238139F, + 0.3014788067F, 0.3019339995F, 0.3023893920F, 0.3028449835F, + 0.3033007736F, 0.3037567618F, 0.3042129477F, 0.3046693306F, + 0.3051259102F, 0.3055826859F, 0.3060396572F, 0.3064968236F, + 0.3069541847F, 0.3074117399F, 0.3078694887F, 0.3083274307F, + 0.3087855653F, 0.3092438920F, 0.3097024104F, 0.3101611199F, + 0.3106200200F, 0.3110791103F, 0.3115383902F, 0.3119978592F, + 0.3124575169F, 0.3129173627F, 0.3133773961F, 0.3138376166F, + 0.3142980238F, 0.3147586170F, 0.3152193959F, 0.3156803598F, + 0.3161415084F, 0.3166028410F, 0.3170643573F, 0.3175260566F, + 0.3179879384F, 0.3184500023F, 0.3189122478F, 0.3193746743F, + 0.3198372814F, 0.3203000685F, 0.3207630351F, 0.3212261807F, + 0.3216895048F, 0.3221530069F, 0.3226166865F, 0.3230805430F, + 0.3235445760F, 0.3240087849F, 0.3244731693F, 0.3249377285F, + 0.3254024622F, 0.3258673698F, 0.3263324507F, 0.3267977045F, + 0.3272631306F, 0.3277287286F, 0.3281944978F, 0.3286604379F, + 0.3291265482F, 0.3295928284F, 0.3300592777F, 0.3305258958F, + 0.3309926821F, 0.3314596361F, 0.3319267573F, 0.3323940451F, + 0.3328614990F, 0.3333291186F, 0.3337969033F, 0.3342648525F, + 0.3347329658F, 0.3352012427F, 0.3356696825F, 0.3361382849F, + 0.3366070492F, 0.3370759749F, 0.3375450616F, 0.3380143087F, + 0.3384837156F, 0.3389532819F, 0.3394230071F, 0.3398928905F, + 0.3403629317F, 0.3408331302F, 0.3413034854F, 0.3417739967F, + 0.3422446638F, 0.3427154860F, 0.3431864628F, 0.3436575938F, + 0.3441288782F, 0.3446003158F, 0.3450719058F, 0.3455436478F, + 0.3460155412F, 0.3464875856F, 0.3469597804F, 0.3474321250F, + 0.3479046189F, 0.3483772617F, 0.3488500527F, 0.3493229914F, + 0.3497960774F, 0.3502693100F, 0.3507426887F, 0.3512162131F, + 0.3516898825F, 0.3521636965F, 0.3526376545F, 0.3531117559F, + 0.3535860003F, 0.3540603870F, 0.3545349157F, 0.3550095856F, + 0.3554843964F, 0.3559593474F, 0.3564344381F, 0.3569096680F, + 0.3573850366F, 0.3578605432F, 0.3583361875F, 0.3588119687F, + 0.3592878865F, 0.3597639402F, 0.3602401293F, 0.3607164533F, + 0.3611929117F, 0.3616695038F, 0.3621462292F, 0.3626230873F, + 0.3631000776F, 0.3635771995F, 0.3640544525F, 0.3645318360F, + 0.3650093496F, 0.3654869926F, 0.3659647645F, 0.3664426648F, + 0.3669206930F, 0.3673988484F, 0.3678771306F, 0.3683555390F, + 0.3688340731F, 0.3693127322F, 0.3697915160F, 0.3702704237F, + 0.3707494549F, 0.3712286091F, 0.3717078857F, 0.3721872840F, + 0.3726668037F, 0.3731464441F, 0.3736262047F, 0.3741060850F, + 0.3745860843F, 0.3750662023F, 0.3755464382F, 0.3760267915F, + 0.3765072618F, 0.3769878484F, 0.3774685509F, 0.3779493686F, + 0.3784303010F, 0.3789113475F, 0.3793925076F, 0.3798737809F, + 0.3803551666F, 0.3808366642F, 0.3813182733F, 0.3817999932F, + 0.3822818234F, 0.3827637633F, 0.3832458124F, 0.3837279702F, + 0.3842102360F, 0.3846926093F, 0.3851750897F, 0.3856576764F, + 0.3861403690F, 0.3866231670F, 0.3871060696F, 0.3875890765F, + 0.3880721870F, 0.3885554007F, 0.3890387168F, 0.3895221349F, + 0.3900056544F, 0.3904892748F, 0.3909729955F, 0.3914568160F, + 0.3919407356F, 0.3924247539F, 0.3929088702F, 0.3933930841F, + 0.3938773949F, 0.3943618021F, 0.3948463052F, 0.3953309035F, + 0.3958155966F, 0.3963003838F, 0.3967852646F, 0.3972702385F, + 0.3977553048F, 0.3982404631F, 0.3987257127F, 0.3992110531F, + 0.3996964838F, 0.4001820041F, 0.4006676136F, 0.4011533116F, + 0.4016390976F, 0.4021249710F, 0.4026109313F, 0.4030969779F, + 0.4035831102F, 0.4040693277F, 0.4045556299F, 0.4050420160F, + 0.4055284857F, 0.4060150383F, 0.4065016732F, 0.4069883899F, + 0.4074751879F, 0.4079620665F, 0.4084490252F, 0.4089360635F, + 0.4094231807F, 0.4099103763F, 0.4103976498F, 0.4108850005F, + 0.4113724280F, 0.4118599315F, 0.4123475107F, 0.4128351648F, + 0.4133228934F, 0.4138106959F, 0.4142985716F, 0.4147865201F, + 0.4152745408F, 0.4157626330F, 0.4162507963F, 0.4167390301F, + 0.4172273337F, 0.4177157067F, 0.4182041484F, 0.4186926583F, + 0.4191812359F, 0.4196698805F, 0.4201585915F, 0.4206473685F, + 0.4211362108F, 0.4216251179F, 0.4221140892F, 0.4226031241F, + 0.4230922221F, 0.4235813826F, 0.4240706050F, 0.4245598887F, + 0.4250492332F, 0.4255386379F, 0.4260281022F, 0.4265176256F, + 0.4270072075F, 0.4274968473F, 0.4279865445F, 0.4284762984F, + 0.4289661086F, 0.4294559743F, 0.4299458951F, 0.4304358704F, + 0.4309258996F, 0.4314159822F, 0.4319061175F, 0.4323963050F, + 0.4328865441F, 0.4333768342F, 0.4338671749F, 0.4343575654F, + 0.4348480052F, 0.4353384938F, 0.4358290306F, 0.4363196149F, + 0.4368102463F, 0.4373009241F, 0.4377916478F, 0.4382824168F, + 0.4387732305F, 0.4392640884F, 0.4397549899F, 0.4402459343F, + 0.4407369212F, 0.4412279499F, 0.4417190198F, 0.4422101305F, + 0.4427012813F, 0.4431924717F, 0.4436837010F, 0.4441749686F, + 0.4446662742F, 0.4451576169F, 0.4456489963F, 0.4461404118F, + 0.4466318628F, 0.4471233487F, 0.4476148690F, 0.4481064230F, + 0.4485980103F, 0.4490896302F, 0.4495812821F, 0.4500729654F, + 0.4505646797F, 0.4510564243F, 0.4515481986F, 0.4520400021F, + 0.4525318341F, 0.4530236942F, 0.4535155816F, 0.4540074959F, + 0.4544994365F, 0.4549914028F, 0.4554833941F, 0.4559754100F, + 0.4564674499F, 0.4569595131F, 0.4574515991F, 0.4579437074F, + 0.4584358372F, 0.4589279881F, 0.4594201595F, 0.4599123508F, + 0.4604045615F, 0.4608967908F, 0.4613890383F, 0.4618813034F, + 0.4623735855F, 0.4628658841F, 0.4633581984F, 0.4638505281F, + 0.4643428724F, 0.4648352308F, 0.4653276028F, 0.4658199877F, + 0.4663123849F, 0.4668047940F, 0.4672972143F, 0.4677896451F, + 0.4682820861F, 0.4687745365F, 0.4692669958F, 0.4697594634F, + 0.4702519387F, 0.4707444211F, 0.4712369102F, 0.4717294052F, + 0.4722219056F, 0.4727144109F, 0.4732069204F, 0.4736994336F, + 0.4741919498F, 0.4746844686F, 0.4751769893F, 0.4756695113F, + 0.4761620341F, 0.4766545571F, 0.4771470797F, 0.4776396013F, + 0.4781321213F, 0.4786246392F, 0.4791171544F, 0.4796096663F, + 0.4801021744F, 0.4805946779F, 0.4810871765F, 0.4815796694F, + 0.4820721561F, 0.4825646360F, 0.4830571086F, 0.4835495732F, + 0.4840420293F, 0.4845344763F, 0.4850269136F, 0.4855193407F, + 0.4860117569F, 0.4865041617F, 0.4869965545F, 0.4874889347F, + 0.4879813018F, 0.4884736551F, 0.4889659941F, 0.4894583182F, + 0.4899506268F, 0.4904429193F, 0.4909351952F, 0.4914274538F, + 0.4919196947F, 0.4924119172F, 0.4929041207F, 0.4933963046F, + 0.4938884685F, 0.4943806116F, 0.4948727335F, 0.4953648335F, + 0.4958569110F, 0.4963489656F, 0.4968409965F, 0.4973330032F, + 0.4978249852F, 0.4983169419F, 0.4988088726F, 0.4993007768F, + 0.4997926539F, 0.5002845034F, 0.5007763247F, 0.5012681171F, + 0.5017598801F, 0.5022516132F, 0.5027433157F, 0.5032349871F, + 0.5037266268F, 0.5042182341F, 0.5047098086F, 0.5052013497F, + 0.5056928567F, 0.5061843292F, 0.5066757664F, 0.5071671679F, + 0.5076585330F, 0.5081498613F, 0.5086411520F, 0.5091324047F, + 0.5096236187F, 0.5101147934F, 0.5106059284F, 0.5110970230F, + 0.5115880766F, 0.5120790887F, 0.5125700587F, 0.5130609860F, + 0.5135518700F, 0.5140427102F, 0.5145335059F, 0.5150242566F, + 0.5155149618F, 0.5160056208F, 0.5164962331F, 0.5169867980F, + 0.5174773151F, 0.5179677837F, 0.5184582033F, 0.5189485733F, + 0.5194388931F, 0.5199291621F, 0.5204193798F, 0.5209095455F, + 0.5213996588F, 0.5218897190F, 0.5223797256F, 0.5228696779F, + 0.5233595755F, 0.5238494177F, 0.5243392039F, 0.5248289337F, + 0.5253186063F, 0.5258082213F, 0.5262977781F, 0.5267872760F, + 0.5272767146F, 0.5277660932F, 0.5282554112F, 0.5287446682F, + 0.5292338635F, 0.5297229965F, 0.5302120667F, 0.5307010736F, + 0.5311900164F, 0.5316788947F, 0.5321677079F, 0.5326564554F, + 0.5331451366F, 0.5336337511F, 0.5341222981F, 0.5346107771F, + 0.5350991876F, 0.5355875290F, 0.5360758007F, 0.5365640021F, + 0.5370521327F, 0.5375401920F, 0.5380281792F, 0.5385160939F, + 0.5390039355F, 0.5394917034F, 0.5399793971F, 0.5404670159F, + 0.5409545594F, 0.5414420269F, 0.5419294179F, 0.5424167318F, + 0.5429039680F, 0.5433911261F, 0.5438782053F, 0.5443652051F, + 0.5448521250F, 0.5453389644F, 0.5458257228F, 0.5463123995F, + 0.5467989940F, 0.5472855057F, 0.5477719341F, 0.5482582786F, + 0.5487445387F, 0.5492307137F, 0.5497168031F, 0.5502028063F, + 0.5506887228F, 0.5511745520F, 0.5516602934F, 0.5521459463F, + 0.5526315103F, 0.5531169847F, 0.5536023690F, 0.5540876626F, + 0.5545728649F, 0.5550579755F, 0.5555429937F, 0.5560279189F, + 0.5565127507F, 0.5569974884F, 0.5574821315F, 0.5579666794F, + 0.5584511316F, 0.5589354875F, 0.5594197465F, 0.5599039080F, + 0.5603879716F, 0.5608719367F, 0.5613558026F, 0.5618395689F, + 0.5623232350F, 0.5628068002F, 0.5632902642F, 0.5637736262F, + 0.5642568858F, 0.5647400423F, 0.5652230953F, 0.5657060442F, + 0.5661888883F, 0.5666716272F, 0.5671542603F, 0.5676367870F, + 0.5681192069F, 0.5686015192F, 0.5690837235F, 0.5695658192F, + 0.5700478058F, 0.5705296827F, 0.5710114494F, 0.5714931052F, + 0.5719746497F, 0.5724560822F, 0.5729374023F, 0.5734186094F, + 0.5738997029F, 0.5743806823F, 0.5748615470F, 0.5753422965F, + 0.5758229301F, 0.5763034475F, 0.5767838480F, 0.5772641310F, + 0.5777442960F, 0.5782243426F, 0.5787042700F, 0.5791840778F, + 0.5796637654F, 0.5801433322F, 0.5806227778F, 0.5811021016F, + 0.5815813029F, 0.5820603814F, 0.5825393363F, 0.5830181673F, + 0.5834968737F, 0.5839754549F, 0.5844539105F, 0.5849322399F, + 0.5854104425F, 0.5858885179F, 0.5863664653F, 0.5868442844F, + 0.5873219746F, 0.5877995353F, 0.5882769660F, 0.5887542661F, + 0.5892314351F, 0.5897084724F, 0.5901853776F, 0.5906621500F, + 0.5911387892F, 0.5916152945F, 0.5920916655F, 0.5925679016F, + 0.5930440022F, 0.5935199669F, 0.5939957950F, 0.5944714861F, + 0.5949470396F, 0.5954224550F, 0.5958977317F, 0.5963728692F, + 0.5968478669F, 0.5973227244F, 0.5977974411F, 0.5982720163F, + 0.5987464497F, 0.5992207407F, 0.5996948887F, 0.6001688932F, + 0.6006427537F, 0.6011164696F, 0.6015900405F, 0.6020634657F, + 0.6025367447F, 0.6030098770F, 0.6034828621F, 0.6039556995F, + 0.6044283885F, 0.6049009288F, 0.6053733196F, 0.6058455606F, + 0.6063176512F, 0.6067895909F, 0.6072613790F, 0.6077330152F, + 0.6082044989F, 0.6086758295F, 0.6091470065F, 0.6096180294F, + 0.6100888977F, 0.6105596108F, 0.6110301682F, 0.6115005694F, + 0.6119708139F, 0.6124409011F, 0.6129108305F, 0.6133806017F, + 0.6138502139F, 0.6143196669F, 0.6147889599F, 0.6152580926F, + 0.6157270643F, 0.6161958746F, 0.6166645230F, 0.6171330088F, + 0.6176013317F, 0.6180694910F, 0.6185374863F, 0.6190053171F, + 0.6194729827F, 0.6199404828F, 0.6204078167F, 0.6208749841F, + 0.6213419842F, 0.6218088168F, 0.6222754811F, 0.6227419768F, + 0.6232083032F, 0.6236744600F, 0.6241404465F, 0.6246062622F, + 0.6250719067F, 0.6255373795F, 0.6260026799F, 0.6264678076F, + 0.6269327619F, 0.6273975425F, 0.6278621487F, 0.6283265800F, + 0.6287908361F, 0.6292549163F, 0.6297188201F, 0.6301825471F, + 0.6306460966F, 0.6311094683F, 0.6315726617F, 0.6320356761F, + 0.6324985111F, 0.6329611662F, 0.6334236410F, 0.6338859348F, + 0.6343480472F, 0.6348099777F, 0.6352717257F, 0.6357332909F, + 0.6361946726F, 0.6366558704F, 0.6371168837F, 0.6375777122F, + 0.6380383552F, 0.6384988123F, 0.6389590830F, 0.6394191668F, + 0.6398790631F, 0.6403387716F, 0.6407982916F, 0.6412576228F, + 0.6417167645F, 0.6421757163F, 0.6426344778F, 0.6430930483F, + 0.6435514275F, 0.6440096149F, 0.6444676098F, 0.6449254119F, + 0.6453830207F, 0.6458404356F, 0.6462976562F, 0.6467546820F, + 0.6472115125F, 0.6476681472F, 0.6481245856F, 0.6485808273F, + 0.6490368717F, 0.6494927183F, 0.6499483667F, 0.6504038164F, + 0.6508590670F, 0.6513141178F, 0.6517689684F, 0.6522236185F, + 0.6526780673F, 0.6531323146F, 0.6535863598F, 0.6540402024F, + 0.6544938419F, 0.6549472779F, 0.6554005099F, 0.6558535373F, + 0.6563063598F, 0.6567589769F, 0.6572113880F, 0.6576635927F, + 0.6581155906F, 0.6585673810F, 0.6590189637F, 0.6594703380F, + 0.6599215035F, 0.6603724598F, 0.6608232064F, 0.6612737427F, + 0.6617240684F, 0.6621741829F, 0.6626240859F, 0.6630737767F, + 0.6635232550F, 0.6639725202F, 0.6644215720F, 0.6648704098F, + 0.6653190332F, 0.6657674417F, 0.6662156348F, 0.6666636121F, + 0.6671113731F, 0.6675589174F, 0.6680062445F, 0.6684533538F, + 0.6689002450F, 0.6693469177F, 0.6697933712F, 0.6702396052F, + 0.6706856193F, 0.6711314129F, 0.6715769855F, 0.6720223369F, + 0.6724674664F, 0.6729123736F, 0.6733570581F, 0.6738015194F, + 0.6742457570F, 0.6746897706F, 0.6751335596F, 0.6755771236F, + 0.6760204621F, 0.6764635747F, 0.6769064609F, 0.6773491204F, + 0.6777915525F, 0.6782337570F, 0.6786757332F, 0.6791174809F, + 0.6795589995F, 0.6800002886F, 0.6804413477F, 0.6808821765F, + 0.6813227743F, 0.6817631409F, 0.6822032758F, 0.6826431785F, + 0.6830828485F, 0.6835222855F, 0.6839614890F, 0.6844004585F, + 0.6848391936F, 0.6852776939F, 0.6857159589F, 0.6861539883F, + 0.6865917815F, 0.6870293381F, 0.6874666576F, 0.6879037398F, + 0.6883405840F, 0.6887771899F, 0.6892135571F, 0.6896496850F, + 0.6900855733F, 0.6905212216F, 0.6909566294F, 0.6913917963F, + 0.6918267218F, 0.6922614055F, 0.6926958471F, 0.6931300459F, + 0.6935640018F, 0.6939977141F, 0.6944311825F, 0.6948644066F, + 0.6952973859F, 0.6957301200F, 0.6961626085F, 0.6965948510F, + 0.6970268470F, 0.6974585961F, 0.6978900980F, 0.6983213521F, + 0.6987523580F, 0.6991831154F, 0.6996136238F, 0.7000438828F, + 0.7004738921F, 0.7009036510F, 0.7013331594F, 0.7017624166F, + 0.7021914224F, 0.7026201763F, 0.7030486779F, 0.7034769268F, + 0.7039049226F, 0.7043326648F, 0.7047601531F, 0.7051873870F, + 0.7056143662F, 0.7060410902F, 0.7064675586F, 0.7068937711F, + 0.7073197271F, 0.7077454264F, 0.7081708684F, 0.7085960529F, + 0.7090209793F, 0.7094456474F, 0.7098700566F, 0.7102942066F, + 0.7107180970F, 0.7111417274F, 0.7115650974F, 0.7119882066F, + 0.7124110545F, 0.7128336409F, 0.7132559653F, 0.7136780272F, + 0.7140998264F, 0.7145213624F, 0.7149426348F, 0.7153636433F, + 0.7157843874F, 0.7162048668F, 0.7166250810F, 0.7170450296F, + 0.7174647124F, 0.7178841289F, 0.7183032786F, 0.7187221613F, + 0.7191407765F, 0.7195591239F, 0.7199772030F, 0.7203950135F, + 0.7208125550F, 0.7212298271F, 0.7216468294F, 0.7220635616F, + 0.7224800233F, 0.7228962140F, 0.7233121335F, 0.7237277813F, + 0.7241431571F, 0.7245582604F, 0.7249730910F, 0.7253876484F, + 0.7258019322F, 0.7262159422F, 0.7266296778F, 0.7270431388F, + 0.7274563247F, 0.7278692353F, 0.7282818700F, 0.7286942287F, + 0.7291063108F, 0.7295181160F, 0.7299296440F, 0.7303408944F, + 0.7307518669F, 0.7311625609F, 0.7315729763F, 0.7319831126F, + 0.7323929695F, 0.7328025466F, 0.7332118435F, 0.7336208600F, + 0.7340295955F, 0.7344380499F, 0.7348462226F, 0.7352541134F, + 0.7356617220F, 0.7360690478F, 0.7364760907F, 0.7368828502F, + 0.7372893259F, 0.7376955176F, 0.7381014249F, 0.7385070475F, + 0.7389123849F, 0.7393174368F, 0.7397222029F, 0.7401266829F, + 0.7405308763F, 0.7409347829F, 0.7413384023F, 0.7417417341F, + 0.7421447780F, 0.7425475338F, 0.7429500009F, 0.7433521791F, + 0.7437540681F, 0.7441556674F, 0.7445569769F, 0.7449579960F, + 0.7453587245F, 0.7457591621F, 0.7461593084F, 0.7465591631F, + 0.7469587259F, 0.7473579963F, 0.7477569741F, 0.7481556590F, + 0.7485540506F, 0.7489521486F, 0.7493499526F, 0.7497474623F, + 0.7501446775F, 0.7505415977F, 0.7509382227F, 0.7513345521F, + 0.7517305856F, 0.7521263229F, 0.7525217636F, 0.7529169074F, + 0.7533117541F, 0.7537063032F, 0.7541005545F, 0.7544945076F, + 0.7548881623F, 0.7552815182F, 0.7556745749F, 0.7560673323F, + 0.7564597899F, 0.7568519474F, 0.7572438046F, 0.7576353611F, + 0.7580266166F, 0.7584175708F, 0.7588082235F, 0.7591985741F, + 0.7595886226F, 0.7599783685F, 0.7603678116F, 0.7607569515F, + 0.7611457879F, 0.7615343206F, 0.7619225493F, 0.7623104735F, + 0.7626980931F, 0.7630854078F, 0.7634724171F, 0.7638591209F, + 0.7642455188F, 0.7646316106F, 0.7650173959F, 0.7654028744F, + 0.7657880459F, 0.7661729100F, 0.7665574664F, 0.7669417150F, + 0.7673256553F, 0.7677092871F, 0.7680926100F, 0.7684756239F, + 0.7688583284F, 0.7692407232F, 0.7696228080F, 0.7700045826F, + 0.7703860467F, 0.7707671999F, 0.7711480420F, 0.7715285728F, + 0.7719087918F, 0.7722886989F, 0.7726682938F, 0.7730475762F, + 0.7734265458F, 0.7738052023F, 0.7741835454F, 0.7745615750F, + 0.7749392906F, 0.7753166921F, 0.7756937791F, 0.7760705514F, + 0.7764470087F, 0.7768231508F, 0.7771989773F, 0.7775744880F, + 0.7779496827F, 0.7783245610F, 0.7786991227F, 0.7790733676F, + 0.7794472953F, 0.7798209056F, 0.7801941982F, 0.7805671729F, + 0.7809398294F, 0.7813121675F, 0.7816841869F, 0.7820558873F, + 0.7824272684F, 0.7827983301F, 0.7831690720F, 0.7835394940F, + 0.7839095957F, 0.7842793768F, 0.7846488373F, 0.7850179767F, + 0.7853867948F, 0.7857552914F, 0.7861234663F, 0.7864913191F, + 0.7868588497F, 0.7872260578F, 0.7875929431F, 0.7879595055F, + 0.7883257445F, 0.7886916601F, 0.7890572520F, 0.7894225198F, + 0.7897874635F, 0.7901520827F, 0.7905163772F, 0.7908803468F, + 0.7912439912F, 0.7916073102F, 0.7919703035F, 0.7923329710F, + 0.7926953124F, 0.7930573274F, 0.7934190158F, 0.7937803774F, + 0.7941414120F, 0.7945021193F, 0.7948624991F, 0.7952225511F, + 0.7955822752F, 0.7959416711F, 0.7963007387F, 0.7966594775F, + 0.7970178875F, 0.7973759685F, 0.7977337201F, 0.7980911422F, + 0.7984482346F, 0.7988049970F, 0.7991614292F, 0.7995175310F, + 0.7998733022F, 0.8002287426F, 0.8005838519F, 0.8009386299F, + 0.8012930765F, 0.8016471914F, 0.8020009744F, 0.8023544253F, + 0.8027075438F, 0.8030603298F, 0.8034127831F, 0.8037649035F, + 0.8041166906F, 0.8044681445F, 0.8048192647F, 0.8051700512F, + 0.8055205038F, 0.8058706222F, 0.8062204062F, 0.8065698556F, + 0.8069189702F, 0.8072677499F, 0.8076161944F, 0.8079643036F, + 0.8083120772F, 0.8086595151F, 0.8090066170F, 0.8093533827F, + 0.8096998122F, 0.8100459051F, 0.8103916613F, 0.8107370806F, + 0.8110821628F, 0.8114269077F, 0.8117713151F, 0.8121153849F, + 0.8124591169F, 0.8128025108F, 0.8131455666F, 0.8134882839F, + 0.8138306627F, 0.8141727027F, 0.8145144038F, 0.8148557658F, + 0.8151967886F, 0.8155374718F, 0.8158778154F, 0.8162178192F, + 0.8165574830F, 0.8168968067F, 0.8172357900F, 0.8175744328F, + 0.8179127349F, 0.8182506962F, 0.8185883164F, 0.8189255955F, + 0.8192625332F, 0.8195991295F, 0.8199353840F, 0.8202712967F, + 0.8206068673F, 0.8209420958F, 0.8212769820F, 0.8216115256F, + 0.8219457266F, 0.8222795848F, 0.8226131000F, 0.8229462721F, + 0.8232791009F, 0.8236115863F, 0.8239437280F, 0.8242755260F, + 0.8246069801F, 0.8249380901F, 0.8252688559F, 0.8255992774F, + 0.8259293544F, 0.8262590867F, 0.8265884741F, 0.8269175167F, + 0.8272462141F, 0.8275745663F, 0.8279025732F, 0.8282302344F, + 0.8285575501F, 0.8288845199F, 0.8292111437F, 0.8295374215F, + 0.8298633530F, 0.8301889382F, 0.8305141768F, 0.8308390688F, + 0.8311636141F, 0.8314878124F, 0.8318116637F, 0.8321351678F, + 0.8324583246F, 0.8327811340F, 0.8331035957F, 0.8334257098F, + 0.8337474761F, 0.8340688944F, 0.8343899647F, 0.8347106867F, + 0.8350310605F, 0.8353510857F, 0.8356707624F, 0.8359900904F, + 0.8363090696F, 0.8366276999F, 0.8369459811F, 0.8372639131F, + 0.8375814958F, 0.8378987292F, 0.8382156130F, 0.8385321472F, + 0.8388483316F, 0.8391641662F, 0.8394796508F, 0.8397947853F, + 0.8401095697F, 0.8404240037F, 0.8407380873F, 0.8410518204F, + 0.8413652029F, 0.8416782347F, 0.8419909156F, 0.8423032456F, + 0.8426152245F, 0.8429268523F, 0.8432381289F, 0.8435490541F, + 0.8438596279F, 0.8441698502F, 0.8444797208F, 0.8447892396F, + 0.8450984067F, 0.8454072218F, 0.8457156849F, 0.8460237959F, + 0.8463315547F, 0.8466389612F, 0.8469460154F, 0.8472527170F, + 0.8475590661F, 0.8478650625F, 0.8481707063F, 0.8484759971F, + 0.8487809351F, 0.8490855201F, 0.8493897521F, 0.8496936308F, + 0.8499971564F, 0.8503003286F, 0.8506031474F, 0.8509056128F, + 0.8512077246F, 0.8515094828F, 0.8518108872F, 0.8521119379F, + 0.8524126348F, 0.8527129777F, 0.8530129666F, 0.8533126015F, + 0.8536118822F, 0.8539108087F, 0.8542093809F, 0.8545075988F, + 0.8548054623F, 0.8551029712F, 0.8554001257F, 0.8556969255F, + 0.8559933707F, 0.8562894611F, 0.8565851968F, 0.8568805775F, + 0.8571756034F, 0.8574702743F, 0.8577645902F, 0.8580585509F, + 0.8583521566F, 0.8586454070F, 0.8589383021F, 0.8592308420F, + 0.8595230265F, 0.8598148556F, 0.8601063292F, 0.8603974473F, + 0.8606882098F, 0.8609786167F, 0.8612686680F, 0.8615583636F, + 0.8618477034F, 0.8621366874F, 0.8624253156F, 0.8627135878F, + 0.8630015042F, 0.8632890646F, 0.8635762690F, 0.8638631173F, + 0.8641496096F, 0.8644357457F, 0.8647215257F, 0.8650069495F, + 0.8652920171F, 0.8655767283F, 0.8658610833F, 0.8661450820F, + 0.8664287243F, 0.8667120102F, 0.8669949397F, 0.8672775127F, + 0.8675597293F, 0.8678415894F, 0.8681230929F, 0.8684042398F, + 0.8686850302F, 0.8689654640F, 0.8692455412F, 0.8695252617F, + 0.8698046255F, 0.8700836327F, 0.8703622831F, 0.8706405768F, + 0.8709185138F, 0.8711960940F, 0.8714733174F, 0.8717501840F, + 0.8720266939F, 0.8723028469F, 0.8725786430F, 0.8728540824F, + 0.8731291648F, 0.8734038905F, 0.8736782592F, 0.8739522711F, + 0.8742259261F, 0.8744992242F, 0.8747721653F, 0.8750447496F, + 0.8753169770F, 0.8755888475F, 0.8758603611F, 0.8761315177F, + 0.8764023175F, 0.8766727603F, 0.8769428462F, 0.8772125752F, + 0.8774819474F, 0.8777509626F, 0.8780196209F, 0.8782879224F, + 0.8785558669F, 0.8788234546F, 0.8790906854F, 0.8793575594F, + 0.8796240765F, 0.8798902368F, 0.8801560403F, 0.8804214870F, + 0.8806865768F, 0.8809513099F, 0.8812156863F, 0.8814797059F, + 0.8817433687F, 0.8820066749F, 0.8822696243F, 0.8825322171F, + 0.8827944532F, 0.8830563327F, 0.8833178556F, 0.8835790219F, + 0.8838398316F, 0.8841002848F, 0.8843603815F, 0.8846201217F, + 0.8848795054F, 0.8851385327F, 0.8853972036F, 0.8856555182F, + 0.8859134764F, 0.8861710783F, 0.8864283239F, 0.8866852133F, + 0.8869417464F, 0.8871979234F, 0.8874537443F, 0.8877092090F, + 0.8879643177F, 0.8882190704F, 0.8884734671F, 0.8887275078F, + 0.8889811927F, 0.8892345216F, 0.8894874948F, 0.8897401122F, + 0.8899923738F, 0.8902442798F, 0.8904958301F, 0.8907470248F, + 0.8909978640F, 0.8912483477F, 0.8914984759F, 0.8917482487F, + 0.8919976662F, 0.8922467284F, 0.8924954353F, 0.8927437871F, + 0.8929917837F, 0.8932394252F, 0.8934867118F, 0.8937336433F, + 0.8939802199F, 0.8942264417F, 0.8944723087F, 0.8947178210F, + 0.8949629785F, 0.8952077815F, 0.8954522299F, 0.8956963239F, + 0.8959400634F, 0.8961834486F, 0.8964264795F, 0.8966691561F, + 0.8969114786F, 0.8971534470F, 0.8973950614F, 0.8976363219F, + 0.8978772284F, 0.8981177812F, 0.8983579802F, 0.8985978256F, + 0.8988373174F, 0.8990764556F, 0.8993152405F, 0.8995536720F, + 0.8997917502F, 0.9000294751F, 0.9002668470F, 0.9005038658F, + 0.9007405317F, 0.9009768446F, 0.9012128048F, 0.9014484123F, + 0.9016836671F, 0.9019185693F, 0.9021531191F, 0.9023873165F, + 0.9026211616F, 0.9028546546F, 0.9030877954F, 0.9033205841F, + 0.9035530210F, 0.9037851059F, 0.9040168392F, 0.9042482207F, + 0.9044792507F, 0.9047099293F, 0.9049402564F, 0.9051702323F, + 0.9053998569F, 0.9056291305F, 0.9058580531F, 0.9060866248F, + 0.9063148457F, 0.9065427159F, 0.9067702355F, 0.9069974046F, + 0.9072242233F, 0.9074506917F, 0.9076768100F, 0.9079025782F, + 0.9081279964F, 0.9083530647F, 0.9085777833F, 0.9088021523F, + 0.9090261717F, 0.9092498417F, 0.9094731623F, 0.9096961338F, + 0.9099187561F, 0.9101410295F, 0.9103629540F, 0.9105845297F, + 0.9108057568F, 0.9110266354F, 0.9112471656F, 0.9114673475F, + 0.9116871812F, 0.9119066668F, 0.9121258046F, 0.9123445945F, + 0.9125630367F, 0.9127811314F, 0.9129988786F, 0.9132162785F, + 0.9134333312F, 0.9136500368F, 0.9138663954F, 0.9140824073F, + 0.9142980724F, 0.9145133910F, 0.9147283632F, 0.9149429890F, + 0.9151572687F, 0.9153712023F, 0.9155847900F, 0.9157980319F, + 0.9160109282F, 0.9162234790F, 0.9164356844F, 0.9166475445F, + 0.9168590595F, 0.9170702296F, 0.9172810548F, 0.9174915354F, + 0.9177016714F, 0.9179114629F, 0.9181209102F, 0.9183300134F, + 0.9185387726F, 0.9187471879F, 0.9189552595F, 0.9191629876F, + 0.9193703723F, 0.9195774136F, 0.9197841119F, 0.9199904672F, + 0.9201964797F, 0.9204021495F, 0.9206074767F, 0.9208124616F, + 0.9210171043F, 0.9212214049F, 0.9214253636F, 0.9216289805F, + 0.9218322558F, 0.9220351896F, 0.9222377821F, 0.9224400335F, + 0.9226419439F, 0.9228435134F, 0.9230447423F, 0.9232456307F, + 0.9234461787F, 0.9236463865F, 0.9238462543F, 0.9240457822F, + 0.9242449704F, 0.9244438190F, 0.9246423282F, 0.9248404983F, + 0.9250383293F, 0.9252358214F, 0.9254329747F, 0.9256297896F, + 0.9258262660F, 0.9260224042F, 0.9262182044F, 0.9264136667F, + 0.9266087913F, 0.9268035783F, 0.9269980280F, 0.9271921405F, + 0.9273859160F, 0.9275793546F, 0.9277724566F, 0.9279652221F, + 0.9281576513F, 0.9283497443F, 0.9285415014F, 0.9287329227F, + 0.9289240084F, 0.9291147586F, 0.9293051737F, 0.9294952536F, + 0.9296849987F, 0.9298744091F, 0.9300634850F, 0.9302522266F, + 0.9304406340F, 0.9306287074F, 0.9308164471F, 0.9310038532F, + 0.9311909259F, 0.9313776654F, 0.9315640719F, 0.9317501455F, + 0.9319358865F, 0.9321212951F, 0.9323063713F, 0.9324911155F, + 0.9326755279F, 0.9328596085F, 0.9330433577F, 0.9332267756F, + 0.9334098623F, 0.9335926182F, 0.9337750434F, 0.9339571380F, + 0.9341389023F, 0.9343203366F, 0.9345014409F, 0.9346822155F, + 0.9348626606F, 0.9350427763F, 0.9352225630F, 0.9354020207F, + 0.9355811498F, 0.9357599503F, 0.9359384226F, 0.9361165667F, + 0.9362943830F, 0.9364718716F, 0.9366490327F, 0.9368258666F, + 0.9370023733F, 0.9371785533F, 0.9373544066F, 0.9375299335F, + 0.9377051341F, 0.9378800087F, 0.9380545576F, 0.9382287809F, + 0.9384026787F, 0.9385762515F, 0.9387494993F, 0.9389224223F, + 0.9390950209F, 0.9392672951F, 0.9394392453F, 0.9396108716F, + 0.9397821743F, 0.9399531536F, 0.9401238096F, 0.9402941427F, + 0.9404641530F, 0.9406338407F, 0.9408032061F, 0.9409722495F, + 0.9411409709F, 0.9413093707F, 0.9414774491F, 0.9416452062F, + 0.9418126424F, 0.9419797579F, 0.9421465528F, 0.9423130274F, + 0.9424791819F, 0.9426450166F, 0.9428105317F, 0.9429757274F, + 0.9431406039F, 0.9433051616F, 0.9434694005F, 0.9436333209F, + 0.9437969232F, 0.9439602074F, 0.9441231739F, 0.9442858229F, + 0.9444481545F, 0.9446101691F, 0.9447718669F, 0.9449332481F, + 0.9450943129F, 0.9452550617F, 0.9454154945F, 0.9455756118F, + 0.9457354136F, 0.9458949003F, 0.9460540721F, 0.9462129292F, + 0.9463714719F, 0.9465297003F, 0.9466876149F, 0.9468452157F, + 0.9470025031F, 0.9471594772F, 0.9473161384F, 0.9474724869F, + 0.9476285229F, 0.9477842466F, 0.9479396584F, 0.9480947585F, + 0.9482495470F, 0.9484040243F, 0.9485581906F, 0.9487120462F, + 0.9488655913F, 0.9490188262F, 0.9491717511F, 0.9493243662F, + 0.9494766718F, 0.9496286683F, 0.9497803557F, 0.9499317345F, + 0.9500828047F, 0.9502335668F, 0.9503840209F, 0.9505341673F, + 0.9506840062F, 0.9508335380F, 0.9509827629F, 0.9511316810F, + 0.9512802928F, 0.9514285984F, 0.9515765982F, 0.9517242923F, + 0.9518716810F, 0.9520187646F, 0.9521655434F, 0.9523120176F, + 0.9524581875F, 0.9526040534F, 0.9527496154F, 0.9528948739F, + 0.9530398292F, 0.9531844814F, 0.9533288310F, 0.9534728780F, + 0.9536166229F, 0.9537600659F, 0.9539032071F, 0.9540460470F, + 0.9541885858F, 0.9543308237F, 0.9544727611F, 0.9546143981F, + 0.9547557351F, 0.9548967723F, 0.9550375100F, 0.9551779485F, + 0.9553180881F, 0.9554579290F, 0.9555974714F, 0.9557367158F, + 0.9558756623F, 0.9560143112F, 0.9561526628F, 0.9562907174F, + 0.9564284752F, 0.9565659366F, 0.9567031017F, 0.9568399710F, + 0.9569765446F, 0.9571128229F, 0.9572488061F, 0.9573844944F, + 0.9575198883F, 0.9576549879F, 0.9577897936F, 0.9579243056F, + 0.9580585242F, 0.9581924497F, 0.9583260824F, 0.9584594226F, + 0.9585924705F, 0.9587252264F, 0.9588576906F, 0.9589898634F, + 0.9591217452F, 0.9592533360F, 0.9593846364F, 0.9595156465F, + 0.9596463666F, 0.9597767971F, 0.9599069382F, 0.9600367901F, + 0.9601663533F, 0.9602956279F, 0.9604246143F, 0.9605533128F, + 0.9606817236F, 0.9608098471F, 0.9609376835F, 0.9610652332F, + 0.9611924963F, 0.9613194733F, 0.9614461644F, 0.9615725699F, + 0.9616986901F, 0.9618245253F, 0.9619500757F, 0.9620753418F, + 0.9622003238F, 0.9623250219F, 0.9624494365F, 0.9625735679F, + 0.9626974163F, 0.9628209821F, 0.9629442656F, 0.9630672671F, + 0.9631899868F, 0.9633124251F, 0.9634345822F, 0.9635564585F, + 0.9636780543F, 0.9637993699F, 0.9639204056F, 0.9640411616F, + 0.9641616383F, 0.9642818359F, 0.9644017549F, 0.9645213955F, + 0.9646407579F, 0.9647598426F, 0.9648786497F, 0.9649971797F, + 0.9651154328F, 0.9652334092F, 0.9653511095F, 0.9654685337F, + 0.9655856823F, 0.9657025556F, 0.9658191538F, 0.9659354773F, + 0.9660515263F, 0.9661673013F, 0.9662828024F, 0.9663980300F, + 0.9665129845F, 0.9666276660F, 0.9667420750F, 0.9668562118F, + 0.9669700766F, 0.9670836698F, 0.9671969917F, 0.9673100425F, + 0.9674228227F, 0.9675353325F, 0.9676475722F, 0.9677595422F, + 0.9678712428F, 0.9679826742F, 0.9680938368F, 0.9682047309F, + 0.9683153569F, 0.9684257150F, 0.9685358056F, 0.9686456289F, + 0.9687551853F, 0.9688644752F, 0.9689734987F, 0.9690822564F, + 0.9691907483F, 0.9692989750F, 0.9694069367F, 0.9695146337F, + 0.9696220663F, 0.9697292349F, 0.9698361398F, 0.9699427813F, + 0.9700491597F, 0.9701552754F, 0.9702611286F, 0.9703667197F, + 0.9704720490F, 0.9705771169F, 0.9706819236F, 0.9707864695F, + 0.9708907549F, 0.9709947802F, 0.9710985456F, 0.9712020514F, + 0.9713052981F, 0.9714082859F, 0.9715110151F, 0.9716134862F, + 0.9717156993F, 0.9718176549F, 0.9719193532F, 0.9720207946F, + 0.9721219794F, 0.9722229080F, 0.9723235806F, 0.9724239976F, + 0.9725241593F, 0.9726240661F, 0.9727237183F, 0.9728231161F, + 0.9729222601F, 0.9730211503F, 0.9731197873F, 0.9732181713F, + 0.9733163027F, 0.9734141817F, 0.9735118088F, 0.9736091842F, + 0.9737063083F, 0.9738031814F, 0.9738998039F, 0.9739961760F, + 0.9740922981F, 0.9741881706F, 0.9742837938F, 0.9743791680F, + 0.9744742935F, 0.9745691707F, 0.9746637999F, 0.9747581814F, + 0.9748523157F, 0.9749462029F, 0.9750398435F, 0.9751332378F, + 0.9752263861F, 0.9753192887F, 0.9754119461F, 0.9755043585F, + 0.9755965262F, 0.9756884496F, 0.9757801291F, 0.9758715650F, + 0.9759627575F, 0.9760537071F, 0.9761444141F, 0.9762348789F, + 0.9763251016F, 0.9764150828F, 0.9765048228F, 0.9765943218F, + 0.9766835802F, 0.9767725984F, 0.9768613767F, 0.9769499154F, + 0.9770382149F, 0.9771262755F, 0.9772140976F, 0.9773016815F, + 0.9773890275F, 0.9774761360F, 0.9775630073F, 0.9776496418F, + 0.9777360398F, 0.9778222016F, 0.9779081277F, 0.9779938182F, + 0.9780792736F, 0.9781644943F, 0.9782494805F, 0.9783342326F, + 0.9784187509F, 0.9785030359F, 0.9785870877F, 0.9786709069F, + 0.9787544936F, 0.9788378484F, 0.9789209714F, 0.9790038631F, + 0.9790865238F, 0.9791689538F, 0.9792511535F, 0.9793331232F, + 0.9794148633F, 0.9794963742F, 0.9795776561F, 0.9796587094F, + 0.9797395345F, 0.9798201316F, 0.9799005013F, 0.9799806437F, + 0.9800605593F, 0.9801402483F, 0.9802197112F, 0.9802989483F, + 0.9803779600F, 0.9804567465F, 0.9805353082F, 0.9806136455F, + 0.9806917587F, 0.9807696482F, 0.9808473143F, 0.9809247574F, + 0.9810019778F, 0.9810789759F, 0.9811557519F, 0.9812323064F, + 0.9813086395F, 0.9813847517F, 0.9814606433F, 0.9815363147F, + 0.9816117662F, 0.9816869981F, 0.9817620108F, 0.9818368047F, + 0.9819113801F, 0.9819857374F, 0.9820598769F, 0.9821337989F, + 0.9822075038F, 0.9822809920F, 0.9823542638F, 0.9824273195F, + 0.9825001596F, 0.9825727843F, 0.9826451940F, 0.9827173891F, + 0.9827893700F, 0.9828611368F, 0.9829326901F, 0.9830040302F, + 0.9830751574F, 0.9831460720F, 0.9832167745F, 0.9832872652F, + 0.9833575444F, 0.9834276124F, 0.9834974697F, 0.9835671166F, + 0.9836365535F, 0.9837057806F, 0.9837747983F, 0.9838436071F, + 0.9839122072F, 0.9839805990F, 0.9840487829F, 0.9841167591F, + 0.9841845282F, 0.9842520903F, 0.9843194459F, 0.9843865953F, + 0.9844535389F, 0.9845202771F, 0.9845868101F, 0.9846531383F, + 0.9847192622F, 0.9847851820F, 0.9848508980F, 0.9849164108F, + 0.9849817205F, 0.9850468276F, 0.9851117324F, 0.9851764352F, + 0.9852409365F, 0.9853052366F, 0.9853693358F, 0.9854332344F, + 0.9854969330F, 0.9855604317F, 0.9856237309F, 0.9856868310F, + 0.9857497325F, 0.9858124355F, 0.9858749404F, 0.9859372477F, + 0.9859993577F, 0.9860612707F, 0.9861229871F, 0.9861845072F, + 0.9862458315F, 0.9863069601F, 0.9863678936F, 0.9864286322F, + 0.9864891764F, 0.9865495264F, 0.9866096826F, 0.9866696454F, + 0.9867294152F, 0.9867889922F, 0.9868483769F, 0.9869075695F, + 0.9869665706F, 0.9870253803F, 0.9870839991F, 0.9871424273F, + 0.9872006653F, 0.9872587135F, 0.9873165721F, 0.9873742415F, + 0.9874317222F, 0.9874890144F, 0.9875461185F, 0.9876030348F, + 0.9876597638F, 0.9877163057F, 0.9877726610F, 0.9878288300F, + 0.9878848130F, 0.9879406104F, 0.9879962225F, 0.9880516497F, + 0.9881068924F, 0.9881619509F, 0.9882168256F, 0.9882715168F, + 0.9883260249F, 0.9883803502F, 0.9884344931F, 0.9884884539F, + 0.9885422331F, 0.9885958309F, 0.9886492477F, 0.9887024838F, + 0.9887555397F, 0.9888084157F, 0.9888611120F, 0.9889136292F, + 0.9889659675F, 0.9890181273F, 0.9890701089F, 0.9891219128F, + 0.9891735392F, 0.9892249885F, 0.9892762610F, 0.9893273572F, + 0.9893782774F, 0.9894290219F, 0.9894795911F, 0.9895299853F, + 0.9895802049F, 0.9896302502F, 0.9896801217F, 0.9897298196F, + 0.9897793443F, 0.9898286961F, 0.9898778755F, 0.9899268828F, + 0.9899757183F, 0.9900243823F, 0.9900728753F, 0.9901211976F, + 0.9901693495F, 0.9902173314F, 0.9902651436F, 0.9903127865F, + 0.9903602605F, 0.9904075659F, 0.9904547031F, 0.9905016723F, + 0.9905484740F, 0.9905951086F, 0.9906415763F, 0.9906878775F, + 0.9907340126F, 0.9907799819F, 0.9908257858F, 0.9908714247F, + 0.9909168988F, 0.9909622086F, 0.9910073543F, 0.9910523364F, + 0.9910971552F, 0.9911418110F, 0.9911863042F, 0.9912306351F, + 0.9912748042F, 0.9913188117F, 0.9913626580F, 0.9914063435F, + 0.9914498684F, 0.9914932333F, 0.9915364383F, 0.9915794839F, + 0.9916223703F, 0.9916650981F, 0.9917076674F, 0.9917500787F, + 0.9917923323F, 0.9918344286F, 0.9918763679F, 0.9919181505F, + 0.9919597769F, 0.9920012473F, 0.9920425621F, 0.9920837217F, + 0.9921247263F, 0.9921655765F, 0.9922062724F, 0.9922468145F, + 0.9922872030F, 0.9923274385F, 0.9923675211F, 0.9924074513F, + 0.9924472294F, 0.9924868557F, 0.9925263306F, 0.9925656544F, + 0.9926048275F, 0.9926438503F, 0.9926827230F, 0.9927214461F, + 0.9927600199F, 0.9927984446F, 0.9928367208F, 0.9928748486F, + 0.9929128285F, 0.9929506608F, 0.9929883459F, 0.9930258841F, + 0.9930632757F, 0.9931005211F, 0.9931376207F, 0.9931745747F, + 0.9932113836F, 0.9932480476F, 0.9932845671F, 0.9933209425F, + 0.9933571742F, 0.9933932623F, 0.9934292074F, 0.9934650097F, + 0.9935006696F, 0.9935361874F, 0.9935715635F, 0.9936067982F, + 0.9936418919F, 0.9936768448F, 0.9937116574F, 0.9937463300F, + 0.9937808629F, 0.9938152565F, 0.9938495111F, 0.9938836271F, + 0.9939176047F, 0.9939514444F, 0.9939851465F, 0.9940187112F, + 0.9940521391F, 0.9940854303F, 0.9941185853F, 0.9941516044F, + 0.9941844879F, 0.9942172361F, 0.9942498495F, 0.9942823283F, + 0.9943146729F, 0.9943468836F, 0.9943789608F, 0.9944109047F, + 0.9944427158F, 0.9944743944F, 0.9945059408F, 0.9945373553F, + 0.9945686384F, 0.9945997902F, 0.9946308112F, 0.9946617017F, + 0.9946924621F, 0.9947230926F, 0.9947535937F, 0.9947839656F, + 0.9948142086F, 0.9948443232F, 0.9948743097F, 0.9949041683F, + 0.9949338995F, 0.9949635035F, 0.9949929807F, 0.9950223315F, + 0.9950515561F, 0.9950806549F, 0.9951096282F, 0.9951384764F, + 0.9951671998F, 0.9951957987F, 0.9952242735F, 0.9952526245F, + 0.9952808520F, 0.9953089564F, 0.9953369380F, 0.9953647971F, + 0.9953925340F, 0.9954201491F, 0.9954476428F, 0.9954750153F, + 0.9955022670F, 0.9955293981F, 0.9955564092F, 0.9955833003F, + 0.9956100720F, 0.9956367245F, 0.9956632582F, 0.9956896733F, + 0.9957159703F, 0.9957421494F, 0.9957682110F, 0.9957941553F, + 0.9958199828F, 0.9958456937F, 0.9958712884F, 0.9958967672F, + 0.9959221305F, 0.9959473784F, 0.9959725115F, 0.9959975300F, + 0.9960224342F, 0.9960472244F, 0.9960719011F, 0.9960964644F, + 0.9961209148F, 0.9961452525F, 0.9961694779F, 0.9961935913F, + 0.9962175930F, 0.9962414834F, 0.9962652627F, 0.9962889313F, + 0.9963124895F, 0.9963359377F, 0.9963592761F, 0.9963825051F, + 0.9964056250F, 0.9964286361F, 0.9964515387F, 0.9964743332F, + 0.9964970198F, 0.9965195990F, 0.9965420709F, 0.9965644360F, + 0.9965866946F, 0.9966088469F, 0.9966308932F, 0.9966528340F, + 0.9966746695F, 0.9966964001F, 0.9967180260F, 0.9967395475F, + 0.9967609651F, 0.9967822789F, 0.9968034894F, 0.9968245968F, + 0.9968456014F, 0.9968665036F, 0.9968873037F, 0.9969080019F, + 0.9969285987F, 0.9969490942F, 0.9969694889F, 0.9969897830F, + 0.9970099769F, 0.9970300708F, 0.9970500651F, 0.9970699601F, + 0.9970897561F, 0.9971094533F, 0.9971290522F, 0.9971485531F, + 0.9971679561F, 0.9971872617F, 0.9972064702F, 0.9972255818F, + 0.9972445968F, 0.9972635157F, 0.9972823386F, 0.9973010659F, + 0.9973196980F, 0.9973382350F, 0.9973566773F, 0.9973750253F, + 0.9973932791F, 0.9974114392F, 0.9974295059F, 0.9974474793F, + 0.9974653599F, 0.9974831480F, 0.9975008438F, 0.9975184476F, + 0.9975359598F, 0.9975533806F, 0.9975707104F, 0.9975879495F, + 0.9976050981F, 0.9976221566F, 0.9976391252F, 0.9976560043F, + 0.9976727941F, 0.9976894950F, 0.9977061073F, 0.9977226312F, + 0.9977390671F, 0.9977554152F, 0.9977716759F, 0.9977878495F, + 0.9978039361F, 0.9978199363F, 0.9978358501F, 0.9978516780F, + 0.9978674202F, 0.9978830771F, 0.9978986488F, 0.9979141358F, + 0.9979295383F, 0.9979448566F, 0.9979600909F, 0.9979752417F, + 0.9979903091F, 0.9980052936F, 0.9980201952F, 0.9980350145F, + 0.9980497515F, 0.9980644067F, 0.9980789804F, 0.9980934727F, + 0.9981078841F, 0.9981222147F, 0.9981364649F, 0.9981506350F, + 0.9981647253F, 0.9981787360F, 0.9981926674F, 0.9982065199F, + 0.9982202936F, 0.9982339890F, 0.9982476062F, 0.9982611456F, + 0.9982746074F, 0.9982879920F, 0.9983012996F, 0.9983145304F, + 0.9983276849F, 0.9983407632F, 0.9983537657F, 0.9983666926F, + 0.9983795442F, 0.9983923208F, 0.9984050226F, 0.9984176501F, + 0.9984302033F, 0.9984426827F, 0.9984550884F, 0.9984674208F, + 0.9984796802F, 0.9984918667F, 0.9985039808F, 0.9985160227F, + 0.9985279926F, 0.9985398909F, 0.9985517177F, 0.9985634734F, + 0.9985751583F, 0.9985867727F, 0.9985983167F, 0.9986097907F, + 0.9986211949F, 0.9986325297F, 0.9986437953F, 0.9986549919F, + 0.9986661199F, 0.9986771795F, 0.9986881710F, 0.9986990946F, + 0.9987099507F, 0.9987207394F, 0.9987314611F, 0.9987421161F, + 0.9987527045F, 0.9987632267F, 0.9987736829F, 0.9987840734F, + 0.9987943985F, 0.9988046584F, 0.9988148534F, 0.9988249838F, + 0.9988350498F, 0.9988450516F, 0.9988549897F, 0.9988648641F, + 0.9988746753F, 0.9988844233F, 0.9988941086F, 0.9989037313F, + 0.9989132918F, 0.9989227902F, 0.9989322269F, 0.9989416021F, + 0.9989509160F, 0.9989601690F, 0.9989693613F, 0.9989784931F, + 0.9989875647F, 0.9989965763F, 0.9990055283F, 0.9990144208F, + 0.9990232541F, 0.9990320286F, 0.9990407443F, 0.9990494016F, + 0.9990580008F, 0.9990665421F, 0.9990750257F, 0.9990834519F, + 0.9990918209F, 0.9991001331F, 0.9991083886F, 0.9991165877F, + 0.9991247307F, 0.9991328177F, 0.9991408491F, 0.9991488251F, + 0.9991567460F, 0.9991646119F, 0.9991724232F, 0.9991801801F, + 0.9991878828F, 0.9991955316F, 0.9992031267F, 0.9992106684F, + 0.9992181569F, 0.9992255925F, 0.9992329753F, 0.9992403057F, + 0.9992475839F, 0.9992548101F, 0.9992619846F, 0.9992691076F, + 0.9992761793F, 0.9992832001F, 0.9992901701F, 0.9992970895F, + 0.9993039587F, 0.9993107777F, 0.9993175470F, 0.9993242667F, + 0.9993309371F, 0.9993375583F, 0.9993441307F, 0.9993506545F, + 0.9993571298F, 0.9993635570F, 0.9993699362F, 0.9993762678F, + 0.9993825519F, 0.9993887887F, 0.9993949785F, 0.9994011216F, + 0.9994072181F, 0.9994132683F, 0.9994192725F, 0.9994252307F, + 0.9994311434F, 0.9994370107F, 0.9994428327F, 0.9994486099F, + 0.9994543423F, 0.9994600303F, 0.9994656739F, 0.9994712736F, + 0.9994768294F, 0.9994823417F, 0.9994878105F, 0.9994932363F, + 0.9994986191F, 0.9995039592F, 0.9995092568F, 0.9995145122F, + 0.9995197256F, 0.9995248971F, 0.9995300270F, 0.9995351156F, + 0.9995401630F, 0.9995451695F, 0.9995501352F, 0.9995550604F, + 0.9995599454F, 0.9995647903F, 0.9995695953F, 0.9995743607F, + 0.9995790866F, 0.9995837734F, 0.9995884211F, 0.9995930300F, + 0.9995976004F, 0.9996021324F, 0.9996066263F, 0.9996110822F, + 0.9996155004F, 0.9996198810F, 0.9996242244F, 0.9996285306F, + 0.9996327999F, 0.9996370326F, 0.9996412287F, 0.9996453886F, + 0.9996495125F, 0.9996536004F, 0.9996576527F, 0.9996616696F, + 0.9996656512F, 0.9996695977F, 0.9996735094F, 0.9996773865F, + 0.9996812291F, 0.9996850374F, 0.9996888118F, 0.9996925523F, + 0.9996962591F, 0.9996999325F, 0.9997035727F, 0.9997071798F, + 0.9997107541F, 0.9997142957F, 0.9997178049F, 0.9997212818F, + 0.9997247266F, 0.9997281396F, 0.9997315209F, 0.9997348708F, + 0.9997381893F, 0.9997414767F, 0.9997447333F, 0.9997479591F, + 0.9997511544F, 0.9997543194F, 0.9997574542F, 0.9997605591F, + 0.9997636342F, 0.9997666797F, 0.9997696958F, 0.9997726828F, + 0.9997756407F, 0.9997785698F, 0.9997814703F, 0.9997843423F, + 0.9997871860F, 0.9997900016F, 0.9997927894F, 0.9997955494F, + 0.9997982818F, 0.9998009869F, 0.9998036648F, 0.9998063157F, + 0.9998089398F, 0.9998115373F, 0.9998141082F, 0.9998166529F, + 0.9998191715F, 0.9998216642F, 0.9998241311F, 0.9998265724F, + 0.9998289884F, 0.9998313790F, 0.9998337447F, 0.9998360854F, + 0.9998384015F, 0.9998406930F, 0.9998429602F, 0.9998452031F, + 0.9998474221F, 0.9998496171F, 0.9998517885F, 0.9998539364F, + 0.9998560610F, 0.9998581624F, 0.9998602407F, 0.9998622962F, + 0.9998643291F, 0.9998663394F, 0.9998683274F, 0.9998702932F, + 0.9998722370F, 0.9998741589F, 0.9998760591F, 0.9998779378F, + 0.9998797952F, 0.9998816313F, 0.9998834464F, 0.9998852406F, + 0.9998870141F, 0.9998887670F, 0.9998904995F, 0.9998922117F, + 0.9998939039F, 0.9998955761F, 0.9998972285F, 0.9998988613F, + 0.9999004746F, 0.9999020686F, 0.9999036434F, 0.9999051992F, + 0.9999067362F, 0.9999082544F, 0.9999097541F, 0.9999112354F, + 0.9999126984F, 0.9999141433F, 0.9999155703F, 0.9999169794F, + 0.9999183709F, 0.9999197449F, 0.9999211014F, 0.9999224408F, + 0.9999237631F, 0.9999250684F, 0.9999263570F, 0.9999276289F, + 0.9999288843F, 0.9999301233F, 0.9999313461F, 0.9999325529F, + 0.9999337437F, 0.9999349187F, 0.9999360780F, 0.9999372218F, + 0.9999383503F, 0.9999394635F, 0.9999405616F, 0.9999416447F, + 0.9999427129F, 0.9999437665F, 0.9999448055F, 0.9999458301F, + 0.9999468404F, 0.9999478365F, 0.9999488185F, 0.9999497867F, + 0.9999507411F, 0.9999516819F, 0.9999526091F, 0.9999535230F, + 0.9999544236F, 0.9999553111F, 0.9999561856F, 0.9999570472F, + 0.9999578960F, 0.9999587323F, 0.9999595560F, 0.9999603674F, + 0.9999611666F, 0.9999619536F, 0.9999627286F, 0.9999634917F, + 0.9999642431F, 0.9999649828F, 0.9999657110F, 0.9999664278F, + 0.9999671334F, 0.9999678278F, 0.9999685111F, 0.9999691835F, + 0.9999698451F, 0.9999704960F, 0.9999711364F, 0.9999717662F, + 0.9999723858F, 0.9999729950F, 0.9999735942F, 0.9999741834F, + 0.9999747626F, 0.9999753321F, 0.9999758919F, 0.9999764421F, + 0.9999769828F, 0.9999775143F, 0.9999780364F, 0.9999785495F, + 0.9999790535F, 0.9999795485F, 0.9999800348F, 0.9999805124F, + 0.9999809813F, 0.9999814417F, 0.9999818938F, 0.9999823375F, + 0.9999827731F, 0.9999832005F, 0.9999836200F, 0.9999840316F, + 0.9999844353F, 0.9999848314F, 0.9999852199F, 0.9999856008F, + 0.9999859744F, 0.9999863407F, 0.9999866997F, 0.9999870516F, + 0.9999873965F, 0.9999877345F, 0.9999880656F, 0.9999883900F, + 0.9999887078F, 0.9999890190F, 0.9999893237F, 0.9999896220F, + 0.9999899140F, 0.9999901999F, 0.9999904796F, 0.9999907533F, + 0.9999910211F, 0.9999912830F, 0.9999915391F, 0.9999917896F, + 0.9999920345F, 0.9999922738F, 0.9999925077F, 0.9999927363F, + 0.9999929596F, 0.9999931777F, 0.9999933907F, 0.9999935987F, + 0.9999938018F, 0.9999940000F, 0.9999941934F, 0.9999943820F, + 0.9999945661F, 0.9999947456F, 0.9999949206F, 0.9999950912F, + 0.9999952575F, 0.9999954195F, 0.9999955773F, 0.9999957311F, + 0.9999958807F, 0.9999960265F, 0.9999961683F, 0.9999963063F, + 0.9999964405F, 0.9999965710F, 0.9999966979F, 0.9999968213F, + 0.9999969412F, 0.9999970576F, 0.9999971707F, 0.9999972805F, + 0.9999973871F, 0.9999974905F, 0.9999975909F, 0.9999976881F, + 0.9999977824F, 0.9999978738F, 0.9999979624F, 0.9999980481F, + 0.9999981311F, 0.9999982115F, 0.9999982892F, 0.9999983644F, + 0.9999984370F, 0.9999985072F, 0.9999985750F, 0.9999986405F, + 0.9999987037F, 0.9999987647F, 0.9999988235F, 0.9999988802F, + 0.9999989348F, 0.9999989873F, 0.9999990379F, 0.9999990866F, + 0.9999991334F, 0.9999991784F, 0.9999992217F, 0.9999992632F, + 0.9999993030F, 0.9999993411F, 0.9999993777F, 0.9999994128F, + 0.9999994463F, 0.9999994784F, 0.9999995091F, 0.9999995384F, + 0.9999995663F, 0.9999995930F, 0.9999996184F, 0.9999996426F, + 0.9999996657F, 0.9999996876F, 0.9999997084F, 0.9999997282F, + 0.9999997469F, 0.9999997647F, 0.9999997815F, 0.9999997973F, + 0.9999998123F, 0.9999998265F, 0.9999998398F, 0.9999998524F, + 0.9999998642F, 0.9999998753F, 0.9999998857F, 0.9999998954F, + 0.9999999045F, 0.9999999130F, 0.9999999209F, 0.9999999282F, + 0.9999999351F, 0.9999999414F, 0.9999999472F, 0.9999999526F, + 0.9999999576F, 0.9999999622F, 0.9999999664F, 0.9999999702F, + 0.9999999737F, 0.9999999769F, 0.9999999798F, 0.9999999824F, + 0.9999999847F, 0.9999999868F, 0.9999999887F, 0.9999999904F, + 0.9999999919F, 0.9999999932F, 0.9999999943F, 0.9999999953F, + 0.9999999961F, 0.9999999969F, 0.9999999975F, 0.9999999980F, + 0.9999999985F, 0.9999999988F, 0.9999999991F, 0.9999999993F, + 0.9999999995F, 0.9999999997F, 0.9999999998F, 0.9999999999F, + 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, + 1.0000000000F, 1.0000000000F, 1.0000000000F, 1.0000000000F, +}; + +static float *vwin[8] = { + vwin64, + vwin128, + vwin256, + vwin512, + vwin1024, + vwin2048, + vwin4096, + vwin8192, +}; + +float *_vorbis_window_get(int n){ + return vwin[n]; +} + +void _vorbis_apply_window(float *d,int *winno,long *blocksizes, + int lW,int W,int nW){ + lW=(W?lW:0); + nW=(W?nW:0); + + { + float *windowLW=vwin[winno[lW]]; + float *windowNW=vwin[winno[nW]]; + + long n=blocksizes[W]; + long ln=blocksizes[lW]; + long rn=blocksizes[nW]; + + long leftbegin=n/4-ln/4; + long leftend=leftbegin+ln/2; + + long rightbegin=n/2+n/4-rn/4; + long rightend=rightbegin+rn/2; + + int i,p; + + for(i=0;i>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); + x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); + x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); + x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); + return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); +} + + +/* ogg_stream_state contains the current encode/decode state of a logical + Ogg bitstream **********************************************************/ + +typedef struct { + unsigned char *body_data; /* bytes from packet bodies */ + long body_storage; /* storage elements allocated */ + long body_fill; /* elements stored; fill mark */ + long body_returned; /* elements of fill returned */ + + + int *lacing_vals; /* The values that will go to the segment table */ + ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact + this way, but it is simple coupled to the + lacing fifo */ + long lacing_storage; + long lacing_fill; + long lacing_packet; + long lacing_returned; + + unsigned char header[282]; /* working space for header encode */ + int header_fill; + + int e_o_s; /* set when we have buffered the last packet in the + logical bitstream */ + int b_o_s; /* set after we've written the initial page + of a logical bitstream */ + long serialno; + long pageno; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ + ogg_int64_t granulepos; + +} ogg_stream_state; + +/* ogg_packet is used to encapsulate the data and metadata belonging + to a single raw Ogg/Vorbis packet *************************************/ + +typedef struct { + unsigned char *packet; + long bytes; + long b_o_s; + long e_o_s; + + ogg_int64_t granulepos; + + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ +} ogg_packet; + +typedef struct { + unsigned char *data; + int storage; + int fill; + int returned; + + int unsynced; + int headerbytes; + int bodybytes; +} ogg_sync_state; + +/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ + +extern void oggpack_writeinit(oggpack_buffer *b); +extern void oggpack_writetrunc(oggpack_buffer *b,long bits); +extern void oggpack_writealign(oggpack_buffer *b); +extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpack_reset(oggpack_buffer *b); +extern void oggpack_writeclear(oggpack_buffer *b); +extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpack_look(oggpack_buffer *b,int bits); +extern long oggpack_look1(oggpack_buffer *b); +extern void oggpack_adv(oggpack_buffer *b,int bits); +extern void oggpack_adv1(oggpack_buffer *b); +extern long oggpack_read(oggpack_buffer *b,int bits); +extern long oggpack_read1(oggpack_buffer *b); +extern long oggpack_bytes(oggpack_buffer *b); +extern long oggpack_bits(oggpack_buffer *b); +extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); + +extern void oggpackB_writeinit(oggpack_buffer *b); +extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); +extern void oggpackB_writealign(oggpack_buffer *b); +extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpackB_reset(oggpack_buffer *b); +extern void oggpackB_writeclear(oggpack_buffer *b); +extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpackB_look(oggpack_buffer *b,int bits); +extern long oggpackB_look1(oggpack_buffer *b); +extern void oggpackB_adv(oggpack_buffer *b,int bits); +extern void oggpackB_adv1(oggpack_buffer *b); +extern long oggpackB_read(oggpack_buffer *b,int bits); +extern long oggpackB_read1(oggpack_buffer *b); +extern long oggpackB_bytes(oggpack_buffer *b); +extern long oggpackB_bits(oggpack_buffer *b); +extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); + +/* Ogg BITSTREAM PRIMITIVES: encoding **************************/ + +extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); + +/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ + +extern int ogg_sync_init(ogg_sync_state *oy); +extern int ogg_sync_clear(ogg_sync_state *oy); +extern int ogg_sync_reset(ogg_sync_state *oy); +extern int ogg_sync_destroy(ogg_sync_state *oy); + +extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); +extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); +extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); +extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); +extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); +extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); + +/* Ogg BITSTREAM PRIMITIVES: general ***************************/ + +extern int ogg_stream_init(ogg_stream_state *os,int serialno); +extern int ogg_stream_clear(ogg_stream_state *os); +extern int ogg_stream_reset(ogg_stream_state *os); +extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); +extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_eos(ogg_stream_state *os); + +extern void ogg_page_checksum_set(ogg_page *og); + +extern int ogg_page_version(ogg_page *og); +extern int ogg_page_continued(ogg_page *og); +extern int ogg_page_bos(ogg_page *og); +extern int ogg_page_eos(ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(ogg_page *og); +extern int ogg_page_serialno(ogg_page *og); +extern long ogg_page_pageno(ogg_page *og); +extern int ogg_page_packets(ogg_page *og); + +extern void ogg_packet_clear(ogg_packet *op); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OGG_H */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h new file mode 100644 index 0000000000..fa7b49f50e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h @@ -0,0 +1,127 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + last mod: $Id: os_types.h,v 1.1 2007/06/07 17:48:18 jules_rms Exp $ + + ********************************************************************/ +#ifndef _OS_TYPES_H +#define _OS_TYPES_H + +/* make it easy on the folks that want to compile the libs with a + different malloc than stdlib */ +#define _ogg_malloc malloc +#define _ogg_calloc calloc +#define _ogg_realloc realloc +#define _ogg_free free + +#if defined(_WIN32) + +# if defined(__CYGWIN__) +# include <_G_config.h> + typedef _G_int64_t ogg_int64_t; + typedef _G_int32_t ogg_int32_t; + typedef _G_uint32_t ogg_uint32_t; + typedef _G_int16_t ogg_int16_t; + typedef _G_uint16_t ogg_uint16_t; +# elif defined(__MINGW32__) + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + typedef unsigned long long ogg_uint64_t; +# elif defined(__MWERKS__) + typedef long long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; +# else + /* MSVC/Borland */ + typedef __int64 ogg_int64_t; + typedef __int32 ogg_int32_t; + typedef unsigned __int32 ogg_uint32_t; + typedef __int16 ogg_int16_t; + typedef unsigned __int16 ogg_uint16_t; +# endif + +#elif defined(__MACOS__) + +# include + typedef SInt16 ogg_int16_t; + typedef UInt16 ogg_uint16_t; + typedef SInt32 ogg_int32_t; + typedef UInt32 ogg_uint32_t; + typedef SInt64 ogg_int64_t; + +#elif defined(__MACOSX__) /* MacOS X Framework build */ + +# include + typedef int16_t ogg_int16_t; + typedef u_int16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef u_int32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined(__BEOS__) + + /* Be */ +# include + typedef int16_t ogg_int16_t; + typedef u_int16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef u_int32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined (DJGPP) + + /* DJGPP */ + typedef short ogg_int16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined(R5900) + + /* PS2 EE */ + typedef long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned ogg_uint32_t; + typedef short ogg_int16_t; + +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + +#else + +# include +# include "config_types.h" + +#endif + +#endif /* _OS_TYPES_H */ diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h new file mode 100644 index 0000000000..c7a23f9a3e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h @@ -0,0 +1,436 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: vorbis encode-engine setup + last mod: $Id: vorbisenc.h 17021 2010-03-24 09:29:41Z xiphmont $ + + ********************************************************************/ + +/** \file + * Libvorbisenc is a convenient API for setting up an encoding + * environment using libvorbis. Libvorbisenc encapsulates the + * actions needed to set up the encoder properly. + */ + +#ifndef _OV_ENC_H_ +#define _OV_ENC_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include "codec.h" + +/** + * This is the primary function within libvorbisenc for setting up managed + * bitrate modes. + * + * Before this function is called, the \ref vorbis_info + * struct should be initialized by using vorbis_info_init() from the libvorbis + * API. After encoding, vorbis_info_clear() should be called. + * + * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set + * constraints for the encoded file. This function uses these settings to + * select the appropriate encoding mode and set it up. + * + * \param vi Pointer to an initialized \ref vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. + * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. + * \param min_bitrate Desired minimum bitrate. -1 indicates unset. + * + * \return Zero for success, and negative values for failure. + * + * \retval 0 Success. + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. + */ +extern int vorbis_encode_init(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + +/** + * This function performs step-one of a three-step bitrate-managed encode + * setup. It functions similarly to the one-step setup performed by \ref + * vorbis_encode_init but allows an application to make further encode setup + * tweaks using \ref vorbis_encode_ctl before finally calling \ref + * vorbis_encode_setup_init to complete the setup process. + * + * Before this function is called, the \ref vorbis_info struct should be + * initialized by using vorbis_info_init() from the libvorbis API. After + * encoding, vorbis_info_clear() should be called. + * + * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set + * constraints for the encoded file. This function uses these settings to + * select the appropriate encoding mode and set it up. + * + * \param vi Pointer to an initialized vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. + * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. + * \param min_bitrate Desired minimum bitrate. -1 indicates unset. + * + * \return Zero for success, and negative for failure. + * + * \retval 0 Success + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. + */ +extern int vorbis_encode_setup_managed(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + +/** + * This function performs step-one of a three-step variable bitrate + * (quality-based) encode setup. It functions similarly to the one-step setup + * performed by \ref vorbis_encode_init_vbr() but allows an application to + * make further encode setup tweaks using \ref vorbis_encode_ctl() before + * finally calling \ref vorbis_encode_setup_init to complete the setup + * process. + * + * Before this function is called, the \ref vorbis_info struct should be + * initialized by using \ref vorbis_info_init() from the libvorbis API. After + * encoding, vorbis_info_clear() should be called. + * + * \param vi Pointer to an initialized vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). + * + * \return Zero for success, and negative values for failure. + * + * \retval 0 Success + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. + */ +extern int vorbis_encode_setup_vbr(vorbis_info *vi, + long channels, + long rate, + + float quality + ); + +/** + * This is the primary function within libvorbisenc for setting up variable + * bitrate ("quality" based) modes. + * + * + * Before this function is called, the vorbis_info struct should be + * initialized by using vorbis_info_init() from the libvorbis API. After + * encoding, vorbis_info_clear() should be called. + * + * \param vi Pointer to an initialized vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). + * + * + * \return Zero for success, or a negative number for failure. + * + * \retval 0 Success + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. + */ +extern int vorbis_encode_init_vbr(vorbis_info *vi, + long channels, + long rate, + + float base_quality + ); + +/** + * This function performs the last stage of three-step encoding setup, as + * described in the API overview under managed bitrate modes. + * + * Before this function is called, the \ref vorbis_info struct should be + * initialized by using vorbis_info_init() from the libvorbis API, one of + * \ref vorbis_encode_setup_managed() or \ref vorbis_encode_setup_vbr() called to + * initialize the high-level encoding setup, and \ref vorbis_encode_ctl() + * called if necessary to make encoding setup changes. + * vorbis_encode_setup_init() finalizes the highlevel encoding structure into + * a complete encoding setup after which the application may make no further + * setup changes. + * + * After encoding, vorbis_info_clear() should be called. + * + * \param vi Pointer to an initialized \ref vorbis_info struct. + * + * \return Zero for success, and negative values for failure. + * + * \retval 0 Success. + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * + * \retval OV_EINVAL Attempt to use vorbis_encode_setup_init() without first + * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to + * initialize the high-level encoding setup + * + */ +extern int vorbis_encode_setup_init(vorbis_info *vi); + +/** + * This function implements a generic interface to miscellaneous encoder + * settings similar to the classic UNIX 'ioctl()' system call. Applications + * may use vorbis_encode_ctl() to query or set bitrate management or quality + * mode details by using one of several \e request arguments detailed below. + * vorbis_encode_ctl() must be called after one of + * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr(). When used + * to modify settings, \ref vorbis_encode_ctl() must be called before \ref + * vorbis_encode_setup_init(). + * + * \param vi Pointer to an initialized vorbis_info struct. + * + * \param number Specifies the desired action; See \ref encctlcodes "the list + * of available requests". + * + * \param arg void * pointing to a data structure matching the request + * argument. + * + * \retval 0 Success. Any further return information (such as the result of a + * query) is placed into the storage pointed to by *arg. + * + * \retval OV_EINVAL Invalid argument, or an attempt to modify a setting after + * calling vorbis_encode_setup_init(). + * + * \retval OV_EIMPL Unimplemented or unknown request + */ +extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); + +/** + * \deprecated This is a deprecated interface. Please use vorbis_encode_ctl() + * with the \ref ovectl_ratemanage2_arg struct and \ref + * OV_ECTL_RATEMANAGE2_GET and \ref OV_ECTL_RATEMANAGE2_SET calls in new code. + * + * The \ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl() + * and the \ref OV_ECTL_RATEMANAGE_GET, \ref OV_ECTL_RATEMANAGE_SET, \ref + * OV_ECTL_RATEMANAGE_AVG, \ref OV_ECTL_RATEMANAGE_HARD calls in order to + * query and modify specifics of the encoder's bitrate management + * configuration. +*/ +struct ovectl_ratemanage_arg { + int management_active; /**< nonzero if bitrate management is active*/ +/** hard lower limit (in kilobits per second) below which the stream bitrate + will never be allowed for any given bitrate_hard_window seconds of time.*/ + long bitrate_hard_min; +/** hard upper limit (in kilobits per second) above which the stream bitrate + will never be allowed for any given bitrate_hard_window seconds of time.*/ + long bitrate_hard_max; +/** the window period (in seconds) used to regulate the hard bitrate minimum + and maximum*/ + double bitrate_hard_window; +/** soft lower limit (in kilobits per second) below which the average bitrate + tracker will start nudging the bitrate higher.*/ + long bitrate_av_lo; +/** soft upper limit (in kilobits per second) above which the average bitrate + tracker will start nudging the bitrate lower.*/ + long bitrate_av_hi; +/** the window period (in seconds) used to regulate the average bitrate + minimum and maximum.*/ + double bitrate_av_window; +/** Regulates the relative centering of the average and hard windows; in + libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but + followed the average window regulation. In libvorbis 1.1 a bit-reservoir + interface replaces the old windowing interface; the older windowing + interface is simulated and this field has no effect.*/ + double bitrate_av_window_center; +}; + +/** + * \name struct ovectl_ratemanage2_arg + * + * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and + * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to + * query and modify specifics of the encoder's bitrate management + * configuration. + * +*/ +struct ovectl_ratemanage2_arg { + int management_active; /**< nonzero if bitrate management is active */ +/** Lower allowed bitrate limit in kilobits per second */ + long bitrate_limit_min_kbps; +/** Upper allowed bitrate limit in kilobits per second */ + long bitrate_limit_max_kbps; + long bitrate_limit_reservoir_bits; /**struct ovectl_ratemanage2_arg *
    + * + * Used to query the current encoder bitrate management setting. Also used to + * initialize fields of an ovectl_ratemanage2_arg structure for use with + * \ref OV_ECTL_RATEMANAGE2_SET. + */ +#define OV_ECTL_RATEMANAGE2_GET 0x14 + +/** + * Set the current encoder bitrate management settings. + * + * Argument: struct ovectl_ratemanage2_arg * + * + * Used to set the current encoder bitrate management settings to the values + * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable + * bitrate management. +*/ +#define OV_ECTL_RATEMANAGE2_SET 0x15 + +/** + * Returns the current encoder hard-lowpass setting (kHz) in the double + * pointed to by arg. + * + * Argument: double * +*/ +#define OV_ECTL_LOWPASS_GET 0x20 + +/** + * Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid + * lowpass settings range from 2 to 99. + * + * Argument: double * +*/ +#define OV_ECTL_LOWPASS_SET 0x21 + +/** + * Returns the current encoder impulse block setting in the double pointed + * to by arg. + * + * Argument: double * +*/ +#define OV_ECTL_IBLOCK_GET 0x30 + +/** + * Sets the impulse block bias to the the value pointed to by arg. + * + * Argument: double * + * + * Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will + * direct to encoder to use more bits when incoding short blocks that contain + * strong impulses, thus improving the accuracy of impulse encoding. + */ +#define OV_ECTL_IBLOCK_SET 0x31 + +/** + * Returns the current encoder coupling setting in the int pointed + * to by arg. + * + * Argument: int * +*/ +#define OV_ECTL_COUPLING_GET 0x40 + +/** + * Enables/disables channel coupling in multichannel encoding according to arg. + * + * Argument: int * + * + * Zero disables channel coupling for multichannel inputs, nonzer enables + * channel coupling. Setting has no effect on monophonic encoding or + * multichannel counts that do not offer coupling. At present, coupling is + * available for stereo and 5.1 encoding. + */ +#define OV_ECTL_COUPLING_SET 0x41 + + /* deprecated rate management supported only for compatibility */ + +/** + * Old interface to querying bitrate management settings. + * + * Deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_GET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_GET 0x10 +/** + * Old interface to modifying bitrate management settings. + * + * deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + * + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_SET 0x11 +/** + * Old interface to setting average-bitrate encoding mode. + * + * Deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + * + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_AVG 0x12 +/** + * Old interface to setting bounded-bitrate encoding modes. + * + * deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + * + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_HARD 0x13 + +/*@}*/ + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h new file mode 100644 index 0000000000..ee6e3f73d5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h @@ -0,0 +1,205 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $ + + ********************************************************************/ + +#ifndef _OV_FILE_H_ +#define _OV_FILE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include +#include "codec.h" + +/* The function prototypes for the callbacks are basically the same as for + * the stdio functions fread, fseek, fclose, ftell. + * The one difference is that the FILE * arguments have been replaced with + * a void * - this is to be used as a pointer to whatever internal data these + * functions might need. In the stdio case, it's just a FILE * cast to a void * + * + * If you use other functions, check the docs for these functions and return + * the right values. For seek_func(), you *MUST* return -1 if the stream is + * unseekable + */ +typedef struct { + size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); + int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); + int (*close_func) (void *datasource); + long (*tell_func) (void *datasource); +} ov_callbacks; + +#ifndef OV_EXCLUDE_STATIC_CALLBACKS + +/* a few sets of convenient callbacks, especially for use under + * Windows where ov_open_callbacks() should always be used instead of + * ov_open() to avoid problems with incompatible crt.o version linking + * issues. */ + +/*static int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){ + if(f==NULL)return(-1); + +#ifdef __MINGW32__ + return fseeko64(f,off,whence); +#elif defined (_WIN32) + return _fseeki64(f,off,whence); +#else + return fseek(f,off,whence); +#endif +}*/ + +/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as + * static data. That means that every file which includes this header + * will get its own copy of these structs whether it uses them or + * not unless it #defines OV_EXCLUDE_STATIC_CALLBACKS. + * These static symbols are essential on platforms such as Windows on + * which several different versions of stdio support may be linked to + * by different DLLs, and we need to be certain we know which one + * we're using (the same one as the main application). + */ + +/*static ov_callbacks OV_CALLBACKS_DEFAULT = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) NULL, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) fclose, + (long (*)(void *)) NULL +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) NULL, + (long (*)(void *)) NULL +};*/ + +#endif + +#define NOTOPEN 0 +#define PARTOPEN 1 +#define OPENED 2 +#define STREAMSET 3 +#define INITSET 4 + +typedef struct OggVorbis_File { + void *datasource; /* Pointer to a FILE *, etc. */ + int seekable; + ogg_int64_t offset; + ogg_int64_t end; + ogg_sync_state oy; + + /* If the FILE handle isn't seekable (eg, a pipe), only the current + stream appears */ + int links; + ogg_int64_t *offsets; + ogg_int64_t *dataoffsets; + long *serialnos; + ogg_int64_t *pcmlengths; /* overloaded to maintain binary + compatibility; x2 size, stores both + beginning and end values */ + vorbis_info *vi; + vorbis_comment *vc; + + /* Decoding working state local storage */ + ogg_int64_t pcm_offset; + int ready_state; + long current_serialno; + int current_link; + + double bittrack; + double samptrack; + + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + ov_callbacks callbacks; + +} OggVorbis_File; + + +extern int ov_clear(OggVorbis_File *vf); +extern int ov_fopen(const char *path,OggVorbis_File *vf); +extern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); + +extern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); +extern int ov_test_open(OggVorbis_File *vf); + +extern long ov_bitrate(OggVorbis_File *vf,int i); +extern long ov_bitrate_instant(OggVorbis_File *vf); +extern long ov_streams(OggVorbis_File *vf); +extern long ov_seekable(OggVorbis_File *vf); +extern long ov_serialnumber(OggVorbis_File *vf,int i); + +extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); +extern double ov_time_total(OggVorbis_File *vf,int i); + +extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek(OggVorbis_File *vf,double pos); +extern int ov_time_seek_page(OggVorbis_File *vf,double pos); + +extern int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek_lap(OggVorbis_File *vf,double pos); +extern int ov_time_seek_page_lap(OggVorbis_File *vf,double pos); + +extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); +extern double ov_time_tell(OggVorbis_File *vf); + +extern vorbis_info *ov_info(OggVorbis_File *vf,int link); +extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); + +extern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples, + int *bitstream); +extern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream, + void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param); +extern long ov_read(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream); +extern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2); + +extern int ov_halfrate(OggVorbis_File *vf,int flag); +extern int ov_halfrate_p(OggVorbis_File *vf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp new file mode 100644 index 0000000000..ad871765ad --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp @@ -0,0 +1,56 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioFormat::AudioFormat (String name, StringArray extensions) + : formatName (name), fileExtensions (extensions) +{ +} + +AudioFormat::AudioFormat (StringRef name, StringRef extensions) + : formatName (name.text), fileExtensions (StringArray::fromTokens (extensions, false)) +{ +} + +AudioFormat::~AudioFormat() +{ +} + +bool AudioFormat::canHandleFile (const File& f) +{ + for (int i = 0; i < fileExtensions.size(); ++i) + if (f.hasFileExtension (fileExtensions[i])) + return true; + + return false; +} + +const String& AudioFormat::getFormatName() const { return formatName; } +const StringArray& AudioFormat::getFileExtensions() const { return fileExtensions; } +bool AudioFormat::isCompressed() { return false; } +StringArray AudioFormat::getQualityOptions() { return StringArray(); } + +MemoryMappedAudioFormatReader* AudioFormat::createMemoryMappedReader (const File&) +{ + return nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h new file mode 100644 index 0000000000..196d4366c2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h @@ -0,0 +1,178 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOFORMAT_H_INCLUDED +#define JUCE_AUDIOFORMAT_H_INCLUDED + + +//============================================================================== +/** + Subclasses of AudioFormat are used to read and write different audio + file formats. + + @see AudioFormatReader, AudioFormatWriter, WavAudioFormat, AiffAudioFormat +*/ +class JUCE_API AudioFormat +{ +public: + //============================================================================== + /** Destructor. */ + virtual ~AudioFormat(); + + //============================================================================== + /** Returns the name of this format. + e.g. "WAV file" or "AIFF file" + */ + const String& getFormatName() const; + + /** Returns all the file extensions that might apply to a file of this format. + + The first item will be the one that's preferred when creating a new file. + + So for a wav file this might just return ".wav"; for an AIFF file it might + return two items, ".aif" and ".aiff" + */ + const StringArray& getFileExtensions() const; + + //============================================================================== + /** Returns true if this the given file can be read by this format. + + Subclasses shouldn't do too much work here, just check the extension or + file type. The base class implementation just checks the file's extension + against one of the ones that was registered in the constructor. + */ + virtual bool canHandleFile (const File& fileToTest); + + /** Returns a set of sample rates that the format can read and write. */ + virtual Array getPossibleSampleRates() = 0; + + /** Returns a set of bit depths that the format can read and write. */ + virtual Array getPossibleBitDepths() = 0; + + /** Returns true if the format can do 2-channel audio. */ + virtual bool canDoStereo() = 0; + + /** Returns true if the format can do 1-channel audio. */ + virtual bool canDoMono() = 0; + + /** Returns true if the format uses compressed data. */ + virtual bool isCompressed(); + + /** Returns a list of different qualities that can be used when writing. + + Non-compressed formats will just return an empty array, but for something + like Ogg-Vorbis or MP3, it might return a list of bit-rates, etc. + + When calling createWriterFor(), an index from this array is passed in to + tell the format which option is required. + */ + virtual StringArray getQualityOptions(); + + //============================================================================== + /** Tries to create an object that can read from a stream containing audio + data in this format. + + The reader object that is returned can be used to read from the stream, and + should then be deleted by the caller. + + @param sourceStream the stream to read from - the AudioFormatReader object + that is returned will delete this stream when it no longer + needs it. + @param deleteStreamIfOpeningFails if no reader can be created, this determines whether this method + should delete the stream object that was passed-in. (If a valid + reader is returned, it will always be in charge of deleting the + stream, so this parameter is ignored) + @see AudioFormatReader + */ + virtual AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) = 0; + + /** Attempts to create a MemoryMappedAudioFormatReader, if possible for this format. + If the format does not support this, the method will return nullptr; + */ + virtual MemoryMappedAudioFormatReader* createMemoryMappedReader (const File& file); + + /** Tries to create an object that can write to a stream with this audio format. + + The writer object that is returned can be used to write to the stream, and + should then be deleted by the caller. + + If the stream can't be created for some reason (e.g. the parameters passed in + here aren't suitable), this will return 0. + + @param streamToWriteTo the stream that the data will go to - this will be + deleted by the AudioFormatWriter object when it's no longer + needed. If no AudioFormatWriter can be created by this method, + the stream will NOT be deleted, so that the caller can re-use it + to try to open a different format, etc + @param sampleRateToUse the sample rate for the file, which must be one of the ones + returned by getPossibleSampleRates() + @param numberOfChannels the number of channels - this must be either 1 or 2, and + the choice will depend on the results of canDoMono() and + canDoStereo() + @param bitsPerSample the bits per sample to use - this must be one of the values + returned by getPossibleBitDepths() + @param metadataValues a set of metadata values that the writer should try to write + to the stream. Exactly what these are depends on the format, + and the subclass doesn't actually have to do anything with + them if it doesn't want to. Have a look at the specific format + implementation classes to see possible values that can be + used + @param qualityOptionIndex the index of one of compression qualities returned by the + getQualityOptions() method. If there aren't any quality options + for this format, just pass 0 in this parameter, as it'll be + ignored + @see AudioFormatWriter + */ + virtual AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) = 0; + +protected: + /** Creates an AudioFormat object. + + @param formatName this sets the value that will be returned by getFormatName() + @param fileExtensions an array of file extensions - these will be returned by getFileExtensions() + */ + AudioFormat (String formatName, StringArray fileExtensions); + + /** Creates an AudioFormat object. + + @param formatName this sets the value that will be returned by getFormatName() + @param fileExtensions a whitespace-separated list of file extensions - these will + be returned by getFileExtensions() + */ + AudioFormat (StringRef formatName, StringRef fileExtensions); + +private: + //============================================================================== + String formatName; + StringArray fileExtensions; +}; + + +#endif // JUCE_AUDIOFORMAT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp new file mode 100644 index 0000000000..f0196c8635 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp @@ -0,0 +1,177 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioFormatManager::AudioFormatManager() : defaultFormatIndex (0) {} +AudioFormatManager::~AudioFormatManager() {} + +//============================================================================== +void AudioFormatManager::registerFormat (AudioFormat* newFormat, const bool makeThisTheDefaultFormat) +{ + jassert (newFormat != nullptr); + + if (newFormat != nullptr) + { + #if JUCE_DEBUG + for (int i = getNumKnownFormats(); --i >= 0;) + { + if (getKnownFormat (i)->getFormatName() == newFormat->getFormatName()) + { + jassertfalse; // trying to add the same format twice! + } + } + #endif + + if (makeThisTheDefaultFormat) + defaultFormatIndex = getNumKnownFormats(); + + knownFormats.add (newFormat); + } +} + +void AudioFormatManager::registerBasicFormats() +{ + registerFormat (new WavAudioFormat(), true); + registerFormat (new AiffAudioFormat(), false); + + #if JUCE_USE_FLAC + registerFormat (new FlacAudioFormat(), false); + #endif + + #if JUCE_USE_OGGVORBIS + registerFormat (new OggVorbisAudioFormat(), false); + #endif + + #if JUCE_MAC || JUCE_IOS + registerFormat (new CoreAudioFormat(), false); + #endif + + #if JUCE_USE_MP3AUDIOFORMAT + registerFormat (new MP3AudioFormat(), false); + #endif + + #if JUCE_USE_WINDOWS_MEDIA_FORMAT + registerFormat (new WindowsMediaAudioFormat(), false); + #endif +} + +void AudioFormatManager::clearFormats() +{ + knownFormats.clear(); + defaultFormatIndex = 0; +} + +int AudioFormatManager::getNumKnownFormats() const +{ + return knownFormats.size(); +} + +AudioFormat* AudioFormatManager::getKnownFormat (const int index) const +{ + return knownFormats [index]; +} + +AudioFormat* AudioFormatManager::getDefaultFormat() const +{ + return getKnownFormat (defaultFormatIndex); +} + +AudioFormat* AudioFormatManager::findFormatForFileExtension (const String& fileExtension) const +{ + if (! fileExtension.startsWithChar ('.')) + return findFormatForFileExtension ("." + fileExtension); + + for (int i = 0; i < getNumKnownFormats(); ++i) + if (getKnownFormat(i)->getFileExtensions().contains (fileExtension, true)) + return getKnownFormat(i); + + return nullptr; +} + +String AudioFormatManager::getWildcardForAllFormats() const +{ + StringArray extensions; + + for (int i = 0; i < getNumKnownFormats(); ++i) + extensions.addArray (getKnownFormat(i)->getFileExtensions()); + + extensions.trim(); + extensions.removeEmptyStrings(); + + for (int i = 0; i < extensions.size(); ++i) + extensions.set (i, (extensions[i].startsWithChar ('.') ? "*" : "*.") + extensions[i]); + + extensions.removeDuplicates (true); + return extensions.joinIntoString (";"); +} + +//============================================================================== +AudioFormatReader* AudioFormatManager::createReaderFor (const File& file) +{ + // you need to actually register some formats before the manager can + // use them to open a file! + jassert (getNumKnownFormats() > 0); + + for (int i = 0; i < getNumKnownFormats(); ++i) + { + AudioFormat* const af = getKnownFormat(i); + + if (af->canHandleFile (file)) + if (InputStream* const in = file.createInputStream()) + if (AudioFormatReader* const r = af->createReaderFor (in, true)) + return r; + } + + return nullptr; +} + +AudioFormatReader* AudioFormatManager::createReaderFor (InputStream* audioFileStream) +{ + // you need to actually register some formats before the manager can + // use them to open a file! + jassert (getNumKnownFormats() > 0); + + ScopedPointer in (audioFileStream); + + if (in != nullptr) + { + const int64 originalStreamPos = in->getPosition(); + + for (int i = 0; i < getNumKnownFormats(); ++i) + { + if (AudioFormatReader* const r = getKnownFormat(i)->createReaderFor (in, false)) + { + in.release(); + return r; + } + + in->setPosition (originalStreamPos); + + // the stream that is passed-in must be capable of being repositioned so + // that all the formats can have a go at opening it. + jassert (in->getPosition() == originalStreamPos); + } + } + + return nullptr; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h new file mode 100644 index 0000000000..f560347d62 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h @@ -0,0 +1,143 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOFORMATMANAGER_H_INCLUDED +#define JUCE_AUDIOFORMATMANAGER_H_INCLUDED + + +//============================================================================== +/** + A class for keeping a list of available audio formats, and for deciding which + one to use to open a given file. + + After creating an AudioFormatManager object, you should call registerFormat() + or registerBasicFormats() to give it a list of format types that it can use. + + @see AudioFormat +*/ +class JUCE_API AudioFormatManager +{ +public: + //============================================================================== + /** Creates an empty format manager. + + Before it'll be any use, you'll need to call registerFormat() with all the + formats you want it to be able to recognise. + */ + AudioFormatManager(); + + /** Destructor. */ + ~AudioFormatManager(); + + //============================================================================== + /** Adds a format to the manager's list of available file types. + + The object passed-in will be deleted by this object, so don't keep a pointer + to it! + + If makeThisTheDefaultFormat is true, then the getDefaultFormat() method will + return this one when called. + */ + void registerFormat (AudioFormat* newFormat, + bool makeThisTheDefaultFormat); + + /** Handy method to make it easy to register the formats that come with Juce. + + Currently, this will add WAV and AIFF to the list. + */ + void registerBasicFormats(); + + /** Clears the list of known formats. */ + void clearFormats(); + + /** Returns the number of currently registered file formats. */ + int getNumKnownFormats() const; + + /** Returns one of the registered file formats. */ + AudioFormat* getKnownFormat (int index) const; + + /** Iterator access to the list of known formats. */ + AudioFormat** begin() const noexcept { return knownFormats.begin(); } + + /** Iterator access to the list of known formats. */ + AudioFormat** end() const noexcept { return knownFormats.end(); } + + /** Looks for which of the known formats is listed as being for a given file + extension. + + The extension may have a dot before it, so e.g. ".wav" or "wav" are both ok. + */ + AudioFormat* findFormatForFileExtension (const String& fileExtension) const; + + /** Returns the format which has been set as the default one. + + You can set a format as being the default when it is registered. It's useful + when you want to write to a file, because the best format may change between + platforms, e.g. AIFF is preferred on the Mac, WAV on Windows. + + If none has been set as the default, this method will just return the first + one in the list. + */ + AudioFormat* getDefaultFormat() const; + + /** Returns a set of wildcards for file-matching that contains the extensions for + all known formats. + + E.g. if might return "*.wav;*.aiff" if it just knows about wavs and aiffs. + */ + String getWildcardForAllFormats() const; + + //============================================================================== + /** Searches through the known formats to try to create a suitable reader for + this file. + + If none of the registered formats can open the file, it'll return 0. If it + returns a reader, it's the caller's responsibility to delete the reader. + */ + AudioFormatReader* createReaderFor (const File& audioFile); + + /** Searches through the known formats to try to create a suitable reader for + this stream. + + The stream object that is passed-in will be deleted by this method or by the + reader that is returned, so the caller should not keep any references to it. + + The stream that is passed-in must be capable of being repositioned so + that all the formats can have a go at opening it. + + If none of the registered formats can open the stream, it'll return 0. If it + returns a reader, it's the caller's responsibility to delete the reader. + */ + AudioFormatReader* createReaderFor (InputStream* audioFileStream); + +private: + //============================================================================== + OwnedArray knownFormats; + int defaultFormatIndex; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatManager) +}; + + +#endif // JUCE_AUDIOFORMATMANAGER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp new file mode 100644 index 0000000000..5db3149eff --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp @@ -0,0 +1,412 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioFormatReader::AudioFormatReader (InputStream* const in, const String& name) + : sampleRate (0), + bitsPerSample (0), + lengthInSamples (0), + numChannels (0), + usesFloatingPointData (false), + input (in), + formatName (name) +{ +} + +AudioFormatReader::~AudioFormatReader() +{ + delete input; +} + +bool AudioFormatReader::read (int* const* destSamples, + int numDestChannels, + int64 startSampleInSource, + int numSamplesToRead, + const bool fillLeftoverChannelsWithCopies) +{ + jassert (numDestChannels > 0); // you have to actually give this some channels to work with! + + int startOffsetInDestBuffer = 0; + + if (startSampleInSource < 0) + { + const int silence = (int) jmin (-startSampleInSource, (int64) numSamplesToRead); + + for (int i = numDestChannels; --i >= 0;) + if (destSamples[i] != nullptr) + zeromem (destSamples[i], sizeof (int) * (size_t) silence); + + startOffsetInDestBuffer += silence; + numSamplesToRead -= silence; + startSampleInSource = 0; + } + + if (numSamplesToRead <= 0) + return true; + + if (! readSamples (const_cast (destSamples), + jmin ((int) numChannels, numDestChannels), startOffsetInDestBuffer, + startSampleInSource, numSamplesToRead)) + return false; + + if (numDestChannels > (int) numChannels) + { + if (fillLeftoverChannelsWithCopies) + { + int* lastFullChannel = destSamples[0]; + + for (int i = (int) numChannels; --i > 0;) + { + if (destSamples[i] != nullptr) + { + lastFullChannel = destSamples[i]; + break; + } + } + + if (lastFullChannel != nullptr) + for (int i = (int) numChannels; i < numDestChannels; ++i) + if (destSamples[i] != nullptr) + memcpy (destSamples[i], lastFullChannel, sizeof (int) * (size_t) numSamplesToRead); + } + else + { + for (int i = (int) numChannels; i < numDestChannels; ++i) + if (destSamples[i] != nullptr) + zeromem (destSamples[i], sizeof (int) * (size_t) numSamplesToRead); + } + } + + return true; +} + +static void readChannels (AudioFormatReader& reader, + int** const chans, AudioSampleBuffer* const buffer, + const int startSample, const int numSamples, + const int64 readerStartSample, const int numTargetChannels) +{ + for (int j = 0; j < numTargetChannels; ++j) + chans[j] = reinterpret_cast (buffer->getWritePointer (j, startSample)); + + chans[numTargetChannels] = nullptr; + reader.read (chans, numTargetChannels, readerStartSample, numSamples, true); +} + +void AudioFormatReader::read (AudioSampleBuffer* buffer, + int startSample, + int numSamples, + int64 readerStartSample, + bool useReaderLeftChan, + bool useReaderRightChan) +{ + jassert (buffer != nullptr); + jassert (startSample >= 0 && startSample + numSamples <= buffer->getNumSamples()); + + if (numSamples > 0) + { + const int numTargetChannels = buffer->getNumChannels(); + + if (numTargetChannels <= 2) + { + int* const dest0 = reinterpret_cast (buffer->getWritePointer (0, startSample)); + int* const dest1 = reinterpret_cast (numTargetChannels > 1 ? buffer->getWritePointer (1, startSample) : nullptr); + int* chans[3]; + + if (useReaderLeftChan == useReaderRightChan) + { + chans[0] = dest0; + chans[1] = numChannels > 1 ? dest1 : nullptr; + } + else if (useReaderLeftChan || (numChannels == 1)) + { + chans[0] = dest0; + chans[1] = nullptr; + } + else if (useReaderRightChan) + { + chans[0] = nullptr; + chans[1] = dest0; + } + + chans[2] = nullptr; + read (chans, 2, readerStartSample, numSamples, true); + + // if the target's stereo and the source is mono, dupe the first channel.. + if (numTargetChannels > 1 && (chans[0] == nullptr || chans[1] == nullptr)) + memcpy (dest1, dest0, sizeof (float) * (size_t) numSamples); + } + else if (numTargetChannels <= 64) + { + int* chans[65]; + readChannels (*this, chans, buffer, startSample, numSamples, readerStartSample, numTargetChannels); + } + else + { + HeapBlock chans ((size_t) numTargetChannels); + readChannels (*this, chans, buffer, startSample, numSamples, readerStartSample, numTargetChannels); + } + + if (! usesFloatingPointData) + for (int j = 0; j < numTargetChannels; ++j) + if (float* const d = buffer->getWritePointer (j, startSample)) + FloatVectorOperations::convertFixedToFloat (d, reinterpret_cast (d), 1.0f / 0x7fffffff, numSamples); + } +} + +void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, + Range* const results, const int channelsToRead) +{ + jassert (channelsToRead > 0 && channelsToRead <= (int) numChannels); + + if (numSamples <= 0) + { + for (int i = 0; i < channelsToRead; ++i) + results[i] = Range(); + + return; + } + + const int bufferSize = (int) jmin (numSamples, (int64) 4096); + AudioSampleBuffer tempSampleBuffer ((int) channelsToRead, bufferSize); + + float* const* const floatBuffer = tempSampleBuffer.getArrayOfWritePointers(); + int* const* intBuffer = reinterpret_cast (floatBuffer); + bool isFirstBlock = true; + + while (numSamples > 0) + { + const int numToDo = (int) jmin (numSamples, (int64) bufferSize); + if (! read (intBuffer, channelsToRead, startSampleInFile, numToDo, false)) + break; + + for (int i = 0; i < channelsToRead; ++i) + { + Range r; + + if (usesFloatingPointData) + { + r = FloatVectorOperations::findMinAndMax (floatBuffer[i], numToDo); + } + else + { + Range intRange (Range::findMinAndMax (intBuffer[i], numToDo)); + + r = Range (intRange.getStart() / (float) std::numeric_limits::max(), + intRange.getEnd() / (float) std::numeric_limits::max()); + } + + results[i] = isFirstBlock ? r : results[i].getUnionWith (r); + } + + isFirstBlock = false; + numSamples -= numToDo; + startSampleInFile += numToDo; + } +} + +void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, + float& lowestLeft, float& highestLeft, + float& lowestRight, float& highestRight) +{ + Range levels[2]; + readMaxLevels (startSampleInFile, numSamples, levels, jmin (2, (int) numChannels)); + lowestLeft = levels[0].getStart(); + highestLeft = levels[0].getEnd(); + + if (numChannels > 1) + { + lowestRight = levels[1].getStart(); + highestRight = levels[1].getEnd(); + } + else + { + lowestRight = lowestLeft; + highestRight = highestLeft; + } +} + +int64 AudioFormatReader::searchForLevel (int64 startSample, + int64 numSamplesToSearch, + const double magnitudeRangeMinimum, + const double magnitudeRangeMaximum, + const int minimumConsecutiveSamples) +{ + if (numSamplesToSearch == 0) + return -1; + + const int bufferSize = 4096; + HeapBlock tempSpace (bufferSize * 2 + 64); + + int* tempBuffer[3]; + tempBuffer[0] = tempSpace.getData(); + tempBuffer[1] = tempSpace.getData() + bufferSize; + tempBuffer[2] = 0; + + int consecutive = 0; + int64 firstMatchPos = -1; + + jassert (magnitudeRangeMaximum > magnitudeRangeMinimum); + + const double doubleMin = jlimit (0.0, (double) std::numeric_limits::max(), magnitudeRangeMinimum * std::numeric_limits::max()); + const double doubleMax = jlimit (doubleMin, (double) std::numeric_limits::max(), magnitudeRangeMaximum * std::numeric_limits::max()); + const int intMagnitudeRangeMinimum = roundToInt (doubleMin); + const int intMagnitudeRangeMaximum = roundToInt (doubleMax); + + while (numSamplesToSearch != 0) + { + const int numThisTime = (int) jmin (abs64 (numSamplesToSearch), (int64) bufferSize); + int64 bufferStart = startSample; + + if (numSamplesToSearch < 0) + bufferStart -= numThisTime; + + if (bufferStart >= (int) lengthInSamples) + break; + + read (tempBuffer, 2, bufferStart, numThisTime, false); + + int num = numThisTime; + while (--num >= 0) + { + if (numSamplesToSearch < 0) + --startSample; + + bool matches = false; + const int index = (int) (startSample - bufferStart); + + if (usesFloatingPointData) + { + const float sample1 = std::abs (((float*) tempBuffer[0]) [index]); + + if (sample1 >= magnitudeRangeMinimum + && sample1 <= magnitudeRangeMaximum) + { + matches = true; + } + else if (numChannels > 1) + { + const float sample2 = std::abs (((float*) tempBuffer[1]) [index]); + + matches = (sample2 >= magnitudeRangeMinimum + && sample2 <= magnitudeRangeMaximum); + } + } + else + { + const int sample1 = abs (tempBuffer[0] [index]); + + if (sample1 >= intMagnitudeRangeMinimum + && sample1 <= intMagnitudeRangeMaximum) + { + matches = true; + } + else if (numChannels > 1) + { + const int sample2 = abs (tempBuffer[1][index]); + + matches = (sample2 >= intMagnitudeRangeMinimum + && sample2 <= intMagnitudeRangeMaximum); + } + } + + if (matches) + { + if (firstMatchPos < 0) + firstMatchPos = startSample; + + if (++consecutive >= minimumConsecutiveSamples) + { + if (firstMatchPos < 0 || firstMatchPos >= lengthInSamples) + return -1; + + return firstMatchPos; + } + } + else + { + consecutive = 0; + firstMatchPos = -1; + } + + if (numSamplesToSearch > 0) + ++startSample; + } + + if (numSamplesToSearch > 0) + numSamplesToSearch -= numThisTime; + else + numSamplesToSearch += numThisTime; + } + + return -1; +} + +//============================================================================== +MemoryMappedAudioFormatReader::MemoryMappedAudioFormatReader (const File& f, const AudioFormatReader& reader, + int64 start, int64 length, int frameSize) + : AudioFormatReader (nullptr, reader.getFormatName()), file (f), + dataChunkStart (start), dataLength (length), bytesPerFrame (frameSize) +{ + sampleRate = reader.sampleRate; + bitsPerSample = reader.bitsPerSample; + lengthInSamples = reader.lengthInSamples; + numChannels = reader.numChannels; + metadataValues = reader.metadataValues; + usesFloatingPointData = reader.usesFloatingPointData; +} + +bool MemoryMappedAudioFormatReader::mapEntireFile() +{ + return mapSectionOfFile (Range (0, lengthInSamples)); +} + +bool MemoryMappedAudioFormatReader::mapSectionOfFile (Range samplesToMap) +{ + if (map == nullptr || samplesToMap != mappedSection) + { + map = nullptr; + + const Range fileRange (sampleToFilePos (samplesToMap.getStart()), + sampleToFilePos (samplesToMap.getEnd())); + + map = new MemoryMappedFile (file, fileRange, MemoryMappedFile::readOnly); + + if (map->getData() == nullptr) + map = nullptr; + else + mappedSection = Range (jmax ((int64) 0, filePosToSample (map->getRange().getStart() + (bytesPerFrame - 1))), + jmin (lengthInSamples, filePosToSample (map->getRange().getEnd()))); + } + + return map != nullptr; +} + +static int memoryReadDummyVariable; // used to force the compiler not to optimise-away the read operation + +void MemoryMappedAudioFormatReader::touchSample (int64 sample) const noexcept +{ + if (map != nullptr && mappedSection.contains (sample)) + memoryReadDummyVariable += *(char*) sampleToPointer (sample); + else + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h new file mode 100644 index 0000000000..065388a77b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h @@ -0,0 +1,300 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOFORMATREADER_H_INCLUDED +#define JUCE_AUDIOFORMATREADER_H_INCLUDED + + +//============================================================================== +/** + Reads samples from an audio file stream. + + A subclass that reads a specific type of audio format will be created by + an AudioFormat object. + + @see AudioFormat, AudioFormatWriter +*/ +class JUCE_API AudioFormatReader +{ +protected: + //============================================================================== + /** Creates an AudioFormatReader object. + + @param sourceStream the stream to read from - this will be deleted + by this object when it is no longer needed. (Some + specialised readers might not use this parameter and + can leave it as 0). + @param formatName the description that will be returned by the getFormatName() + method + */ + AudioFormatReader (InputStream* sourceStream, + const String& formatName); + +public: + /** Destructor. */ + virtual ~AudioFormatReader(); + + //============================================================================== + /** Returns a description of what type of format this is. + + E.g. "AIFF" + */ + const String& getFormatName() const noexcept { return formatName; } + + //============================================================================== + /** Reads samples from the stream. + + @param destSamples an array of buffers into which the sample data for each + channel will be written. + If the format is fixed-point, each channel will be written + as an array of 32-bit signed integers using the full + range -0x80000000 to 0x7fffffff, regardless of the source's + bit-depth. If it is a floating-point format, you should cast + the resulting array to a (float**) to get the values (in the + range -1.0 to 1.0 or beyond) + If the format is stereo, then destSamples[0] is the left channel + data, and destSamples[1] is the right channel. + The numDestChannels parameter indicates how many pointers this array + contains, but some of these pointers can be null if you don't want to + read data for some of the channels + @param numDestChannels the number of array elements in the destChannels array + @param startSampleInSource the position in the audio file or stream at which the samples + should be read, as a number of samples from the start of the + stream. It's ok for this to be beyond the start or end of the + available data - any samples that are out-of-range will be returned + as zeros. + @param numSamplesToRead the number of samples to read. If this is greater than the number + of samples that the file or stream contains. the result will be padded + with zeros + @param fillLeftoverChannelsWithCopies if true, this indicates that if there's no source data available + for some of the channels that you pass in, then they should be filled with + copies of valid source channels. + E.g. if you're reading a mono file and you pass 2 channels to this method, then + if fillLeftoverChannelsWithCopies is true, both destination channels will be filled + with the same data from the file's single channel. If fillLeftoverChannelsWithCopies + was false, then only the first channel would be filled with the file's contents, and + the second would be cleared. If there are many channels, e.g. you try to read 4 channels + from a stereo file, then the last 3 would all end up with copies of the same data. + @returns true if the operation succeeded, false if there was an error. Note + that reading sections of data beyond the extent of the stream isn't an + error - the reader should just return zeros for these regions + @see readMaxLevels + */ + bool read (int* const* destSamples, + int numDestChannels, + int64 startSampleInSource, + int numSamplesToRead, + bool fillLeftoverChannelsWithCopies); + + /** Fills a section of an AudioSampleBuffer from this reader. + + This will convert the reader's fixed- or floating-point data to + the buffer's floating-point format, and will try to intelligently + cope with mismatches between the number of channels in the reader + and the buffer. + */ + void read (AudioSampleBuffer* buffer, + int startSampleInDestBuffer, + int numSamples, + int64 readerStartSample, + bool useReaderLeftChan, + bool useReaderRightChan); + + /** Finds the highest and lowest sample levels from a section of the audio stream. + + This will read a block of samples from the stream, and measure the + highest and lowest sample levels from the channels in that section, returning + these as normalised floating-point levels. + + @param startSample the offset into the audio stream to start reading from. It's + ok for this to be beyond the start or end of the stream. + @param numSamples how many samples to read + @param results this array will be filled with Range values for each channel. + The array must contain numChannels elements. + @param numChannelsToRead the number of channels of data to scan. This must be + more than zero, but not more than the total number of channels + that the reader contains + @see read + */ + virtual void readMaxLevels (int64 startSample, int64 numSamples, + Range* results, int numChannelsToRead); + + /** Finds the highest and lowest sample levels from a section of the audio stream. + + This will read a block of samples from the stream, and measure the + highest and lowest sample levels from the channels in that section, returning + these as normalised floating-point levels. + + @param startSample the offset into the audio stream to start reading from. It's + ok for this to be beyond the start or end of the stream. + @param numSamples how many samples to read + @param lowestLeft on return, this is the lowest absolute sample from the left channel + @param highestLeft on return, this is the highest absolute sample from the left channel + @param lowestRight on return, this is the lowest absolute sample from the right + channel (if there is one) + @param highestRight on return, this is the highest absolute sample from the right + channel (if there is one) + @see read + */ + virtual void readMaxLevels (int64 startSample, int64 numSamples, + float& lowestLeft, float& highestLeft, + float& lowestRight, float& highestRight); + + /** Scans the source looking for a sample whose magnitude is in a specified range. + + This will read from the source, either forwards or backwards between two sample + positions, until it finds a sample whose magnitude lies between two specified levels. + + If it finds a suitable sample, it returns its position; if not, it will return -1. + + There's also a minimumConsecutiveSamples setting to help avoid spikes or zero-crossing + points when you're searching for a continuous range of samples + + @param startSample the first sample to look at + @param numSamplesToSearch the number of samples to scan. If this value is negative, + the search will go backwards + @param magnitudeRangeMinimum the lowest magnitude (inclusive) that is considered a hit, from 0 to 1.0 + @param magnitudeRangeMaximum the highest magnitude (inclusive) that is considered a hit, from 0 to 1.0 + @param minimumConsecutiveSamples if this is > 0, the method will only look for a sequence + of this many consecutive samples, all of which lie + within the target range. When it finds such a sequence, + it returns the position of the first in-range sample + it found (i.e. the earliest one if scanning forwards, the + latest one if scanning backwards) + */ + int64 searchForLevel (int64 startSample, + int64 numSamplesToSearch, + double magnitudeRangeMinimum, + double magnitudeRangeMaximum, + int minimumConsecutiveSamples); + + + //============================================================================== + /** The sample-rate of the stream. */ + double sampleRate; + + /** The number of bits per sample, e.g. 16, 24, 32. */ + unsigned int bitsPerSample; + + /** The total number of samples in the audio stream. */ + int64 lengthInSamples; + + /** The total number of channels in the audio stream. */ + unsigned int numChannels; + + /** Indicates whether the data is floating-point or fixed. */ + bool usesFloatingPointData; + + /** A set of metadata values that the reader has pulled out of the stream. + + Exactly what these values are depends on the format, so you can + check out the format implementation code to see what kind of stuff + they understand. + */ + StringPairArray metadataValues; + + /** The input stream, for use by subclasses. */ + InputStream* input; + + + //============================================================================== + /** Subclasses must implement this method to perform the low-level read operation. + + Callers should use read() instead of calling this directly. + + @param destSamples the array of destination buffers to fill. Some of these + pointers may be null + @param numDestChannels the number of items in the destSamples array. This + value is guaranteed not to be greater than the number of + channels that this reader object contains + @param startOffsetInDestBuffer the number of samples from the start of the + dest data at which to begin writing + @param startSampleInFile the number of samples into the source data at which + to begin reading. This value is guaranteed to be >= 0. + @param numSamples the number of samples to read + */ + virtual bool readSamples (int** destSamples, + int numDestChannels, + int startOffsetInDestBuffer, + int64 startSampleInFile, + int numSamples) = 0; + + +protected: + //============================================================================== + /** Used by AudioFormatReader subclasses to copy data to different formats. */ + template + struct ReadHelper + { + typedef AudioData::Pointer DestType; + typedef AudioData::Pointer SourceType; + + template + static void read (TargetType* const* destData, int destOffset, int numDestChannels, + const void* sourceData, int numSourceChannels, int numSamples) noexcept + { + for (int i = 0; i < numDestChannels; ++i) + { + if (void* targetChan = destData[i]) + { + DestType dest (targetChan); + dest += destOffset; + + if (i < numSourceChannels) + dest.convertSamples (SourceType (addBytesToPointer (sourceData, i * SourceType::getBytesPerSample()), numSourceChannels), numSamples); + else + dest.clearSamples (numSamples); + } + } + } + }; + + /** Used by AudioFormatReader subclasses to clear any parts of the data blocks that lie + beyond the end of their available length. + */ + static void clearSamplesBeyondAvailableLength (int** destSamples, int numDestChannels, + int startOffsetInDestBuffer, int64 startSampleInFile, + int& numSamples, int64 fileLengthInSamples) + { + jassert (destSamples != nullptr); + const int64 samplesAvailable = fileLengthInSamples - startSampleInFile; + + if (samplesAvailable < numSamples) + { + for (int i = numDestChannels; --i >= 0;) + if (destSamples[i] != nullptr) + zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); + + numSamples = (int) samplesAvailable; + } + } + +private: + String formatName; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatReader) +}; + + +#endif // JUCE_AUDIOFORMATREADER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp new file mode 100644 index 0000000000..fb086ef8ef --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const r, + const bool deleteReaderWhenThisIsDeleted) + : reader (r, deleteReaderWhenThisIsDeleted), + nextPlayPos (0), + looping (false) +{ + jassert (reader != nullptr); +} + +AudioFormatReaderSource::~AudioFormatReaderSource() {} + +int64 AudioFormatReaderSource::getTotalLength() const { return reader->lengthInSamples; } +void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) { nextPlayPos = newPosition; } +void AudioFormatReaderSource::setLooping (bool shouldLoop) { looping = shouldLoop; } + +int64 AudioFormatReaderSource::getNextReadPosition() const +{ + return looping ? nextPlayPos % reader->lengthInSamples + : nextPlayPos; +} + +void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, double /*sampleRate*/) {} +void AudioFormatReaderSource::releaseResources() {} + +void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info) +{ + if (info.numSamples > 0) + { + const int64 start = nextPlayPos; + + if (looping) + { + const int64 newStart = start % reader->lengthInSamples; + const int64 newEnd = (start + info.numSamples) % reader->lengthInSamples; + + if (newEnd > newStart) + { + reader->read (info.buffer, info.startSample, + (int) (newEnd - newStart), newStart, true, true); + } + else + { + const int endSamps = (int) (reader->lengthInSamples - newStart); + + reader->read (info.buffer, info.startSample, + endSamps, newStart, true, true); + + reader->read (info.buffer, info.startSample + endSamps, + (int) newEnd, 0, true, true); + } + + nextPlayPos = newEnd; + } + else + { + reader->read (info.buffer, info.startSample, + info.numSamples, start, true, true); + nextPlayPos += info.numSamples; + } + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h new file mode 100644 index 0000000000..d7ff5f7844 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h @@ -0,0 +1,100 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOFORMATREADERSOURCE_H_INCLUDED +#define JUCE_AUDIOFORMATREADERSOURCE_H_INCLUDED + + +//============================================================================== +/** + A type of AudioSource that will read from an AudioFormatReader. + + @see PositionableAudioSource, AudioTransportSource, BufferingAudioSource +*/ +class JUCE_API AudioFormatReaderSource : public PositionableAudioSource +{ +public: + //============================================================================== + /** Creates an AudioFormatReaderSource for a given reader. + + @param sourceReader the reader to use as the data source - this must + not be null + @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted + when this object is deleted; if false it will be + left up to the caller to manage its lifetime + */ + AudioFormatReaderSource (AudioFormatReader* sourceReader, + bool deleteReaderWhenThisIsDeleted); + + /** Destructor. */ + ~AudioFormatReaderSource(); + + //============================================================================== + /** Toggles loop-mode. + + If set to true, it will continuously loop the input source. If false, + it will just emit silence after the source has finished. + + @see isLooping + */ + void setLooping (bool shouldLoop); + + /** Returns whether loop-mode is turned on or not. */ + bool isLooping() const { return looping; } + + /** Returns the reader that's being used. */ + AudioFormatReader* getAudioFormatReader() const noexcept { return reader; } + + //============================================================================== + /** Implementation of the AudioSource method. */ + void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; + + /** Implementation of the AudioSource method. */ + void releaseResources() override; + + /** Implementation of the AudioSource method. */ + void getNextAudioBlock (const AudioSourceChannelInfo&) override; + + //============================================================================== + /** Implements the PositionableAudioSource method. */ + void setNextReadPosition (int64 newPosition) override; + + /** Implements the PositionableAudioSource method. */ + int64 getNextReadPosition() const override; + + /** Implements the PositionableAudioSource method. */ + int64 getTotalLength() const override; + +private: + //============================================================================== + OptionalScopedPointer reader; + + int64 volatile nextPlayPos; + bool volatile looping; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatReaderSource) +}; + + +#endif // JUCE_AUDIOFORMATREADERSOURCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp new file mode 100644 index 0000000000..065f36afa4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp @@ -0,0 +1,342 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioFormatWriter::AudioFormatWriter (OutputStream* const out, + const String& formatName_, + const double rate, + const unsigned int numChannels_, + const unsigned int bitsPerSample_) + : sampleRate (rate), + numChannels (numChannels_), + bitsPerSample (bitsPerSample_), + usesFloatingPointData (false), + output (out), + formatName (formatName_) +{ +} + +AudioFormatWriter::~AudioFormatWriter() +{ + delete output; +} + +static void convertFloatsToInts (int* dest, const float* src, int numSamples) noexcept +{ + while (--numSamples >= 0) + { + const double samp = *src++; + + if (samp <= -1.0) + *dest = std::numeric_limits::min(); + else if (samp >= 1.0) + *dest = std::numeric_limits::max(); + else + *dest = roundToInt (std::numeric_limits::max() * samp); + + ++dest; + } +} + +bool AudioFormatWriter::writeFromAudioReader (AudioFormatReader& reader, + int64 startSample, + int64 numSamplesToRead) +{ + const int bufferSize = 16384; + AudioSampleBuffer tempBuffer ((int) numChannels, bufferSize); + + int* buffers [128] = { 0 }; + + for (int i = tempBuffer.getNumChannels(); --i >= 0;) + buffers[i] = reinterpret_cast (tempBuffer.getWritePointer (i, 0)); + + if (numSamplesToRead < 0) + numSamplesToRead = reader.lengthInSamples; + + while (numSamplesToRead > 0) + { + const int numToDo = (int) jmin (numSamplesToRead, (int64) bufferSize); + + if (! reader.read (buffers, (int) numChannels, startSample, numToDo, false)) + return false; + + if (reader.usesFloatingPointData != isFloatingPoint()) + { + int** bufferChan = buffers; + + while (*bufferChan != nullptr) + { + void* const b = *bufferChan++; + + if (isFloatingPoint()) + FloatVectorOperations::convertFixedToFloat ((float*) b, (int*) b, 1.0f / 0x7fffffff, numToDo); + else + convertFloatsToInts ((int*) b, (float*) b, numToDo); + } + } + + if (! write (const_cast (buffers), numToDo)) + return false; + + numSamplesToRead -= numToDo; + startSample += numToDo; + } + + return true; +} + +bool AudioFormatWriter::writeFromAudioSource (AudioSource& source, int numSamplesToRead, const int samplesPerBlock) +{ + AudioSampleBuffer tempBuffer (getNumChannels(), samplesPerBlock); + + while (numSamplesToRead > 0) + { + const int numToDo = jmin (numSamplesToRead, samplesPerBlock); + + AudioSourceChannelInfo info (&tempBuffer, 0, numToDo); + info.clearActiveBufferRegion(); + + source.getNextAudioBlock (info); + + if (! writeFromAudioSampleBuffer (tempBuffer, 0, numToDo)) + return false; + + numSamplesToRead -= numToDo; + } + + return true; +} + +bool AudioFormatWriter::writeFromFloatArrays (const float* const* channels, int numSourceChannels, int numSamples) +{ + if (numSamples <= 0) + return true; + + if (isFloatingPoint()) + return write ((const int**) channels, numSamples); + + int* chans [256]; + int scratch [4096]; + + jassert (numSourceChannels < numElementsInArray (chans)); + const int maxSamples = (int) (numElementsInArray (scratch) / numSourceChannels); + + for (int i = 0; i < numSourceChannels; ++i) + chans[i] = scratch + (i * maxSamples); + + chans[numSourceChannels] = nullptr; + int startSample = 0; + + while (numSamples > 0) + { + const int numToDo = jmin (numSamples, maxSamples); + + for (int i = 0; i < numSourceChannels; ++i) + convertFloatsToInts (chans[i], channels[i] + startSample, numToDo); + + if (! write ((const int**) chans, numToDo)) + return false; + + startSample += numToDo; + numSamples -= numToDo; + } + + return true; +} + +bool AudioFormatWriter::writeFromAudioSampleBuffer (const AudioSampleBuffer& source, int startSample, int numSamples) +{ + const int numSourceChannels = source.getNumChannels(); + jassert (startSample >= 0 && startSample + numSamples <= source.getNumSamples() && numSourceChannels > 0); + + if (startSample == 0) + return writeFromFloatArrays (source.getArrayOfReadPointers(), numSourceChannels, numSamples); + + const float* chans [256]; + jassert ((int) numChannels < numElementsInArray (chans)); + + for (int i = 0; i < numSourceChannels; ++i) + chans[i] = source.getReadPointer (i, startSample); + + chans[numSourceChannels] = nullptr; + + return writeFromFloatArrays (chans, numSourceChannels, numSamples); +} + +bool AudioFormatWriter::flush() +{ + return false; +} + +//============================================================================== +class AudioFormatWriter::ThreadedWriter::Buffer : private TimeSliceClient +{ +public: + Buffer (TimeSliceThread& tst, AudioFormatWriter* w, int channels, int numSamples) + : fifo (numSamples), + buffer (channels, numSamples), + timeSliceThread (tst), + writer (w), + receiver (nullptr), + samplesWritten (0), + samplesPerFlush (0), + flushSampleCounter (0), + isRunning (true) + { + timeSliceThread.addTimeSliceClient (this); + } + + ~Buffer() + { + isRunning = false; + timeSliceThread.removeTimeSliceClient (this); + + while (writePendingData() == 0) + {} + } + + bool write (const float* const* data, int numSamples) + { + if (numSamples <= 0 || ! isRunning) + return true; + + jassert (timeSliceThread.isThreadRunning()); // you need to get your thread running before pumping data into this! + + int start1, size1, start2, size2; + fifo.prepareToWrite (numSamples, start1, size1, start2, size2); + + if (size1 + size2 < numSamples) + return false; + + for (int i = buffer.getNumChannels(); --i >= 0;) + { + buffer.copyFrom (i, start1, data[i], size1); + buffer.copyFrom (i, start2, data[i] + size1, size2); + } + + fifo.finishedWrite (size1 + size2); + timeSliceThread.notify(); + return true; + } + + int useTimeSlice() override + { + return writePendingData(); + } + + int writePendingData() + { + const int numToDo = fifo.getTotalSize() / 4; + + int start1, size1, start2, size2; + fifo.prepareToRead (numToDo, start1, size1, start2, size2); + + if (size1 <= 0) + return 10; + + writer->writeFromAudioSampleBuffer (buffer, start1, size1); + + const ScopedLock sl (thumbnailLock); + if (receiver != nullptr) + receiver->addBlock (samplesWritten, buffer, start1, size1); + + samplesWritten += size1; + + if (size2 > 0) + { + writer->writeFromAudioSampleBuffer (buffer, start2, size2); + + if (receiver != nullptr) + receiver->addBlock (samplesWritten, buffer, start2, size2); + + samplesWritten += size2; + } + + fifo.finishedRead (size1 + size2); + + if (samplesPerFlush > 0) + { + flushSampleCounter -= size1 + size2; + + if (flushSampleCounter <= 0) + { + flushSampleCounter = samplesPerFlush; + writer->flush(); + } + } + + return 0; + } + + void setDataReceiver (IncomingDataReceiver* newReceiver) + { + if (newReceiver != nullptr) + newReceiver->reset (buffer.getNumChannels(), writer->getSampleRate(), 0); + + const ScopedLock sl (thumbnailLock); + receiver = newReceiver; + samplesWritten = 0; + } + + void setFlushInterval (int numSamples) noexcept + { + samplesPerFlush = numSamples; + } + +private: + AbstractFifo fifo; + AudioSampleBuffer buffer; + TimeSliceThread& timeSliceThread; + ScopedPointer writer; + CriticalSection thumbnailLock; + IncomingDataReceiver* receiver; + int64 samplesWritten; + int samplesPerFlush, flushSampleCounter; + volatile bool isRunning; + + JUCE_DECLARE_NON_COPYABLE (Buffer) +}; + +AudioFormatWriter::ThreadedWriter::ThreadedWriter (AudioFormatWriter* writer, TimeSliceThread& backgroundThread, int numSamplesToBuffer) + : buffer (new AudioFormatWriter::ThreadedWriter::Buffer (backgroundThread, writer, (int) writer->numChannels, numSamplesToBuffer)) +{ +} + +AudioFormatWriter::ThreadedWriter::~ThreadedWriter() +{ +} + +bool AudioFormatWriter::ThreadedWriter::write (const float* const* data, int numSamples) +{ + return buffer->write (data, numSamples); +} + +void AudioFormatWriter::ThreadedWriter::setDataReceiver (AudioFormatWriter::ThreadedWriter::IncomingDataReceiver* receiver) +{ + buffer->setDataReceiver (receiver); +} + +void AudioFormatWriter::ThreadedWriter::setFlushInterval (int numSamplesPerFlush) noexcept +{ + buffer->setFlushInterval (numSamplesPerFlush); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h new file mode 100644 index 0000000000..9098c75fb6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h @@ -0,0 +1,274 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOFORMATWRITER_H_INCLUDED +#define JUCE_AUDIOFORMATWRITER_H_INCLUDED + + +//============================================================================== +/** + Writes samples to an audio file stream. + + A subclass that writes a specific type of audio format will be created by + an AudioFormat object. + + After creating one of these with the AudioFormat::createWriterFor() method + you can call its write() method to store the samples, and then delete it. + + @see AudioFormat, AudioFormatReader +*/ +class JUCE_API AudioFormatWriter +{ +protected: + //============================================================================== + /** Creates an AudioFormatWriter object. + + @param destStream the stream to write to - this will be deleted + by this object when it is no longer needed + @param formatName the description that will be returned by the getFormatName() + method + @param sampleRate the sample rate to use - the base class just stores + this value, it doesn't do anything with it + @param numberOfChannels the number of channels to write - the base class just stores + this value, it doesn't do anything with it + @param bitsPerSample the bit depth of the stream - the base class just stores + this value, it doesn't do anything with it + */ + AudioFormatWriter (OutputStream* destStream, + const String& formatName, + double sampleRate, + unsigned int numberOfChannels, + unsigned int bitsPerSample); + +public: + /** Destructor. */ + virtual ~AudioFormatWriter(); + + //============================================================================== + /** Returns a description of what type of format this is. + + E.g. "AIFF file" + */ + const String& getFormatName() const noexcept { return formatName; } + + //============================================================================== + /** Writes a set of samples to the audio stream. + + Note that if you're trying to write the contents of an AudioSampleBuffer, you + can use AudioSampleBuffer::writeToAudioWriter(). + + @param samplesToWrite an array of arrays containing the sample data for + each channel to write. This is a zero-terminated + array of arrays, and can contain a different number + of channels than the actual stream uses, and the + writer should do its best to cope with this. + If the format is fixed-point, each channel will be formatted + as an array of signed integers using the full 32-bit + range -0x80000000 to 0x7fffffff, regardless of the source's + bit-depth. If it is a floating-point format, you should treat + the arrays as arrays of floats, and just cast it to an (int**) + to pass it into the method. + @param numSamples the number of samples to write + */ + virtual bool write (const int** samplesToWrite, int numSamples) = 0; + + /** Some formats may support a flush operation that makes sure the file is in a + valid state before carrying on. + If supported, this means that by calling flush periodically when writing data + to a large file, then it should still be left in a readable state if your program + crashes. + It goes without saying that this method must be called from the same thread that's + calling write()! + If the format supports flushing and the operation succeeds, this returns true. + */ + virtual bool flush(); + + //============================================================================== + /** Reads a section of samples from an AudioFormatReader, and writes these to + the output. + + This will take care of any floating-point conversion that's required to convert + between the two formats. It won't deal with sample-rate conversion, though. + + If numSamplesToRead < 0, it will write the entire length of the reader. + + @returns false if it can't read or write properly during the operation + */ + bool writeFromAudioReader (AudioFormatReader& reader, + int64 startSample, + int64 numSamplesToRead); + + /** Reads some samples from an AudioSource, and writes these to the output. + + The source must already have been initialised with the AudioSource::prepareToPlay() method + + @param source the source to read from + @param numSamplesToRead total number of samples to read and write + @param samplesPerBlock the maximum number of samples to fetch from the source + @returns false if it can't read or write properly during the operation + */ + bool writeFromAudioSource (AudioSource& source, + int numSamplesToRead, + int samplesPerBlock = 2048); + + + /** Writes some samples from an AudioSampleBuffer. */ + bool writeFromAudioSampleBuffer (const AudioSampleBuffer& source, + int startSample, int numSamples); + + /** Writes some samples from a set of float data channels. */ + bool writeFromFloatArrays (const float* const* channels, int numChannels, int numSamples); + + //============================================================================== + /** Returns the sample rate being used. */ + double getSampleRate() const noexcept { return sampleRate; } + + /** Returns the number of channels being written. */ + int getNumChannels() const noexcept { return (int) numChannels; } + + /** Returns the bit-depth of the data being written. */ + int getBitsPerSample() const noexcept { return (int) bitsPerSample; } + + /** Returns true if it's a floating-point format, false if it's fixed-point. */ + bool isFloatingPoint() const noexcept { return usesFloatingPointData; } + + //============================================================================== + /** + Provides a FIFO for an AudioFormatWriter, allowing you to push incoming + data into a buffer which will be flushed to disk by a background thread. + */ + class ThreadedWriter + { + public: + /** Creates a ThreadedWriter for a given writer and a thread. + + The writer object which is passed in here will be owned and deleted by + the ThreadedWriter when it is no longer needed. + + To stop the writer and flush the buffer to disk, simply delete this object. + */ + ThreadedWriter (AudioFormatWriter* writer, + TimeSliceThread& backgroundThread, + int numSamplesToBuffer); + + /** Destructor. */ + ~ThreadedWriter(); + + /** Pushes some incoming audio data into the FIFO. + + If there's enough free space in the buffer, this will add the data to it, + + If the FIFO is too full to accept this many samples, the method will return + false - then you could either wait until the background thread has had time to + consume some of the buffered data and try again, or you can give up + and lost this block. + + The data must be an array containing the same number of channels as the + AudioFormatWriter object is using. None of these channels can be null. + */ + bool write (const float* const* data, int numSamples); + + class JUCE_API IncomingDataReceiver + { + public: + IncomingDataReceiver() {} + virtual ~IncomingDataReceiver() {} + + virtual void reset (int numChannels, double sampleRate, int64 totalSamplesInSource) = 0; + virtual void addBlock (int64 sampleNumberInSource, const AudioSampleBuffer& newData, + int startOffsetInBuffer, int numSamples) = 0; + }; + + /** Allows you to specify a callback that this writer should update with the + incoming data. + The receiver will be cleared and will the writer will begin adding data to + it as the data arrives. Pass a null pointer to remove the current receiver. + + The object passed-in must not be deleted while this writer is still using it. + */ + void setDataReceiver (IncomingDataReceiver*); + + /** Sets how many samples should be written before calling the AudioFormatWriter::flush method. + Set this to 0 to disable flushing (this is the default). + */ + void setFlushInterval (int numSamplesPerFlush) noexcept; + + private: + class Buffer; + friend struct ContainerDeletePolicy; + ScopedPointer buffer; + }; + +protected: + //============================================================================== + /** The sample rate of the stream. */ + double sampleRate; + + /** The number of channels being written to the stream. */ + unsigned int numChannels; + + /** The bit depth of the file. */ + unsigned int bitsPerSample; + + /** True if it's a floating-point format, false if it's fixed-point. */ + bool usesFloatingPointData; + + /** The output stream for use by subclasses. */ + OutputStream* output; + + /** Used by AudioFormatWriter subclasses to copy data to different formats. */ + template + struct WriteHelper + { + typedef AudioData::Pointer DestType; + typedef AudioData::Pointer SourceType; + + static void write (void* destData, int numDestChannels, const int* const* source, + int numSamples, const int sourceOffset = 0) noexcept + { + for (int i = 0; i < numDestChannels; ++i) + { + const DestType dest (addBytesToPointer (destData, i * DestType::getBytesPerSample()), numDestChannels); + + if (*source != nullptr) + { + dest.convertSamples (SourceType (*source + sourceOffset), numSamples); + ++source; + } + else + { + dest.clearSamples (numSamples); + } + } + } + }; + +private: + String formatName; + friend class ThreadedWriter; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatWriter) +}; + +#endif // JUCE_AUDIOFORMATWRITER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp new file mode 100644 index 0000000000..bbe1ebd79b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp @@ -0,0 +1,73 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioSubsectionReader::AudioSubsectionReader (AudioFormatReader* const source_, + const int64 startSample_, + const int64 length_, + const bool deleteSourceWhenDeleted_) + : AudioFormatReader (0, source_->getFormatName()), + source (source_), + startSample (startSample_), + deleteSourceWhenDeleted (deleteSourceWhenDeleted_) +{ + length = jmin (jmax ((int64) 0, source->lengthInSamples - startSample), length_); + + sampleRate = source->sampleRate; + bitsPerSample = source->bitsPerSample; + lengthInSamples = length; + numChannels = source->numChannels; + usesFloatingPointData = source->usesFloatingPointData; +} + +AudioSubsectionReader::~AudioSubsectionReader() +{ + if (deleteSourceWhenDeleted) + delete source; +} + +//============================================================================== +bool AudioSubsectionReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, length); + + return source->readSamples (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile + startSample, numSamples); +} + +void AudioSubsectionReader::readMaxLevels (int64 startSampleInFile, + int64 numSamples, + float& lowestLeft, + float& highestLeft, + float& lowestRight, + float& highestRight) +{ + startSampleInFile = jmax ((int64) 0, startSampleInFile); + numSamples = jmax ((int64) 0, jmin (numSamples, length - startSampleInFile)); + + source->readMaxLevels (startSampleInFile + startSample, numSamples, + lowestLeft, highestLeft, + lowestRight, highestRight); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h new file mode 100644 index 0000000000..fb9e6a031a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h @@ -0,0 +1,84 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOSUBSECTIONREADER_H_INCLUDED +#define JUCE_AUDIOSUBSECTIONREADER_H_INCLUDED + + +//============================================================================== +/** + This class is used to wrap an AudioFormatReader and only read from a + subsection of the file. + + So if you have a reader which can read a 1000 sample file, you could wrap it + in one of these to only access, e.g. samples 100 to 200, and any samples + outside that will come back as 0. Accessing sample 0 from this reader will + actually read the first sample from the other's subsection, which might + be at a non-zero position. + + @see AudioFormatReader +*/ +class JUCE_API AudioSubsectionReader : public AudioFormatReader +{ +public: + //============================================================================== + /** Creates an AudioSubsectionReader for a given data source. + + @param sourceReader the source reader from which we'll be taking data + @param subsectionStartSample the sample within the source reader which will be + mapped onto sample 0 for this reader. + @param subsectionLength the number of samples from the source that will + make up the subsection. If this reader is asked for + any samples beyond this region, it will return zero. + @param deleteSourceWhenDeleted if true, the sourceReader object will be deleted when + this object is deleted. + */ + AudioSubsectionReader (AudioFormatReader* sourceReader, + int64 subsectionStartSample, + int64 subsectionLength, + bool deleteSourceWhenDeleted); + + /** Destructor. */ + ~AudioSubsectionReader(); + + + //============================================================================== + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override; + + void readMaxLevels (int64 startSample, int64 numSamples, + float& lowestLeft, float& highestLeft, + float& lowestRight, float& highestRight) override; + + +private: + //============================================================================== + AudioFormatReader* const source; + int64 startSample, length; + const bool deleteSourceWhenDeleted; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSubsectionReader) +}; + +#endif // JUCE_AUDIOSUBSECTIONREADER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp new file mode 100644 index 0000000000..ecfe1d457a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp @@ -0,0 +1,172 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +BufferingAudioReader::BufferingAudioReader (AudioFormatReader* sourceReader, + TimeSliceThread& timeSliceThread, + int samplesToBuffer) + : AudioFormatReader (nullptr, sourceReader->getFormatName()), + source (sourceReader), thread (timeSliceThread), + nextReadPosition (0), + numBlocks (1 + (samplesToBuffer / samplesPerBlock)) +{ + sampleRate = source->sampleRate; + lengthInSamples = source->lengthInSamples; + numChannels = source->numChannels; + metadataValues = source->metadataValues; + bitsPerSample = 32; + usesFloatingPointData = true; + + for (int i = 3; --i >= 0;) + readNextBufferChunk(); + + timeSliceThread.addTimeSliceClient (this); +} + +BufferingAudioReader::~BufferingAudioReader() +{ + thread.removeTimeSliceClient (this); +} + +void BufferingAudioReader::setReadTimeout (int timeoutMilliseconds) noexcept +{ + timeoutMs = timeoutMilliseconds; +} + +bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + const uint32 startTime = Time::getMillisecondCounter(); + clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, + startSampleInFile, numSamples, lengthInSamples); + + const ScopedLock sl (lock); + nextReadPosition = startSampleInFile; + + while (numSamples > 0) + { + if (const BufferedBlock* const block = getBlockContaining (startSampleInFile)) + { + const int offset = (int) (startSampleInFile - block->range.getStart()); + const int numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile)); + + for (int j = 0; j < numDestChannels; ++j) + { + if (float* dest = (float*) destSamples[j]) + { + dest += startOffsetInDestBuffer; + + if (j < (int) numChannels) + FloatVectorOperations::copy (dest, block->buffer.getReadPointer (j, offset), numToDo); + else + FloatVectorOperations::clear (dest, numToDo); + } + } + + startOffsetInDestBuffer += numToDo; + startSampleInFile += numToDo; + numSamples -= numToDo; + } + else + { + if (timeoutMs >= 0 && Time::getMillisecondCounter() >= startTime + (uint32) timeoutMs) + { + for (int j = 0; j < numDestChannels; ++j) + if (float* dest = (float*) destSamples[j]) + FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples); + + break; + } + else + { + ScopedUnlock ul (lock); + Thread::yield(); + } + } + } + + return true; +} + +BufferingAudioReader::BufferedBlock::BufferedBlock (AudioFormatReader& reader, int64 pos, int numSamples) + : range (pos, pos + numSamples), + buffer ((int) reader.numChannels, numSamples) +{ + reader.read (&buffer, 0, numSamples, pos, true, true); +} + +BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept +{ + for (int i = blocks.size(); --i >= 0;) + { + BufferedBlock* const b = blocks.getUnchecked(i); + + if (b->range.contains (pos)) + return b; + } + + return nullptr; +} + +int BufferingAudioReader::useTimeSlice() +{ + return readNextBufferChunk() ? 1 : 100; +} + +bool BufferingAudioReader::readNextBufferChunk() +{ + const int64 pos = nextReadPosition; + const int64 startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock; + const int64 endPos = startPos + numBlocks * samplesPerBlock; + + OwnedArray newBlocks; + + for (int i = blocks.size(); --i >= 0;) + if (blocks.getUnchecked(i)->range.intersects (Range (startPos, endPos))) + newBlocks.add (blocks.getUnchecked(i)); + + if (newBlocks.size() == numBlocks) + { + newBlocks.clear (false); + return false; + } + + for (int64 p = startPos; p < endPos; p += samplesPerBlock) + { + if (getBlockContaining (p) == nullptr) + { + newBlocks.add (new BufferedBlock (*source, p, samplesPerBlock)); + break; // just do one block + } + } + + { + const ScopedLock sl (lock); + newBlocks.swapWith (blocks); + } + + for (int i = blocks.size(); --i >= 0;) + newBlocks.removeObject (blocks.getUnchecked(i), false); + + return true; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h new file mode 100644 index 0000000000..8f950be63f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h @@ -0,0 +1,93 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_BUFFERINGAUDIOFORMATREADER_H_INCLUDED +#define JUCE_BUFFERINGAUDIOFORMATREADER_H_INCLUDED + +//============================================================================== +/** + An AudioFormatReader that uses a background thread to pre-read data from + another reader. + + @see AudioFormatReader +*/ +class JUCE_API BufferingAudioReader : public AudioFormatReader, + private TimeSliceClient +{ +public: + /** Creates a reader. + + @param sourceReader the source reader to wrap. This BufferingAudioReader + takes ownership of this object and will delete it later + when no longer needed + @param timeSliceThread the thread that should be used to do the background reading. + Make sure that the thread you supply is running, and won't + be deleted while the reader object still exists. + @param samplesToBuffer the total number of samples to buffer ahead. + */ + BufferingAudioReader (AudioFormatReader* sourceReader, + TimeSliceThread& timeSliceThread, + int samplesToBuffer); + + ~BufferingAudioReader(); + + /** Sets a number of milliseconds that the reader can block for in its readSamples() + method before giving up and returning silence. + A value of less that 0 means "wait forever". + The default timeout is 0. + */ + void setReadTimeout (int timeoutMilliseconds) noexcept; + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) override; + +private: + ScopedPointer source; + TimeSliceThread& thread; + int64 nextReadPosition; + const int numBlocks; + int timeoutMs; + + enum { samplesPerBlock = 32768 }; + + struct BufferedBlock + { + BufferedBlock (AudioFormatReader& reader, int64 pos, int numSamples); + + Range range; + AudioSampleBuffer buffer; + }; + + CriticalSection lock; + OwnedArray blocks; + + BufferedBlock* getBlockContaining (int64 pos) const noexcept; + int useTimeSlice() override; + bool readNextBufferChunk(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferingAudioReader) +}; + + +#endif // JUCE_BUFFERINGAUDIOFORMATREADER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h new file mode 100644 index 0000000000..2ec6388be2 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h @@ -0,0 +1,106 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_MEMORYMAPPEDAUDIOFORMATREADER_H_INCLUDED +#define JUCE_MEMORYMAPPEDAUDIOFORMATREADER_H_INCLUDED + + +//============================================================================== +/** + A specialised type of AudioFormatReader that uses a MemoryMappedFile to read + directly from an audio file. + + This allows for incredibly fast random-access to sample data in the mapped + region of the file, but not all audio formats support it - see + AudioFormat::createMemoryMappedReader(). + + Note that before reading samples from a MemoryMappedAudioFormatReader, you must first + call mapEntireFile() or mapSectionOfFile() to ensure that the region you want to + read has been mapped. + + @see AudioFormat::createMemoryMappedReader, AudioFormatReader +*/ +class JUCE_API MemoryMappedAudioFormatReader : public AudioFormatReader +{ +protected: + //============================================================================== + /** Creates an MemoryMappedAudioFormatReader object. + + Note that before attempting to read any data, you must call mapEntireFile() + or mapSectionOfFile() to ensure that the region you want to read has + been mapped. + */ + MemoryMappedAudioFormatReader (const File& file, const AudioFormatReader& details, + int64 dataChunkStart, int64 dataChunkLength, int bytesPerFrame); + +public: + /** Returns the file that is being mapped */ + const File& getFile() const noexcept { return file; } + + /** Attempts to map the entire file into memory. */ + bool mapEntireFile(); + + /** Attempts to map a section of the file into memory. */ + bool mapSectionOfFile (Range samplesToMap); + + /** Returns the sample range that's currently memory-mapped and available for reading. */ + Range getMappedSection() const noexcept { return mappedSection; } + + /** Touches the memory for the given sample, to force it to be loaded into active memory. */ + void touchSample (int64 sample) const noexcept; + + /** Returns the number of bytes currently being mapped */ + size_t getNumBytesUsed() const { return map != nullptr ? map->getSize() : 0; } + +protected: + File file; + Range mappedSection; + ScopedPointer map; + int64 dataChunkStart, dataLength; + int bytesPerFrame; + + /** Converts a sample index to a byte position in the file. */ + inline int64 sampleToFilePos (int64 sample) const noexcept { return dataChunkStart + sample * bytesPerFrame; } + + /** Converts a byte position in the file to a sample index. */ + inline int64 filePosToSample (int64 filePos) const noexcept { return (filePos - dataChunkStart) / bytesPerFrame; } + + /** Converts a sample index to a pointer to the mapped file memory. */ + inline const void* sampleToPointer (int64 sample) const noexcept { return addBytesToPointer (map->getData(), sampleToFilePos (sample) - map->getRange().getStart()); } + + /** Used by AudioFormatReader subclasses to scan for min/max ranges in interleaved data. */ + template + void scanMinAndMaxInterleaved (int channel, int64 startSampleInFile, int64 numSamples, float& mn, float& mx) const noexcept + { + typedef AudioData::Pointer SourceType; + + SourceType (addBytesToPointer (sampleToPointer (startSampleInFile), ((int) bitsPerSample / 8) * channel), (int) numChannels) + .findMinAndMax ((size_t) numSamples, mn, mx); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedAudioFormatReader) +}; + + +#endif // JUCE_MEMORYMAPPEDAUDIOFORMATREADER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp new file mode 100644 index 0000000000..b68042ff6e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp @@ -0,0 +1,121 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if defined (JUCE_AUDIO_FORMATS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE + /* When you add this cpp file to your project, you mustn't include it in a file where you've + already included any other headers - just put it inside a file on its own, possibly with your config + flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix + header files that the compiler may be using. + */ + #error "Incorrect use of JUCE cpp file" +#endif + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" + +#include "../juce_core/native/juce_BasicNativeHeaders.h" +#include "juce_audio_formats.h" + +//============================================================================== +#if JUCE_MAC + #define Point CarbonDummyPointName + #define Component CarbonDummyCompName + #if JUCE_QUICKTIME + #import + #endif + #include + #undef Component + #undef Point + +#elif JUCE_IOS + #import + #import + +//============================================================================== +#elif JUCE_WINDOWS + #if JUCE_QUICKTIME + /* If you've got an include error here, you probably need to install the QuickTime SDK and + add its header directory to your include path. + + Alternatively, if you don't need any QuickTime services, just set the JUCE_QUICKTIME flag to 0. + */ + #include + #include + #include + #include + #include + + /* If you've got QuickTime 7 installed, then these COM objects should be found in + the "\Program Files\Quicktime" directory. You'll need to add this directory to + your include search path to make these import statements work. + */ + #import + #import + + #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES + #pragma comment (lib, "QTMLClient.lib") + #endif + #endif + + #if JUCE_USE_WINDOWS_MEDIA_FORMAT + #include + #endif +#endif + +//============================================================================== +namespace juce +{ + +#if JUCE_ANDROID + #include "../juce_core/native/juce_android_JNIHelpers.h" + #undef JUCE_QUICKTIME +#endif + +#if JUCE_WINDOWS + #include "../juce_core/native/juce_win32_ComSmartPtr.h" +#endif + +#include "format/juce_AudioFormat.cpp" +#include "format/juce_AudioFormatManager.cpp" +#include "format/juce_AudioFormatReader.cpp" +#include "format/juce_AudioFormatReaderSource.cpp" +#include "format/juce_AudioFormatWriter.cpp" +#include "format/juce_AudioSubsectionReader.cpp" +#include "format/juce_BufferingAudioFormatReader.cpp" +#include "sampler/juce_Sampler.cpp" +#include "codecs/juce_AiffAudioFormat.cpp" +#include "codecs/juce_CoreAudioFormat.cpp" +#include "codecs/juce_FlacAudioFormat.cpp" +#include "codecs/juce_MP3AudioFormat.cpp" +#include "codecs/juce_OggVorbisAudioFormat.cpp" +#include "codecs/juce_QuickTimeAudioFormat.cpp" +#include "codecs/juce_WavAudioFormat.cpp" +#include "codecs/juce_LAMEEncoderAudioFormat.cpp" + +#if JUCE_WINDOWS && JUCE_USE_WINDOWS_MEDIA_FORMAT + #include "codecs/juce_WindowsMediaAudioFormat.cpp" +#endif + +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h new file mode 100644 index 0000000000..c15194e464 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h @@ -0,0 +1,110 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIO_FORMATS_H_INCLUDED +#define JUCE_AUDIO_FORMATS_H_INCLUDED + +#include "../juce_audio_basics/juce_audio_basics.h" + +//============================================================================= +/** Config: JUCE_USE_FLAC + Enables the FLAC audio codec classes (available on all platforms). + If your app doesn't need to read FLAC files, you might want to disable this to + reduce the size of your codebase and build time. +*/ +#ifndef JUCE_USE_FLAC + #define JUCE_USE_FLAC 1 +#endif + +/** Config: JUCE_USE_OGGVORBIS + Enables the Ogg-Vorbis audio codec classes (available on all platforms). + If your app doesn't need to read Ogg-Vorbis files, you might want to disable this to + reduce the size of your codebase and build time. +*/ +#ifndef JUCE_USE_OGGVORBIS + #define JUCE_USE_OGGVORBIS 1 +#endif + +/** Config: JUCE_USE_MP3AUDIOFORMAT + Enables the software-based MP3AudioFormat class. + IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and to compile + this MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, you are agreeing + that Raw Material Software is in no way responsible for any patent, copyright, or other + legal issues that you may suffer as a result. + + The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party + intellectual property. If you wish to use it, please seek your own independent advice about the + legality of doing so. If you are not willing to accept full responsibility for the consequences + of using this code, then do not enable this setting. +*/ +#ifndef JUCE_USE_MP3AUDIOFORMAT + #define JUCE_USE_MP3AUDIOFORMAT 0 +#endif + +/** Config: JUCE_USE_LAME_AUDIO_FORMAT + Enables the LameEncoderAudioFormat class. +*/ +#ifndef JUCE_USE_LAME_AUDIO_FORMAT + #define JUCE_USE_LAME_AUDIO_FORMAT 0 +#endif + +/** Config: JUCE_USE_WINDOWS_MEDIA_FORMAT + Enables the Windows Media SDK codecs. +*/ +#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT + #define JUCE_USE_WINDOWS_MEDIA_FORMAT 1 +#endif + +#if ! JUCE_MSVC + #undef JUCE_USE_WINDOWS_MEDIA_FORMAT + #define JUCE_USE_WINDOWS_MEDIA_FORMAT 0 +#endif + +//============================================================================= +namespace juce +{ + +class AudioFormat; +#include "format/juce_AudioFormatReader.h" +#include "format/juce_AudioFormatWriter.h" +#include "format/juce_MemoryMappedAudioFormatReader.h" +#include "format/juce_AudioFormat.h" +#include "format/juce_AudioFormatManager.h" +#include "format/juce_AudioFormatReaderSource.h" +#include "format/juce_AudioSubsectionReader.h" +#include "format/juce_BufferingAudioFormatReader.h" +#include "codecs/juce_AiffAudioFormat.h" +#include "codecs/juce_CoreAudioFormat.h" +#include "codecs/juce_FlacAudioFormat.h" +#include "codecs/juce_LAMEEncoderAudioFormat.h" +#include "codecs/juce_MP3AudioFormat.h" +#include "codecs/juce_OggVorbisAudioFormat.h" +#include "codecs/juce_QuickTimeAudioFormat.h" +#include "codecs/juce_WavAudioFormat.h" +#include "codecs/juce_WindowsMediaAudioFormat.h" +#include "sampler/juce_Sampler.h" + +} + +#endif // JUCE_AUDIO_FORMATS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm new file mode 100644 index 0000000000..9b32ae5af7 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm @@ -0,0 +1,25 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#include "juce_audio_formats.cpp" diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_module_info b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_module_info new file mode 100644 index 0000000000..e355719763 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/juce_module_info @@ -0,0 +1,22 @@ +{ + "id": "juce_audio_formats", + "name": "JUCE audio file format codecs", + "version": "3.0.8", + "description": "Classes for reading and writing various audio file formats.", + "website": "http://www.juce.com/juce", + "license": "GPL/Commercial", + + "dependencies": [ { "id": "juce_audio_basics", "version": "matching" } ], + + "include": "juce_audio_formats.h", + + "compile": [ { "file": "juce_audio_formats.cpp", "target": "! xcode" }, + { "file": "juce_audio_formats.mm", "target": "xcode" } ], + + "browse": [ "format/*", + "codecs/*", + "sampler/*" ], + + "OSXFrameworks": "CoreAudio CoreMIDI QuartzCore AudioToolbox", + "iOSFrameworks": "AudioToolbox QuartzCore" +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp new file mode 100644 index 0000000000..4e7583e0a6 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp @@ -0,0 +1,224 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +SamplerSound::SamplerSound (const String& soundName, + AudioFormatReader& source, + const BigInteger& notes, + const int midiNoteForNormalPitch, + const double attackTimeSecs, + const double releaseTimeSecs, + const double maxSampleLengthSeconds) + : name (soundName), + midiNotes (notes), + midiRootNote (midiNoteForNormalPitch) +{ + sourceSampleRate = source.sampleRate; + + if (sourceSampleRate <= 0 || source.lengthInSamples <= 0) + { + length = 0; + attackSamples = 0; + releaseSamples = 0; + } + else + { + length = jmin ((int) source.lengthInSamples, + (int) (maxSampleLengthSeconds * sourceSampleRate)); + + data = new AudioSampleBuffer (jmin (2, (int) source.numChannels), length + 4); + + source.read (data, 0, length + 4, 0, true, true); + + attackSamples = roundToInt (attackTimeSecs * sourceSampleRate); + releaseSamples = roundToInt (releaseTimeSecs * sourceSampleRate); + } +} + +SamplerSound::~SamplerSound() +{ +} + +bool SamplerSound::appliesToNote (int midiNoteNumber) +{ + return midiNotes [midiNoteNumber]; +} + +bool SamplerSound::appliesToChannel (int /*midiChannel*/) +{ + return true; +} + +//============================================================================== +SamplerVoice::SamplerVoice() + : pitchRatio (0.0), + sourceSamplePosition (0.0), + lgain (0.0f), rgain (0.0f), + attackReleaseLevel (0), attackDelta (0), releaseDelta (0), + isInAttack (false), isInRelease (false) +{ +} + +SamplerVoice::~SamplerVoice() +{ +} + +bool SamplerVoice::canPlaySound (SynthesiserSound* sound) +{ + return dynamic_cast (sound) != nullptr; +} + +void SamplerVoice::startNote (const int midiNoteNumber, + const float velocity, + SynthesiserSound* s, + const int /*currentPitchWheelPosition*/) +{ + if (const SamplerSound* const sound = dynamic_cast (s)) + { + pitchRatio = pow (2.0, (midiNoteNumber - sound->midiRootNote) / 12.0) + * sound->sourceSampleRate / getSampleRate(); + + sourceSamplePosition = 0.0; + lgain = velocity; + rgain = velocity; + + isInAttack = (sound->attackSamples > 0); + isInRelease = false; + + if (isInAttack) + { + attackReleaseLevel = 0.0f; + attackDelta = (float) (pitchRatio / sound->attackSamples); + } + else + { + attackReleaseLevel = 1.0f; + attackDelta = 0.0f; + } + + if (sound->releaseSamples > 0) + releaseDelta = (float) (-pitchRatio / sound->releaseSamples); + else + releaseDelta = 0.0f; + } + else + { + jassertfalse; // this object can only play SamplerSounds! + } +} + +void SamplerVoice::stopNote (float /*velocity*/, bool allowTailOff) +{ + if (allowTailOff) + { + isInAttack = false; + isInRelease = true; + } + else + { + clearCurrentNote(); + } +} + +void SamplerVoice::pitchWheelMoved (const int /*newValue*/) +{ +} + +void SamplerVoice::controllerMoved (const int /*controllerNumber*/, + const int /*newValue*/) +{ +} + +//============================================================================== +void SamplerVoice::renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples) +{ + if (const SamplerSound* const playingSound = static_cast (getCurrentlyPlayingSound().get())) + { + const float* const inL = playingSound->data->getReadPointer (0); + const float* const inR = playingSound->data->getNumChannels() > 1 + ? playingSound->data->getReadPointer (1) : nullptr; + + float* outL = outputBuffer.getWritePointer (0, startSample); + float* outR = outputBuffer.getNumChannels() > 1 ? outputBuffer.getWritePointer (1, startSample) : nullptr; + + while (--numSamples >= 0) + { + const int pos = (int) sourceSamplePosition; + const float alpha = (float) (sourceSamplePosition - pos); + const float invAlpha = 1.0f - alpha; + + // just using a very simple linear interpolation here.. + float l = (inL [pos] * invAlpha + inL [pos + 1] * alpha); + float r = (inR != nullptr) ? (inR [pos] * invAlpha + inR [pos + 1] * alpha) + : l; + + l *= lgain; + r *= rgain; + + if (isInAttack) + { + l *= attackReleaseLevel; + r *= attackReleaseLevel; + + attackReleaseLevel += attackDelta; + + if (attackReleaseLevel >= 1.0f) + { + attackReleaseLevel = 1.0f; + isInAttack = false; + } + } + else if (isInRelease) + { + l *= attackReleaseLevel; + r *= attackReleaseLevel; + + attackReleaseLevel += releaseDelta; + + if (attackReleaseLevel <= 0.0f) + { + stopNote (0.0f, false); + break; + } + } + + if (outR != nullptr) + { + *outL++ += l; + *outR++ += r; + } + else + { + *outL++ += (l + r) * 0.5f; + } + + sourceSamplePosition += pitchRatio; + + if (sourceSamplePosition > playingSound->length) + { + stopNote (0.0f, false); + break; + } + } + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h new file mode 100644 index 0000000000..f801bf2329 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h @@ -0,0 +1,146 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_SAMPLER_H_INCLUDED +#define JUCE_SAMPLER_H_INCLUDED + + +//============================================================================== +/** + A subclass of SynthesiserSound that represents a sampled audio clip. + + This is a pretty basic sampler, and just attempts to load the whole audio stream + into memory. + + To use it, create a Synthesiser, add some SamplerVoice objects to it, then + give it some SampledSound objects to play. + + @see SamplerVoice, Synthesiser, SynthesiserSound +*/ +class JUCE_API SamplerSound : public SynthesiserSound +{ +public: + //============================================================================== + /** Creates a sampled sound from an audio reader. + + This will attempt to load the audio from the source into memory and store + it in this object. + + @param name a name for the sample + @param source the audio to load. This object can be safely deleted by the + caller after this constructor returns + @param midiNotes the set of midi keys that this sound should be played on. This + is used by the SynthesiserSound::appliesToNote() method + @param midiNoteForNormalPitch the midi note at which the sample should be played + with its natural rate. All other notes will be pitched + up or down relative to this one + @param attackTimeSecs the attack (fade-in) time, in seconds + @param releaseTimeSecs the decay (fade-out) time, in seconds + @param maxSampleLengthSeconds a maximum length of audio to read from the audio + source, in seconds + */ + SamplerSound (const String& name, + AudioFormatReader& source, + const BigInteger& midiNotes, + int midiNoteForNormalPitch, + double attackTimeSecs, + double releaseTimeSecs, + double maxSampleLengthSeconds); + + /** Destructor. */ + ~SamplerSound(); + + //============================================================================== + /** Returns the sample's name */ + const String& getName() const noexcept { return name; } + + /** Returns the audio sample data. + This could return nullptr if there was a problem loading the data. + */ + AudioSampleBuffer* getAudioData() const noexcept { return data; } + + + //============================================================================== + bool appliesToNote (int midiNoteNumber) override; + bool appliesToChannel (int midiChannel) override; + + +private: + //============================================================================== + friend class SamplerVoice; + + String name; + ScopedPointer data; + double sourceSampleRate; + BigInteger midiNotes; + int length, attackSamples, releaseSamples; + int midiRootNote; + + JUCE_LEAK_DETECTOR (SamplerSound) +}; + + +//============================================================================== +/** + A subclass of SynthesiserVoice that can play a SamplerSound. + + To use it, create a Synthesiser, add some SamplerVoice objects to it, then + give it some SampledSound objects to play. + + @see SamplerSound, Synthesiser, SynthesiserVoice +*/ +class JUCE_API SamplerVoice : public SynthesiserVoice +{ +public: + //============================================================================== + /** Creates a SamplerVoice. */ + SamplerVoice(); + + /** Destructor. */ + ~SamplerVoice(); + + //============================================================================== + bool canPlaySound (SynthesiserSound*) override; + + void startNote (int midiNoteNumber, float velocity, SynthesiserSound*, int pitchWheel) override; + void stopNote (float velocity, bool allowTailOff) override; + + void pitchWheelMoved (int newValue); + void controllerMoved (int controllerNumber, int newValue) override; + + void renderNextBlock (AudioSampleBuffer&, int startSample, int numSamples) override; + + +private: + //============================================================================== + double pitchRatio; + double sourceSamplePosition; + float lgain, rgain, attackReleaseLevel, attackDelta, releaseDelta; + bool isInAttack, isInRelease; + + JUCE_LEAK_DETECTOR (SamplerVoice) +}; + + +#endif // JUCE_SAMPLER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp new file mode 100644 index 0000000000..cbd25424a4 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp @@ -0,0 +1,26 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioPluginFormat::AudioPluginFormat() noexcept {} +AudioPluginFormat::~AudioPluginFormat() {} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h new file mode 100644 index 0000000000..d0af2013ce --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h @@ -0,0 +1,112 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPLUGINFORMAT_H_INCLUDED +#define JUCE_AUDIOPLUGINFORMAT_H_INCLUDED + + +//============================================================================== +/** + The base class for a type of plugin format, such as VST, AudioUnit, LADSPA, etc. + + @see AudioFormatManager +*/ +class JUCE_API AudioPluginFormat +{ +public: + //============================================================================== + /** Destructor. */ + virtual ~AudioPluginFormat(); + + //============================================================================== + /** Returns the format name. + E.g. "VST", "AudioUnit", etc. + */ + virtual String getName() const = 0; + + /** This tries to create descriptions for all the plugin types available in + a binary module file. + + The file will be some kind of DLL or bundle. + + Normally there will only be one type returned, but some plugins + (e.g. VST shells) can use a single DLL to create a set of different plugin + subtypes, so in that case, each subtype is returned as a separate object. + */ + virtual void findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) = 0; + + /** Tries to recreate a type from a previously generated PluginDescription. + @see PluginDescription::createInstance + */ + virtual AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc, + double initialSampleRate, + int initialBufferSize) = 0; + + /** Should do a quick check to see if this file or directory might be a plugin of + this format. + + This is for searching for potential files, so it shouldn't actually try to + load the plugin or do anything time-consuming. + */ + virtual bool fileMightContainThisPluginType (const String& fileOrIdentifier) = 0; + + /** Returns a readable version of the name of the plugin that this identifier refers to. */ + virtual String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) = 0; + + /** Returns true if this plugin's version or date has changed and it should be re-checked. */ + virtual bool pluginNeedsRescanning (const PluginDescription&) = 0; + + /** Checks whether this plugin could possibly be loaded. + It doesn't actually need to load it, just to check whether the file or component + still exists. + */ + virtual bool doesPluginStillExist (const PluginDescription& desc) = 0; + + /** Returns true if this format needs to run a scan to find its list of plugins. */ + virtual bool canScanForPlugins() const = 0; + + /** Searches a suggested set of directories for any plugins in this format. + The path might be ignored, e.g. by AUs, which are found by the OS rather + than manually. + */ + virtual StringArray searchPathsForPlugins (const FileSearchPath& directoriesToSearch, + bool recursive) = 0; + + /** Returns the typical places to look for this kind of plugin. + + Note that if this returns no paths, it means that the format doesn't search in + files or folders, e.g. AudioUnits. + */ + virtual FileSearchPath getDefaultLocationsToSearch() = 0; + +protected: + //============================================================================== + AudioPluginFormat() noexcept; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginFormat) +}; + + +#endif // JUCE_AUDIOPLUGINFORMAT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp new file mode 100644 index 0000000000..0afa7c7931 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp @@ -0,0 +1,104 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioPluginFormatManager::AudioPluginFormatManager() {} +AudioPluginFormatManager::~AudioPluginFormatManager() {} + +//============================================================================== +void AudioPluginFormatManager::addDefaultFormats() +{ + #if JUCE_DEBUG + // you should only call this method once! + for (int i = formats.size(); --i >= 0;) + { + #if JUCE_PLUGINHOST_VST + jassert (dynamic_cast (formats[i]) == nullptr); + #endif + + #if JUCE_PLUGINHOST_VST3 + jassert (dynamic_cast (formats[i]) == nullptr); + #endif + + #if JUCE_PLUGINHOST_AU && JUCE_MAC + jassert (dynamic_cast (formats[i]) == nullptr); + #endif + + #if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX + jassert (dynamic_cast (formats[i]) == nullptr); + #endif + } + #endif + + #if JUCE_PLUGINHOST_AU && JUCE_MAC + formats.add (new AudioUnitPluginFormat()); + #endif + + #if JUCE_PLUGINHOST_VST + formats.add (new VSTPluginFormat()); + #endif + + #if JUCE_PLUGINHOST_VST3 + formats.add (new VST3PluginFormat()); + #endif + + #if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX + formats.add (new LADSPAPluginFormat()); + #endif +} + +int AudioPluginFormatManager::getNumFormats() +{ + return formats.size(); +} + +AudioPluginFormat* AudioPluginFormatManager::getFormat (const int index) +{ + return formats [index]; +} + +void AudioPluginFormatManager::addFormat (AudioPluginFormat* const format) +{ + formats.add (format); +} + +AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const PluginDescription& description, double rate, + int blockSize, String& errorMessage) const +{ + for (int i = 0; i < formats.size(); ++i) + if (AudioPluginInstance* result = formats.getUnchecked(i)->createInstanceFromDescription (description, rate, blockSize)) + return result; + + errorMessage = doesPluginStillExist (description) ? TRANS ("This plug-in failed to load correctly") + : TRANS ("This plug-in file no longer exists"); + return nullptr; +} + +bool AudioPluginFormatManager::doesPluginStillExist (const PluginDescription& description) const +{ + for (int i = 0; i < formats.size(); ++i) + if (formats.getUnchecked(i)->getName() == description.pluginFormatName) + return formats.getUnchecked(i)->doesPluginStillExist (description); + + return false; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h new file mode 100644 index 0000000000..a6f1607d16 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h @@ -0,0 +1,99 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPLUGINFORMATMANAGER_H_INCLUDED +#define JUCE_AUDIOPLUGINFORMATMANAGER_H_INCLUDED + + +//============================================================================== +/** + This maintains a list of known AudioPluginFormats. + + @see AudioPluginFormat +*/ +class JUCE_API AudioPluginFormatManager +{ +public: + //============================================================================== + AudioPluginFormatManager(); + + /** Destructor. */ + ~AudioPluginFormatManager(); + + //============================================================================== + /** Adds any formats that it knows about, e.g. VST. + */ + void addDefaultFormats(); + + //============================================================================== + /** Returns the number of types of format that are available. + + Use getFormat() to get one of them. + */ + int getNumFormats(); + + /** Returns one of the available formats. + + @see getNumFormats + */ + AudioPluginFormat* getFormat (int index); + + //============================================================================== + /** Adds a format to the list. + + The object passed in will be owned and deleted by the manager. + */ + void addFormat (AudioPluginFormat* format); + + + //============================================================================== + /** Tries to load the type for this description, by trying all the formats + that this manager knows about. + + The caller is responsible for deleting the object that is returned. + + If it can't load the plugin, it returns nullptr and leaves a message in the + errorMessage string. + */ + AudioPluginInstance* createPluginInstance (const PluginDescription& description, + double initialSampleRate, + int initialBufferSize, + String& errorMessage) const; + + /** Checks that the file or component for this plugin actually still exists. + + (This won't try to load the plugin) + */ + bool doesPluginStillExist (const PluginDescription& description) const; + +private: + //============================================================================== + OwnedArray formats; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginFormatManager) +}; + + + +#endif // JUCE_AUDIOPLUGINFORMATMANAGER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h new file mode 100644 index 0000000000..46c2b10eeb --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h @@ -0,0 +1,55 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if (JUCE_PLUGINHOST_AU && JUCE_MAC) || DOXYGEN + +//============================================================================== +/** + Implements a plugin format manager for AudioUnits. +*/ +class JUCE_API AudioUnitPluginFormat : public AudioPluginFormat +{ +public: + //============================================================================== + AudioUnitPluginFormat(); + ~AudioUnitPluginFormat(); + + //============================================================================== + String getName() const override { return "AudioUnit"; } + void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; + AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc, double, int) override; + bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; + String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; + bool pluginNeedsRescanning (const PluginDescription&) override; + StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive); + bool doesPluginStillExist (const PluginDescription&) override; + FileSearchPath getDefaultLocationsToSearch() override; + bool canScanForPlugins() const override { return true; } + +private: + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginFormat) +}; + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm new file mode 100644 index 0000000000..2877509e8c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -0,0 +1,1738 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_AU && JUCE_MAC + +} // (juce namespace) + +#include +#include +#include +#include +#include + +#if JUCE_SUPPORT_CARBON + #include +#endif + +namespace juce +{ + +#include "../../juce_audio_devices/native/juce_MidiDataConcatenator.h" + +#if JUCE_SUPPORT_CARBON + #include "../../juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" +#endif + +// Change this to disable logging of various activities +#ifndef AU_LOGGING + #define AU_LOGGING 1 +#endif + +#if AU_LOGGING + #define JUCE_AU_LOG(a) Logger::writeToLog(a); +#else + #define JUCE_AU_LOG(a) +#endif + +namespace AudioUnitFormatHelpers +{ + #if JUCE_DEBUG + static ThreadLocalValue insideCallback; + #endif + + String osTypeToString (OSType type) noexcept + { + const juce_wchar s[4] = { (juce_wchar) ((type >> 24) & 0xff), + (juce_wchar) ((type >> 16) & 0xff), + (juce_wchar) ((type >> 8) & 0xff), + (juce_wchar) (type & 0xff) }; + return String (s, 4); + } + + OSType stringToOSType (String s) + { + if (s.trim().length() >= 4) // (to avoid trimming leading spaces) + s = s.trim(); + + s += " "; + + return (((OSType) (unsigned char) s[0]) << 24) + | (((OSType) (unsigned char) s[1]) << 16) + | (((OSType) (unsigned char) s[2]) << 8) + | ((OSType) (unsigned char) s[3]); + } + + static const char* auIdentifierPrefix = "AudioUnit:"; + + String createPluginIdentifier (const AudioComponentDescription& desc) + { + String s (auIdentifierPrefix); + + if (desc.componentType == kAudioUnitType_MusicDevice) + s << "Synths/"; + else if (desc.componentType == kAudioUnitType_MusicEffect + || desc.componentType == kAudioUnitType_Effect) + s << "Effects/"; + else if (desc.componentType == kAudioUnitType_Generator) + s << "Generators/"; + else if (desc.componentType == kAudioUnitType_Panner) + s << "Panners/"; + + s << osTypeToString (desc.componentType) << "," + << osTypeToString (desc.componentSubType) << "," + << osTypeToString (desc.componentManufacturer); + + return s; + } + + void getNameAndManufacturer (AudioComponent comp, String& name, String& manufacturer) + { + CFStringRef cfName; + if (AudioComponentCopyName (comp, &cfName) == noErr) + { + name = String::fromCFString (cfName); + CFRelease (cfName); + } + + if (name.containsChar (':')) + { + manufacturer = name.upToFirstOccurrenceOf (":", false, false).trim(); + name = name.fromFirstOccurrenceOf (":", false, false).trim(); + } + + if (name.isEmpty()) + name = ""; + } + + bool getComponentDescFromIdentifier (const String& fileOrIdentifier, AudioComponentDescription& desc, + String& name, String& version, String& manufacturer) + { + if (fileOrIdentifier.startsWithIgnoreCase (auIdentifierPrefix)) + { + String s (fileOrIdentifier.substring (jmax (fileOrIdentifier.lastIndexOfChar (':'), + fileOrIdentifier.lastIndexOfChar ('/')) + 1)); + + StringArray tokens; + tokens.addTokens (s, ",", StringRef()); + tokens.removeEmptyStrings(); + + if (tokens.size() == 3) + { + zerostruct (desc); + desc.componentType = stringToOSType (tokens[0]); + desc.componentSubType = stringToOSType (tokens[1]); + desc.componentManufacturer = stringToOSType (tokens[2]); + + if (AudioComponent comp = AudioComponentFindNext (0, &desc)) + { + getNameAndManufacturer (comp, name, manufacturer); + + if (manufacturer.isEmpty()) + manufacturer = tokens[2]; + + if (version.isEmpty()) + { + UInt32 versionNum; + + if (AudioComponentGetVersion (comp, &versionNum) == noErr) + { + version << (int) (versionNum >> 16) << "." + << (int) ((versionNum >> 8) & 0xff) << "." + << (int) (versionNum & 0xff); + } + } + + return true; + } + } + } + + return false; + } + + bool getComponentDescFromFile (const String& fileOrIdentifier, AudioComponentDescription& desc, + String& name, String& version, String& manufacturer) + { + zerostruct (desc); + + const File file (fileOrIdentifier); + if (! file.hasFileExtension (".component")) + return false; + + const char* const utf8 = fileOrIdentifier.toUTF8(); + + if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, + strlen (utf8), file.isDirectory())) + { + CFBundleRef bundleRef = CFBundleCreate (kCFAllocatorDefault, url); + CFRelease (url); + + if (bundleRef != 0) + { + CFTypeRef bundleName = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleName")); + + if (bundleName != 0 && CFGetTypeID (bundleName) == CFStringGetTypeID()) + name = String::fromCFString ((CFStringRef) bundleName); + + if (name.isEmpty()) + name = file.getFileNameWithoutExtension(); + + CFTypeRef versionString = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleVersion")); + + if (versionString != 0 && CFGetTypeID (versionString) == CFStringGetTypeID()) + version = String::fromCFString ((CFStringRef) versionString); + + CFTypeRef manuString = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleGetInfoString")); + + if (manuString != 0 && CFGetTypeID (manuString) == CFStringGetTypeID()) + manufacturer = String::fromCFString ((CFStringRef) manuString); + + const short resFileId = CFBundleOpenBundleResourceMap (bundleRef); + UseResFile (resFileId); + + const OSType thngType = stringToOSType ("thng"); + + for (ResourceIndex i = 1; i <= Count1Resources (thngType); ++i) + { + if (Handle h = Get1IndResource (thngType, i)) + { + HLock (h); + const uint32* const types = (const uint32*) *h; + + if (types[0] == kAudioUnitType_MusicDevice + || types[0] == kAudioUnitType_MusicEffect + || types[0] == kAudioUnitType_Effect + || types[0] == kAudioUnitType_Generator + || types[0] == kAudioUnitType_Panner) + { + desc.componentType = types[0]; + desc.componentSubType = types[1]; + desc.componentManufacturer = types[2]; + + if (AudioComponent comp = AudioComponentFindNext (0, &desc)) + getNameAndManufacturer (comp, name, manufacturer); + + break; + } + + HUnlock (h); + ReleaseResource (h); + } + } + + CFBundleCloseBundleResourceMap (bundleRef, resFileId); + CFRelease (bundleRef); + } + } + + return desc.componentType != 0 && desc.componentSubType != 0; + } + + const char* getCategory (OSType type) noexcept + { + switch (type) + { + case kAudioUnitType_Effect: + case kAudioUnitType_MusicEffect: return "Effect"; + case kAudioUnitType_MusicDevice: return "Synth"; + case kAudioUnitType_Generator: return "Generator"; + case kAudioUnitType_Panner: return "Panner"; + default: break; + } + + return nullptr; + } +} + +//============================================================================== +class AudioUnitPluginWindowCarbon; +class AudioUnitPluginWindowCocoa; + +//============================================================================== +class AudioUnitPluginInstance : public AudioPluginInstance +{ +public: + AudioUnitPluginInstance (const String& fileOrId) + : fileOrIdentifier (fileOrId), + wantsMidiMessages (false), + producesMidiMessages (false), + wasPlaying (false), + prepared (false), + currentBuffer (nullptr), + numInputBusChannels (0), + numOutputBusChannels (0), + numInputBusses (0), + numOutputBusses (0), + audioUnit (nullptr), + eventListenerRef (0), + midiConcatenator (2048) + { + using namespace AudioUnitFormatHelpers; + + #if JUCE_DEBUG + ++*insideCallback; + #endif + + JUCE_AU_LOG ("Opening AU: " + fileOrIdentifier); + + if (getComponentDescFromIdentifier (fileOrIdentifier, componentDesc, pluginName, version, manufacturer) + || getComponentDescFromFile (fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) + { + if (AudioComponent comp = AudioComponentFindNext (0, &componentDesc)) + { + AudioComponentInstanceNew (comp, &audioUnit); + + wantsMidiMessages = componentDesc.componentType == kAudioUnitType_MusicDevice + || componentDesc.componentType == kAudioUnitType_MusicEffect; + } + } + + #if JUCE_DEBUG + --*insideCallback; + #endif + } + + ~AudioUnitPluginInstance() + { + const ScopedLock sl (lock); + + #if JUCE_DEBUG + // this indicates that some kind of recursive call is getting triggered that's + // deleting this plugin while it's still under construction. + jassert (AudioUnitFormatHelpers::insideCallback.get() == 0); + #endif + + if (eventListenerRef != 0) + { + AUListenerDispose (eventListenerRef); + eventListenerRef = 0; + } + + if (audioUnit != nullptr) + { + if (prepared) + releaseResources(); + + AudioComponentInstanceDispose (audioUnit); + audioUnit = nullptr; + } + } + + void initialise (double rate, int blockSize) + { + refreshParameterList(); + updateNumChannels(); + producesMidiMessages = canProduceMidiOutput(); + setPlayConfigDetails (numInputBusChannels * numInputBusses, + numOutputBusChannels * numOutputBusses, + rate, blockSize); + setLatencySamples (0); + + if (parameters.size() == 0) + { + // some plugins crash if initialiseAudioUnit() is called too soon (sigh..), so we'll + // only call it here if it seems like they it's one of the awkward plugins that can + // only create their parameters after it has been initialised. + initialiseAudioUnit(); + refreshParameterList(); + } + + setPluginCallbacks(); + } + + //============================================================================== + // AudioPluginInstance methods: + + void fillInPluginDescription (PluginDescription& desc) const override + { + desc.name = pluginName; + desc.descriptiveName = pluginName; + desc.fileOrIdentifier = AudioUnitFormatHelpers::createPluginIdentifier (componentDesc); + desc.uid = ((int) componentDesc.componentType) + ^ ((int) componentDesc.componentSubType) + ^ ((int) componentDesc.componentManufacturer); + desc.lastFileModTime = Time(); + desc.pluginFormatName = "AudioUnit"; + desc.category = AudioUnitFormatHelpers::getCategory (componentDesc.componentType); + desc.manufacturerName = manufacturer; + desc.version = version; + desc.numInputChannels = getNumInputChannels(); + desc.numOutputChannels = getNumOutputChannels(); + desc.isInstrument = (componentDesc.componentType == kAudioUnitType_MusicDevice); + } + + void* getPlatformSpecificData() override { return audioUnit; } + const String getName() const override { return pluginName; } + + bool silenceInProducesSilenceOut() const override + { + return getTailLengthSeconds() <= 0; + } + + double getTailLengthSeconds() const override + { + Float64 tail = 0; + UInt32 tailSize = sizeof (tail); + + if (audioUnit != nullptr) + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_TailTime, kAudioUnitScope_Global, + 0, &tail, &tailSize); + + return tail; + } + + bool acceptsMidi() const override { return wantsMidiMessages; } + bool producesMidi() const override { return producesMidiMessages; } + + //============================================================================== + // AudioProcessor methods: + + void prepareToPlay (double newSampleRate, int estimatedSamplesPerBlock) override + { + if (audioUnit != nullptr) + { + releaseResources(); + updateNumChannels(); + + Float64 sampleRateIn = 0, sampleRateOut = 0; + UInt32 sampleRateSize = sizeof (sampleRateIn); + const Float64 sr = newSampleRate; + + for (int i = 0; i < numInputBusses; ++i) + { + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, i, &sampleRateIn, &sampleRateSize); + + if (sampleRateIn != sr) + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, i, &sr, sizeof (sr)); + } + + for (int i = 0; i < numOutputBusses; ++i) + { + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, i, &sampleRateOut, &sampleRateSize); + + if (sampleRateOut != sr) + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, i, &sr, sizeof (sr)); + } + + UInt32 frameSize = (UInt32) estimatedSamplesPerBlock; + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, + &frameSize, sizeof (frameSize)); + + setPlayConfigDetails (numInputBusChannels * numInputBusses, + numOutputBusChannels * numOutputBusses, + newSampleRate, estimatedSamplesPerBlock); + + Float64 latencySecs = 0.0; + UInt32 latencySize = sizeof (latencySecs); + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_Latency, kAudioUnitScope_Global, + 0, &latencySecs, &latencySize); + + setLatencySamples (roundToInt (latencySecs * newSampleRate)); + + { + AudioStreamBasicDescription stream; + zerostruct (stream); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) + stream.mSampleRate = sr; + stream.mFormatID = kAudioFormatLinearPCM; + stream.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagsNativeEndian; + stream.mFramesPerPacket = 1; + stream.mBytesPerPacket = 4; + stream.mBytesPerFrame = 4; + stream.mBitsPerChannel = 32; + stream.mChannelsPerFrame = numInputBusChannels; + + for (int i = 0; i < numInputBusses; ++i) + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, i, &stream, sizeof (stream)); + + stream.mChannelsPerFrame = numOutputBusChannels; + + for (int i = 0; i < numOutputBusses; ++i) + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, i, &stream, sizeof (stream)); + } + + if (numOutputBusses != 0 && numOutputBusChannels != 0) + outputBufferList.calloc (numOutputBusses, getAudioBufferSizeInBytes()); + + zerostruct (timeStamp); + timeStamp.mSampleTime = 0; + timeStamp.mHostTime = AudioGetCurrentHostTime(); + timeStamp.mFlags = kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid; + + currentBuffer = nullptr; + wasPlaying = false; + + resetBusses(); + + jassert (! prepared); + initialiseAudioUnit(); + } + } + + void releaseResources() override + { + if (prepared) + { + AudioUnitUninitialize (audioUnit); + resetBusses(); + AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0); + + outputBufferList.free(); + currentBuffer = nullptr; + prepared = false; + } + + incomingMidi.clear(); + } + + bool initialiseAudioUnit() + { + if (! prepared) + prepared = (AudioUnitInitialize (audioUnit) == noErr); + + return prepared; + } + + void resetBusses() + { + for (int i = 0; i < numInputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Input, i); + for (int i = 0; i < numOutputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Output, i); + } + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override + { + const int numSamples = buffer.getNumSamples(); + + if (prepared) + { + timeStamp.mHostTime = AudioGetCurrentHostTime(); + + for (int i = 0; i < numOutputBusses; ++i) + { + if (AudioBufferList* const abl = getAudioBufferListForBus(i)) + { + abl->mNumberBuffers = numOutputBusChannels; + + for (int j = 0; j < numOutputBusChannels; ++j) + { + abl->mBuffers[j].mNumberChannels = 1; + abl->mBuffers[j].mDataByteSize = sizeof (float) * numSamples; + abl->mBuffers[j].mData = buffer.getWritePointer (i * numOutputBusChannels + j); + } + } + } + + currentBuffer = &buffer; + + if (wantsMidiMessages) + { + const uint8* midiEventData; + int midiEventSize, midiEventPosition; + + for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (midiEventData, midiEventSize, midiEventPosition);) + { + if (midiEventSize <= 3) + MusicDeviceMIDIEvent (audioUnit, + midiEventData[0], midiEventData[1], midiEventData[2], + midiEventPosition); + else + MusicDeviceSysEx (audioUnit, midiEventData, midiEventSize); + } + + midiMessages.clear(); + } + + + for (int i = 0; i < numOutputBusses; ++i) + { + AudioUnitRenderActionFlags flags = 0; + AudioUnitRender (audioUnit, &flags, &timeStamp, i, numSamples, getAudioBufferListForBus (i)); + } + + timeStamp.mSampleTime += numSamples; + } + else + { + // Plugin not working correctly, so just bypass.. + for (int i = 0; i < getNumOutputChannels(); ++i) + buffer.clear (i, 0, buffer.getNumSamples()); + } + + if (producesMidiMessages) + { + const ScopedLock sl (midiInLock); + midiMessages.swapWith (incomingMidi); + incomingMidi.clear(); + } + } + + //============================================================================== + bool hasEditor() const override { return true; } + AudioProcessorEditor* createEditor() override; + + //============================================================================== + const String getInputChannelName (int index) const override + { + if (isPositiveAndBelow (index, getNumInputChannels())) + return "Input " + String (index + 1); + + return String(); + } + + const String getOutputChannelName (int index) const override + { + if (isPositiveAndBelow (index, getNumOutputChannels())) + return "Output " + String (index + 1); + + return String(); + } + + bool isInputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getNumInputChannels()); } + bool isOutputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getNumOutputChannels()); } + + //============================================================================== + int getNumParameters() override { return parameters.size(); } + + float getParameter (int index) override + { + const ScopedLock sl (lock); + + AudioUnitParameterValue value = 0; + + if (audioUnit != nullptr) + { + if (const ParamInfo* p = parameters[index]) + { + AudioUnitGetParameter (audioUnit, + p->paramID, + kAudioUnitScope_Global, 0, + &value); + + value = (value - p->minValue) / (p->maxValue - p->minValue); + } + } + + return value; + } + + void setParameter (int index, float newValue) override + { + const ScopedLock sl (lock); + + if (audioUnit != nullptr) + { + if (const ParamInfo* p = parameters[index]) + { + AudioUnitSetParameter (audioUnit, p->paramID, kAudioUnitScope_Global, 0, + p->minValue + (p->maxValue - p->minValue) * newValue, 0); + + sendParameterChangeEvent (index); + } + } + } + + void sendParameterChangeEvent (int index) + { + jassert (audioUnit != nullptr); + + const ParamInfo& p = *parameters.getUnchecked (index); + + AudioUnitEvent ev; + ev.mEventType = kAudioUnitEvent_ParameterValueChange; + ev.mArgument.mParameter.mAudioUnit = audioUnit; + ev.mArgument.mParameter.mParameterID = p.paramID; + ev.mArgument.mParameter.mScope = kAudioUnitScope_Global; + ev.mArgument.mParameter.mElement = 0; + + AUEventListenerNotify (nullptr, nullptr, &ev); + } + + void sendAllParametersChangedEvents() + { + jassert (audioUnit != nullptr); + + AudioUnitParameter param; + param.mAudioUnit = audioUnit; + param.mParameterID = kAUParameterListener_AnyParameter; + + AUParameterListenerNotify (nullptr, nullptr, ¶m); + } + + const String getParameterName (int index) override + { + if (const ParamInfo* p = parameters[index]) + return p->name; + + return String(); + } + + const String getParameterText (int index) override { return String (getParameter (index)); } + + bool isParameterAutomatable (int index) const override + { + if (const ParamInfo* p = parameters[index]) + return p->automatable; + + return false; + } + + //============================================================================== + int getNumPrograms() override + { + CFArrayRef presets; + UInt32 sz = sizeof (CFArrayRef); + int num = 0; + + if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_FactoryPresets, + kAudioUnitScope_Global, 0, &presets, &sz) == noErr) + { + num = (int) CFArrayGetCount (presets); + CFRelease (presets); + } + + return num; + } + + int getCurrentProgram() override + { + AUPreset current; + current.presetNumber = 0; + UInt32 sz = sizeof (AUPreset); + + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_PresentPreset, + kAudioUnitScope_Global, 0, ¤t, &sz); + + return current.presetNumber; + } + + void setCurrentProgram (int newIndex) override + { + AUPreset current; + current.presetNumber = newIndex; + current.presetName = CFSTR(""); + + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_PresentPreset, + kAudioUnitScope_Global, 0, ¤t, sizeof (AUPreset)); + + sendAllParametersChangedEvents(); + } + + const String getProgramName (int index) override + { + String s; + CFArrayRef presets; + UInt32 sz = sizeof (CFArrayRef); + + if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_FactoryPresets, + kAudioUnitScope_Global, 0, &presets, &sz) == noErr) + { + for (CFIndex i = 0; i < CFArrayGetCount (presets); ++i) + { + if (const AUPreset* p = (const AUPreset*) CFArrayGetValueAtIndex (presets, i)) + { + if (p->presetNumber == index) + { + s = String::fromCFString (p->presetName); + break; + } + } + } + + CFRelease (presets); + } + + return s; + } + + void changeProgramName (int /*index*/, const String& /*newName*/) override + { + jassertfalse; // xxx not implemented! + } + + //============================================================================== + void getStateInformation (MemoryBlock& destData) override + { + getCurrentProgramStateInformation (destData); + } + + void getCurrentProgramStateInformation (MemoryBlock& destData) override + { + CFPropertyListRef propertyList = 0; + UInt32 sz = sizeof (CFPropertyListRef); + + if (AudioUnitGetProperty (audioUnit, + kAudioUnitProperty_ClassInfo, + kAudioUnitScope_Global, + 0, &propertyList, &sz) == noErr) + { + CFWriteStreamRef stream = CFWriteStreamCreateWithAllocatedBuffers (kCFAllocatorDefault, kCFAllocatorDefault); + CFWriteStreamOpen (stream); + + CFIndex bytesWritten = CFPropertyListWriteToStream (propertyList, stream, kCFPropertyListBinaryFormat_v1_0, 0); + CFWriteStreamClose (stream); + + CFDataRef data = (CFDataRef) CFWriteStreamCopyProperty (stream, kCFStreamPropertyDataWritten); + + destData.setSize (bytesWritten); + destData.copyFrom (CFDataGetBytePtr (data), 0, destData.getSize()); + CFRelease (data); + + CFRelease (stream); + CFRelease (propertyList); + } + } + + void setStateInformation (const void* data, int sizeInBytes) override + { + setCurrentProgramStateInformation (data, sizeInBytes); + } + + void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override + { + CFReadStreamRef stream = CFReadStreamCreateWithBytesNoCopy (kCFAllocatorDefault, (const UInt8*) data, + sizeInBytes, kCFAllocatorNull); + CFReadStreamOpen (stream); + + CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0; + CFPropertyListRef propertyList = CFPropertyListCreateFromStream (kCFAllocatorDefault, stream, 0, + kCFPropertyListImmutable, &format, 0); + CFRelease (stream); + + if (propertyList != 0) + { + initialiseAudioUnit(); + + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, + 0, &propertyList, sizeof (propertyList)); + + sendAllParametersChangedEvents(); + + CFRelease (propertyList); + } + } + + void refreshParameterList() override + { + parameters.clear(); + + if (audioUnit != nullptr) + { + UInt32 paramListSize = 0; + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, + 0, 0, ¶mListSize); + + if (paramListSize > 0) + { + const size_t numParams = paramListSize / sizeof (int); + + HeapBlock ids; + ids.calloc (numParams); + + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, + 0, ids, ¶mListSize); + + for (int i = 0; i < numParams; ++i) + { + AudioUnitParameterInfo info; + UInt32 sz = sizeof (info); + + if (AudioUnitGetProperty (audioUnit, + kAudioUnitProperty_ParameterInfo, + kAudioUnitScope_Global, + ids[i], &info, &sz) == noErr) + { + ParamInfo* const param = new ParamInfo(); + parameters.add (param); + param->paramID = ids[i]; + param->minValue = info.minValue; + param->maxValue = info.maxValue; + param->automatable = (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0; + + if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) != 0) + { + param->name = String::fromCFString (info.cfNameString); + + if ((info.flags & kAudioUnitParameterFlag_CFNameRelease) != 0) + CFRelease (info.cfNameString); + } + else + { + param->name = String (info.name, sizeof (info.name)); + } + } + } + } + } + } + + void handleIncomingMidiMessage (void*, const MidiMessage& message) + { + const ScopedLock sl (midiInLock); + incomingMidi.addEvent (message, 0); + } + + void handlePartialSysexMessage (void*, const uint8*, int, double) {} + +private: + //============================================================================== + friend class AudioUnitPluginWindowCarbon; + friend class AudioUnitPluginWindowCocoa; + friend class AudioUnitPluginFormat; + + AudioComponentDescription componentDesc; + String pluginName, manufacturer, version; + String fileOrIdentifier; + CriticalSection lock; + bool wantsMidiMessages, producesMidiMessages, wasPlaying, prepared; + + HeapBlock outputBufferList; + AudioTimeStamp timeStamp; + AudioSampleBuffer* currentBuffer; + int numInputBusChannels, numOutputBusChannels, numInputBusses, numOutputBusses; + + AudioUnit audioUnit; + AUEventListenerRef eventListenerRef; + + struct ParamInfo + { + UInt32 paramID; + String name; + AudioUnitParameterValue minValue, maxValue; + bool automatable; + }; + + OwnedArray parameters; + + MidiDataConcatenator midiConcatenator; + CriticalSection midiInLock; + MidiBuffer incomingMidi; + + void setPluginCallbacks() + { + if (audioUnit != nullptr) + { + { + AURenderCallbackStruct info; + zerostruct (info); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) + + info.inputProcRefCon = this; + info.inputProc = renderGetInputCallback; + + for (int i = 0; i < numInputBusses; ++i) + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Input, i, &info, sizeof (info)); + } + + if (producesMidiMessages) + { + AUMIDIOutputCallbackStruct info; + zerostruct (info); + + info.userData = this; + info.midiOutputCallback = renderMidiOutputCallback; + + producesMidiMessages = (AudioUnitSetProperty (audioUnit, kAudioUnitProperty_MIDIOutputCallback, + kAudioUnitScope_Global, 0, &info, sizeof (info)) == noErr); + } + + { + HostCallbackInfo info; + zerostruct (info); + + info.hostUserData = this; + info.beatAndTempoProc = getBeatAndTempoCallback; + info.musicalTimeLocationProc = getMusicalTimeLocationCallback; + info.transportStateProc = getTransportStateCallback; + + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_HostCallbacks, + kAudioUnitScope_Global, 0, &info, sizeof (info)); + } + + AUEventListenerCreate (eventListenerCallback, this, + #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 + CFRunLoopGetMain(), + #else + nullptr, + #endif + kCFRunLoopDefaultMode, 0, 0, &eventListenerRef); + + for (int i = 0; i < parameters.size(); ++i) + { + AudioUnitEvent event; + event.mArgument.mParameter.mAudioUnit = audioUnit; + event.mArgument.mParameter.mParameterID = parameters.getUnchecked(i)->paramID; + event.mArgument.mParameter.mScope = kAudioUnitScope_Global; + event.mArgument.mParameter.mElement = 0; + + event.mEventType = kAudioUnitEvent_ParameterValueChange; + AUEventListenerAddEventType (eventListenerRef, nullptr, &event); + + event.mEventType = kAudioUnitEvent_BeginParameterChangeGesture; + AUEventListenerAddEventType (eventListenerRef, nullptr, &event); + + event.mEventType = kAudioUnitEvent_EndParameterChangeGesture; + AUEventListenerAddEventType (eventListenerRef, nullptr, &event); + } + + // Add a listener for program changes + AudioUnitEvent event; + event.mArgument.mProperty.mAudioUnit = audioUnit; + event.mArgument.mProperty.mPropertyID = kAudioUnitProperty_PresentPreset; + event.mArgument.mProperty.mScope = kAudioUnitScope_Global; + event.mArgument.mProperty.mElement = 0; + + event.mEventType = kAudioUnitEvent_PropertyChange; + AUEventListenerAddEventType (eventListenerRef, nullptr, &event); + } + } + + void eventCallback (const AudioUnitEvent& event, AudioUnitParameterValue newValue) + { + switch (event.mEventType) + { + case kAudioUnitEvent_ParameterValueChange: + for (int i = 0; i < parameters.size(); ++i) + { + const ParamInfo& p = *parameters.getUnchecked(i); + + if (p.paramID == event.mArgument.mParameter.mParameterID) + { + sendParamChangeMessageToListeners (i, (newValue - p.minValue) / (p.maxValue - p.minValue)); + break; + } + } + + break; + + case kAudioUnitEvent_BeginParameterChangeGesture: + beginParameterChangeGesture (event.mArgument.mParameter.mParameterID); + break; + + case kAudioUnitEvent_EndParameterChangeGesture: + endParameterChangeGesture (event.mArgument.mParameter.mParameterID); + break; + + default: + sendAllParametersChangedEvents(); + break; + } + } + + static void eventListenerCallback (void* userRef, void*, const AudioUnitEvent* event, + UInt64, AudioUnitParameterValue value) + { + jassert (event != nullptr); + static_cast (userRef)->eventCallback (*event, value); + } + + //============================================================================== + OSStatus renderGetInput (AudioUnitRenderActionFlags*, + const AudioTimeStamp*, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList* ioData) const + { + if (currentBuffer != nullptr) + { + // if this ever happens, might need to add extra handling + jassert (inNumberFrames == (UInt32) currentBuffer->getNumSamples()); + + for (UInt32 i = 0; i < ioData->mNumberBuffers; ++i) + { + const int bufferChannel = inBusNumber * numInputBusChannels + i; + + if (bufferChannel < currentBuffer->getNumChannels()) + { + memcpy (ioData->mBuffers[i].mData, + currentBuffer->getReadPointer (bufferChannel), + sizeof (float) * inNumberFrames); + } + else + { + zeromem (ioData->mBuffers[i].mData, + sizeof (float) * inNumberFrames); + } + } + } + + return noErr; + } + + OSStatus renderMidiOutput (const MIDIPacketList* pktlist) + { + if (pktlist != nullptr && pktlist->numPackets) + { + const double time = Time::getMillisecondCounterHiRes() * 0.001; + const MIDIPacket* packet = &pktlist->packet[0]; + + for (UInt32 i = 0; i < pktlist->numPackets; ++i) + { + midiConcatenator.pushMidiData (packet->data, (int) packet->length, time, (void*) nullptr, *this); + packet = MIDIPacketNext (packet); + } + } + + return noErr; + } + + template + static void setIfNotNull (Type1* p, Type2 value) noexcept + { + if (p != nullptr) *p = value; + } + + OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const + { + AudioPlayHead* const ph = getPlayHead(); + AudioPlayHead::CurrentPositionInfo result; + + if (ph != nullptr && ph->getCurrentPosition (result)) + { + setIfNotNull (outCurrentBeat, result.ppqPosition); + setIfNotNull (outCurrentTempo, result.bpm); + } + else + { + setIfNotNull (outCurrentBeat, 0); + setIfNotNull (outCurrentTempo, 120.0); + } + + return noErr; + } + + OSStatus getMusicalTimeLocation (UInt32* outDeltaSampleOffsetToNextBeat, Float32* outTimeSig_Numerator, + UInt32* outTimeSig_Denominator, Float64* outCurrentMeasureDownBeat) const + { + AudioPlayHead* const ph = getPlayHead(); + AudioPlayHead::CurrentPositionInfo result; + + if (ph != nullptr && ph->getCurrentPosition (result)) + { + setIfNotNull (outTimeSig_Numerator, result.timeSigNumerator); + setIfNotNull (outTimeSig_Denominator, result.timeSigDenominator); + setIfNotNull (outDeltaSampleOffsetToNextBeat, 0); //xxx + setIfNotNull (outCurrentMeasureDownBeat, result.ppqPositionOfLastBarStart); //xxx wrong + } + else + { + setIfNotNull (outDeltaSampleOffsetToNextBeat, 0); + setIfNotNull (outTimeSig_Numerator, 4); + setIfNotNull (outTimeSig_Denominator, 4); + setIfNotNull (outCurrentMeasureDownBeat, 0); + } + + return noErr; + } + + OSStatus getTransportState (Boolean* outIsPlaying, Boolean* outTransportStateChanged, + Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling, + Float64* outCycleStartBeat, Float64* outCycleEndBeat) + { + AudioPlayHead* const ph = getPlayHead(); + AudioPlayHead::CurrentPositionInfo result; + + if (ph != nullptr && ph->getCurrentPosition (result)) + { + setIfNotNull (outIsPlaying, result.isPlaying); + + if (outTransportStateChanged != nullptr) + { + *outTransportStateChanged = result.isPlaying != wasPlaying; + wasPlaying = result.isPlaying; + } + + setIfNotNull (outCurrentSampleInTimeLine, result.timeInSamples); + setIfNotNull (outIsCycling, false); + setIfNotNull (outCycleStartBeat, 0); + setIfNotNull (outCycleEndBeat, 0); + } + else + { + setIfNotNull (outIsPlaying, false); + setIfNotNull (outTransportStateChanged, false); + setIfNotNull (outCurrentSampleInTimeLine, 0); + setIfNotNull (outIsCycling, false); + setIfNotNull (outCycleStartBeat, 0); + setIfNotNull (outCycleEndBeat, 0); + } + + return noErr; + } + + //============================================================================== + static OSStatus renderGetInputCallback (void* hostRef, AudioUnitRenderActionFlags* ioActionFlags, + const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, + UInt32 inNumberFrames, AudioBufferList* ioData) + { + return static_cast (hostRef) + ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData); + } + + static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp*, UInt32 /*midiOutNum*/, + const struct MIDIPacketList* pktlist) + { + return static_cast (hostRef)->renderMidiOutput (pktlist); + } + + static OSStatus getBeatAndTempoCallback (void* hostRef, Float64* outCurrentBeat, Float64* outCurrentTempo) + { + return static_cast (hostRef)->getBeatAndTempo (outCurrentBeat, outCurrentTempo); + } + + static OSStatus getMusicalTimeLocationCallback (void* hostRef, UInt32* outDeltaSampleOffsetToNextBeat, + Float32* outTimeSig_Numerator, UInt32* outTimeSig_Denominator, + Float64* outCurrentMeasureDownBeat) + { + return static_cast (hostRef) + ->getMusicalTimeLocation (outDeltaSampleOffsetToNextBeat, outTimeSig_Numerator, + outTimeSig_Denominator, outCurrentMeasureDownBeat); + } + + static OSStatus getTransportStateCallback (void* hostRef, Boolean* outIsPlaying, Boolean* outTransportStateChanged, + Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling, + Float64* outCycleStartBeat, Float64* outCycleEndBeat) + { + return static_cast (hostRef) + ->getTransportState (outIsPlaying, outTransportStateChanged, outCurrentSampleInTimeLine, + outIsCycling, outCycleStartBeat, outCycleEndBeat); + } + + //============================================================================== + size_t getAudioBufferSizeInBytes() const noexcept + { + return offsetof (AudioBufferList, mBuffers) + (sizeof (AudioBuffer) * numOutputBusChannels); + } + + AudioBufferList* getAudioBufferListForBus (int busIndex) const noexcept + { + return addBytesToPointer (outputBufferList.getData(), getAudioBufferSizeInBytes() * busIndex); + } + + int getElementCount (AudioUnitScope scope) const noexcept + { + UInt32 count; + UInt32 countSize = sizeof (count); + + if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize) != noErr + || countSize == 0) + count = 1; + + return (int) count; + } + + void updateNumChannels() + { + numInputBusses = getElementCount (kAudioUnitScope_Input); + numOutputBusses = getElementCount (kAudioUnitScope_Output); + + AUChannelInfo supportedChannels [128]; + UInt32 supportedChannelsSize = sizeof (supportedChannels); + + if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SupportedNumChannels, kAudioUnitScope_Global, + 0, supportedChannels, &supportedChannelsSize) == noErr + && supportedChannelsSize > 0) + { + int explicitNumIns = 0; + int explicitNumOuts = 0; + int maximumNumIns = 0; + int maximumNumOuts = 0; + + for (int i = 0; i < (int) (supportedChannelsSize / sizeof (AUChannelInfo)); ++i) + { + const int inChannels = (int) supportedChannels[i].inChannels; + const int outChannels = (int) supportedChannels[i].outChannels; + + if (inChannels < 0) + maximumNumIns = jmin (maximumNumIns, inChannels); + else + explicitNumIns = jmax (explicitNumIns, inChannels); + + if (outChannels < 0) + maximumNumOuts = jmin (maximumNumOuts, outChannels); + else + explicitNumOuts = jmax (explicitNumOuts, outChannels); + } + + if ((maximumNumIns == -1 && maximumNumOuts == -1) // (special meaning: any number of ins/outs, as long as they match) + || (maximumNumIns == -2 && maximumNumOuts == -1) // (special meaning: any number of ins/outs, even if they don't match) + || (maximumNumIns == -1 && maximumNumOuts == -2)) + { + numInputBusChannels = numOutputBusChannels = 2; + } + else + { + numInputBusChannels = explicitNumIns; + numOutputBusChannels = explicitNumOuts; + + if (maximumNumIns == -1 || (maximumNumIns < 0 && explicitNumIns <= -maximumNumIns)) + numInputBusChannels = 2; + + if (maximumNumOuts == -1 || (maximumNumOuts < 0 && explicitNumOuts <= -maximumNumOuts)) + numOutputBusChannels = 2; + } + } + else + { + // (this really means the plugin will take any number of ins/outs as long + // as they are the same) + numInputBusChannels = numOutputBusChannels = 2; + } + } + + bool canProduceMidiOutput() + { + UInt32 dataSize = 0; + Boolean isWritable = false; + + if (AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_MIDIOutputCallbackInfo, + kAudioUnitScope_Global, 0, &dataSize, &isWritable) == noErr + && dataSize != 0) + { + CFArrayRef midiArray; + + if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_MIDIOutputCallbackInfo, + kAudioUnitScope_Global, 0, &midiArray, &dataSize) == noErr) + { + bool result = (CFArrayGetCount (midiArray) > 0); + CFRelease (midiArray); + return result; + } + } + + return false; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginInstance) +}; + +//============================================================================== +class AudioUnitPluginWindowCocoa : public AudioProcessorEditor +{ +public: + AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded) + : AudioProcessorEditor (&p), + plugin (p) + { + addAndMakeVisible (wrapper); + + setOpaque (true); + setVisible (true); + setSize (100, 100); + + createView (createGenericViewIfNeeded); + } + + ~AudioUnitPluginWindowCocoa() + { + if (isValid()) + { + wrapper.setVisible (false); + removeChildComponent (&wrapper); + wrapper.setView (nil); + plugin.editorBeingDeleted (this); + } + } + + bool isValid() const { return wrapper.getView() != nil; } + + void paint (Graphics& g) override + { + g.fillAll (Colours::white); + } + + void resized() override + { + wrapper.setSize (getWidth(), getHeight()); + } + + void childBoundsChanged (Component*) override + { + setSize (wrapper.getWidth(), wrapper.getHeight()); + } + +private: + AudioUnitPluginInstance& plugin; + + AutoResizingNSViewComponent wrapper; + + bool createView (const bool createGenericViewIfNeeded) + { + if (! plugin.initialiseAudioUnit()) + return false; + + NSView* pluginView = nil; + UInt32 dataSize = 0; + Boolean isWritable = false; + + if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, + 0, &dataSize, &isWritable) == noErr + && dataSize != 0 + && AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, + 0, &dataSize, &isWritable) == noErr) + { + HeapBlock info; + info.calloc (dataSize, 1); + + if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, + 0, info, &dataSize) == noErr) + { + NSString* viewClassName = (NSString*) (info->mCocoaAUViewClass[0]); + CFStringRef path = CFURLCopyPath (info->mCocoaAUViewBundleLocation); + NSString* unescapedPath = (NSString*) CFURLCreateStringByReplacingPercentEscapes (0, path, CFSTR ("")); + CFRelease (path); + NSBundle* viewBundle = [NSBundle bundleWithPath: [unescapedPath autorelease]]; + Class viewClass = [viewBundle classNamed: viewClassName]; + + if ([viewClass conformsToProtocol: @protocol (AUCocoaUIBase)] + && [viewClass instancesRespondToSelector: @selector (interfaceVersion)] + && [viewClass instancesRespondToSelector: @selector (uiViewForAudioUnit: withSize:)]) + { + id factory = [[[viewClass alloc] init] autorelease]; + pluginView = [factory uiViewForAudioUnit: plugin.audioUnit + withSize: NSMakeSize (getWidth(), getHeight())]; + } + + for (int i = (dataSize - sizeof (CFURLRef)) / sizeof (CFStringRef); --i >= 0;) + CFRelease (info->mCocoaAUViewClass[i]); + + CFRelease (info->mCocoaAUViewBundleLocation); + } + } + + if (createGenericViewIfNeeded && (pluginView == nil)) + { + { + // This forces CoreAudio.component to be loaded, otherwise the AUGenericView will assert + AudioComponentDescription desc; + String name, version, manufacturer; + AudioUnitFormatHelpers::getComponentDescFromIdentifier ("AudioUnit:Output/auou,genr,appl", + desc, name, version, manufacturer); + } + + pluginView = [[AUGenericView alloc] initWithAudioUnit: plugin.audioUnit]; + } + + wrapper.setView (pluginView); + + if (pluginView != nil) + wrapper.resizeToFitView(); + + return pluginView != nil; + } +}; + +#if JUCE_SUPPORT_CARBON + +//============================================================================== +class AudioUnitPluginWindowCarbon : public AudioProcessorEditor +{ +public: + AudioUnitPluginWindowCarbon (AudioUnitPluginInstance& p) + : AudioProcessorEditor (&p), + plugin (p), + audioComponent (nullptr), + viewComponent (nullptr) + { + addAndMakeVisible (innerWrapper = new InnerWrapperComponent (*this)); + + setOpaque (true); + setVisible (true); + setSize (400, 300); + + UInt32 propertySize; + if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, + kAudioUnitScope_Global, 0, &propertySize, NULL) == noErr + && propertySize > 0) + { + HeapBlock views (propertySize / sizeof (AudioComponentDescription)); + + if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, + kAudioUnitScope_Global, 0, &views[0], &propertySize) == noErr) + { + audioComponent = AudioComponentFindNext (nullptr, &views[0]); + } + } + } + + ~AudioUnitPluginWindowCarbon() + { + innerWrapper = nullptr; + + if (isValid()) + plugin.editorBeingDeleted (this); + } + + bool isValid() const noexcept { return audioComponent != nullptr; } + + //============================================================================== + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void resized() override + { + if (innerWrapper != nullptr) + innerWrapper->setSize (getWidth(), getHeight()); + } + + //============================================================================== + bool keyStateChanged (bool) override { return false; } + bool keyPressed (const KeyPress&) override { return false; } + + //============================================================================== + AudioUnit getAudioUnit() const { return plugin.audioUnit; } + + AudioUnitCarbonView getViewComponent() + { + if (viewComponent == nullptr && audioComponent != nullptr) + AudioComponentInstanceNew (audioComponent, &viewComponent); + + return viewComponent; + } + + void closeViewComponent() + { + if (viewComponent != nullptr) + { + JUCE_AU_LOG ("Closing AU GUI: " + plugin.getName()); + + AudioComponentInstanceDispose (viewComponent); + viewComponent = nullptr; + } + } + +private: + //============================================================================== + AudioUnitPluginInstance& plugin; + AudioComponent audioComponent; + AudioUnitCarbonView viewComponent; + + //============================================================================== + class InnerWrapperComponent : public CarbonViewWrapperComponent + { + public: + InnerWrapperComponent (AudioUnitPluginWindowCarbon& w) : owner (w) {} + + ~InnerWrapperComponent() + { + deleteWindow(); + } + + HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) override + { + JUCE_AU_LOG ("Opening AU GUI: " + owner.plugin.getName()); + + AudioUnitCarbonView carbonView = owner.getViewComponent(); + + if (carbonView == 0) + return 0; + + Float32Point pos = { 0, 0 }; + Float32Point size = { 250, 200 }; + HIViewRef pluginView = 0; + + AudioUnitCarbonViewCreate (carbonView, owner.getAudioUnit(), windowRef, rootView, + &pos, &size, (ControlRef*) &pluginView); + + return pluginView; + } + + void removeView (HIViewRef) override + { + owner.closeViewComponent(); + } + + private: + AudioUnitPluginWindowCarbon& owner; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerWrapperComponent) + }; + + friend class InnerWrapperComponent; + ScopedPointer innerWrapper; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginWindowCarbon) +}; + +#endif + +//============================================================================== +AudioProcessorEditor* AudioUnitPluginInstance::createEditor() +{ + ScopedPointer w (new AudioUnitPluginWindowCocoa (*this, false)); + + if (! static_cast (w.get())->isValid()) + w = nullptr; + + #if JUCE_SUPPORT_CARBON + if (w == nullptr) + { + w = new AudioUnitPluginWindowCarbon (*this); + + if (! static_cast (w.get())->isValid()) + w = nullptr; + } + #endif + + if (w == nullptr) + w = new AudioUnitPluginWindowCocoa (*this, true); // use AUGenericView as a fallback + + return w.release(); +} + + +//============================================================================== +//============================================================================== +AudioUnitPluginFormat::AudioUnitPluginFormat() +{ +} + +AudioUnitPluginFormat::~AudioUnitPluginFormat() +{ +} + +void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) +{ + if (! fileMightContainThisPluginType (fileOrIdentifier)) + return; + + PluginDescription desc; + desc.fileOrIdentifier = fileOrIdentifier; + desc.uid = 0; + + try + { + ScopedPointer createdInstance (createInstanceFromDescription (desc, 44100.0, 512)); + + if (AudioUnitPluginInstance* auInstance = dynamic_cast (createdInstance.get())) + results.add (new PluginDescription (auInstance->getPluginDescription())); + } + catch (...) + { + // crashed while loading... + } +} + +AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc, double rate, int blockSize) +{ + if (fileMightContainThisPluginType (desc.fileOrIdentifier)) + { + ScopedPointer result (new AudioUnitPluginInstance (desc.fileOrIdentifier)); + + if (result->audioUnit != nullptr) + { + result->initialise (rate, blockSize); + return result.release(); + } + } + + return nullptr; +} + +StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&, bool /*recursive*/) +{ + StringArray result; + AudioComponent comp = nullptr; + + for (;;) + { + AudioComponentDescription desc; + zerostruct (desc); + + comp = AudioComponentFindNext (comp, &desc); + + if (comp == nullptr) + break; + + AudioComponentGetDescription (comp, &desc); + + if (desc.componentType == kAudioUnitType_MusicDevice + || desc.componentType == kAudioUnitType_MusicEffect + || desc.componentType == kAudioUnitType_Effect + || desc.componentType == kAudioUnitType_Generator + || desc.componentType == kAudioUnitType_Panner) + { + result.add (AudioUnitFormatHelpers::createPluginIdentifier (desc)); + } + } + + return result; +} + +bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) +{ + AudioComponentDescription desc; + + String name, version, manufacturer; + if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer)) + return AudioComponentFindNext (nullptr, &desc) != nullptr; + + const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); + + return f.hasFileExtension (".component") + && f.isDirectory(); +} + +String AudioUnitPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) +{ + AudioComponentDescription desc; + String name, version, manufacturer; + AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer); + + if (name.isEmpty()) + name = fileOrIdentifier; + + return name; +} + +bool AudioUnitPluginFormat::pluginNeedsRescanning (const PluginDescription& desc) +{ + AudioComponentDescription newDesc; + String name, version, manufacturer; + + return ! (AudioUnitFormatHelpers::getComponentDescFromIdentifier (desc.fileOrIdentifier, newDesc, + name, version, manufacturer) + && version == desc.version); +} + +bool AudioUnitPluginFormat::doesPluginStillExist (const PluginDescription& desc) +{ + if (desc.fileOrIdentifier.startsWithIgnoreCase (AudioUnitFormatHelpers::auIdentifierPrefix)) + return fileMightContainThisPluginType (desc.fileOrIdentifier); + + return File (desc.fileOrIdentifier).exists(); +} + +FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch() +{ + return FileSearchPath(); +} + +#undef JUCE_AU_LOG + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp new file mode 100644 index 0000000000..1bb2413ec5 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -0,0 +1,703 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX + +} // (juce namespace) + +#include + +namespace juce +{ + +static int shellLADSPAUIDToCreate = 0; +static int insideLADSPACallback = 0; + +#define JUCE_LADSPA_LOGGING 1 + +#if JUCE_LADSPA_LOGGING + #define JUCE_LADSPA_LOG(x) Logger::writeToLog (x); +#else + #define JUCE_LADSPA_LOG(x) +#endif + +//============================================================================== +class LADSPAModuleHandle : public ReferenceCountedObject +{ +public: + LADSPAModuleHandle (const File& f) + : file (f), moduleMain (nullptr) + { + getActiveModules().add (this); + } + + ~LADSPAModuleHandle() + { + getActiveModules().removeFirstMatchingValue (this); + close(); + } + + typedef ReferenceCountedObjectPtr Ptr; + + static Array & getActiveModules() + { + static Array activeModules; + return activeModules; + } + + static LADSPAModuleHandle* findOrCreateModule (const File& file) + { + for (int i = getActiveModules().size(); --i >= 0;) + { + LADSPAModuleHandle* const module = getActiveModules().getUnchecked(i); + + if (module->file == file) + return module; + } + + ++insideLADSPACallback; + shellLADSPAUIDToCreate = 0; + + JUCE_LADSPA_LOG ("Loading LADSPA module: " + file.getFullPathName()); + + ScopedPointer m (new LADSPAModuleHandle (file)); + + if (! m->open()) + m = nullptr; + + --insideLADSPACallback; + + return m.release(); + } + + File file; + LADSPA_Descriptor_Function moduleMain; + +private: + DynamicLibrary module; + + bool open() + { + module.open (file.getFullPathName()); + moduleMain = (LADSPA_Descriptor_Function) module.getFunction ("ladspa_descriptor"); + return moduleMain != nullptr; + } + + void close() + { + module.close(); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAModuleHandle) +}; + + +//============================================================================== +class LADSPAPluginInstance : public AudioPluginInstance +{ +public: + LADSPAPluginInstance (const LADSPAModuleHandle::Ptr& m) + : module (m), plugin (nullptr), handle (nullptr), + initialised (false), tempBuffer (1, 1) + { + ++insideLADSPACallback; + + name = module->file.getFileNameWithoutExtension(); + + JUCE_LADSPA_LOG ("Creating LADSPA instance: " + name); + + if (module->moduleMain != nullptr) + { + plugin = module->moduleMain (shellLADSPAUIDToCreate); + + if (plugin == nullptr) + { + JUCE_LADSPA_LOG ("Cannot find any valid descriptor in shared library"); + --insideLADSPACallback; + return; + } + } + else + { + JUCE_LADSPA_LOG ("Cannot find any valid plugin in shared library"); + --insideLADSPACallback; + return; + } + + const double sampleRate = getSampleRate() > 0 ? getSampleRate() : 44100.0; + + handle = plugin->instantiate (plugin, (uint32) sampleRate); + + --insideLADSPACallback; + } + + ~LADSPAPluginInstance() + { + const ScopedLock sl (lock); + + jassert (insideLADSPACallback == 0); + + if (handle != nullptr && plugin != nullptr && plugin->cleanup != nullptr) + plugin->cleanup (handle); + + initialised = false; + module = nullptr; + plugin = nullptr; + handle = nullptr; + } + + void initialise (double initialSampleRate, int initialBlockSize) + { + setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize); + + if (initialised || plugin == nullptr || handle == nullptr) + return; + + JUCE_LADSPA_LOG ("Initialising LADSPA: " + name); + + initialised = true; + + inputs.clear(); + outputs.clear(); + parameters.clear(); + + for (unsigned int i = 0; i < plugin->PortCount; ++i) + { + const LADSPA_PortDescriptor portDesc = plugin->PortDescriptors[i]; + + if ((portDesc & LADSPA_PORT_CONTROL) != 0) + parameters.add (i); + + if ((portDesc & LADSPA_PORT_AUDIO) != 0) + { + if ((portDesc & LADSPA_PORT_INPUT) != 0) inputs.add (i); + if ((portDesc & LADSPA_PORT_OUTPUT) != 0) outputs.add (i); + } + } + + parameterValues.calloc (parameters.size()); + + for (int i = 0; i < parameters.size(); ++i) + plugin->connect_port (handle, parameters[i], &(parameterValues[i].scaled)); + + setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize); + + setCurrentProgram (0); + setLatencySamples (0); + + // Some plugins crash if this doesn't happen: + if (plugin->activate != nullptr) plugin->activate (handle); + if (plugin->deactivate != nullptr) plugin->deactivate (handle); + } + + //============================================================================== + // AudioPluginInstance methods: + + void fillInPluginDescription (PluginDescription& desc) const + { + desc.name = getName(); + desc.fileOrIdentifier = module->file.getFullPathName(); + desc.uid = getUID(); + desc.lastFileModTime = module->file.getLastModificationTime(); + desc.pluginFormatName = "LADSPA"; + desc.category = getCategory(); + desc.manufacturerName = plugin != nullptr ? String (plugin->Maker) : String(); + desc.version = getVersion(); + desc.numInputChannels = getNumInputChannels(); + desc.numOutputChannels = getNumOutputChannels(); + desc.isInstrument = false; + } + + const String getName() const + { + if (plugin != nullptr && plugin->Label != nullptr) + return plugin->Label; + + return name; + } + + int getUID() const + { + if (plugin != nullptr && plugin->UniqueID != 0) + return (int) plugin->UniqueID; + + return module->file.hashCode(); + } + + String getVersion() const { return LADSPA_VERSION; } + String getCategory() const { return "Effect"; } + + bool acceptsMidi() const { return false; } + bool producesMidi() const { return false; } + + bool silenceInProducesSilenceOut() const { return plugin == nullptr; } // ..any way to get a proper answer for these? + double getTailLengthSeconds() const { return 0.0; } + + //============================================================================== + void prepareToPlay (double newSampleRate, int samplesPerBlockExpected) + { + setLatencySamples (0); + + initialise (newSampleRate, samplesPerBlockExpected); + + if (initialised) + { + tempBuffer.setSize (jmax (1, outputs.size()), samplesPerBlockExpected); + + // dodgy hack to force some plugins to initialise the sample rate.. + if (getNumParameters() > 0) + { + const float old = getParameter (0); + setParameter (0, (old < 0.5f) ? 1.0f : 0.0f); + setParameter (0, old); + } + + if (plugin->activate != nullptr) + plugin->activate (handle); + } + } + + void releaseResources() + { + if (handle != nullptr && plugin->deactivate != nullptr) + plugin->deactivate (handle); + + tempBuffer.setSize (1, 1); + } + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) + { + const int numSamples = buffer.getNumSamples(); + + if (initialised && plugin != nullptr && handle != nullptr) + { + for (int i = 0; i < inputs.size(); ++i) + plugin->connect_port (handle, inputs[i], + i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr); + + if (plugin->run != nullptr) + { + for (int i = 0; i < outputs.size(); ++i) + plugin->connect_port (handle, outputs.getUnchecked(i), + i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr); + + plugin->run (handle, numSamples); + return; + } + + if (plugin->run_adding != nullptr) + { + tempBuffer.setSize (outputs.size(), numSamples); + tempBuffer.clear(); + + for (int i = 0; i < outputs.size(); ++i) + plugin->connect_port (handle, outputs.getUnchecked(i), tempBuffer.getWritePointer (i)); + + plugin->run_adding (handle, numSamples); + + for (int i = 0; i < outputs.size(); ++i) + if (i < buffer.getNumChannels()) + buffer.copyFrom (i, 0, tempBuffer, i, 0, numSamples); + + return; + } + + jassertfalse; // no callback to use? + } + + for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) + buffer.clear (i, 0, numSamples); + } + + bool isInputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } + bool isOutputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } + + const String getInputChannelName (const int index) const + { + if (isPositiveAndBelow (index, getNumInputChannels())) + return String (plugin->PortNames [inputs [index]]).trim(); + + return String(); + } + + const String getOutputChannelName (const int index) const + { + if (isPositiveAndBelow (index, getNumInputChannels())) + return String (plugin->PortNames [outputs [index]]).trim(); + + return String(); + } + + //============================================================================== + int getNumParameters() { return handle != nullptr ? parameters.size() : 0; } + + bool isParameterAutomatable (int index) const + { + return plugin != nullptr + && (plugin->PortDescriptors [parameters[index]] & LADSPA_PORT_INPUT) != 0; + } + + float getParameter (int index) + { + if (plugin != nullptr && isPositiveAndBelow (index, parameters.size())) + { + const ScopedLock sl (lock); + return parameterValues[index].unscaled; + } + + return 0.0f; + } + + void setParameter (int index, float newValue) + { + if (plugin != nullptr && isPositiveAndBelow (index, parameters.size())) + { + const ScopedLock sl (lock); + + ParameterValue& p = parameterValues[index]; + + if (p.unscaled != newValue) + p = ParameterValue (getNewParamScaled (plugin->PortRangeHints [parameters[index]], newValue), newValue); + } + } + + const String getParameterName (int index) + { + if (plugin != nullptr) + { + jassert (isPositiveAndBelow (index, parameters.size())); + return String (plugin->PortNames [parameters [index]]).trim(); + } + + return String(); + } + + const String getParameterText (int index) + { + if (plugin != nullptr) + { + jassert (index >= 0 && index < parameters.size()); + + const LADSPA_PortRangeHint& hint = plugin->PortRangeHints [parameters [index]]; + + if (LADSPA_IS_HINT_INTEGER (hint.HintDescriptor)) + return String ((int) parameterValues[index].scaled); + + return String (parameterValues[index].scaled, 4); + } + + return String(); + } + + //============================================================================== + int getNumPrograms() { return 0; } + int getCurrentProgram() { return 0; } + + void setCurrentProgram (int newIndex) + { + if (plugin != nullptr) + for (int i = 0; i < parameters.size(); ++i) + parameterValues[i] = getParamValue (plugin->PortRangeHints [parameters[i]]); + } + + const String getProgramName (int index) + { + // XXX + return String(); + } + + void changeProgramName (int index, const String& newName) + { + // XXX + } + + //============================================================================== + void getStateInformation (MemoryBlock& destData) + { + destData.setSize (sizeof (float) * getNumParameters()); + destData.fillWith (0); + + float* const p = (float*) ((char*) destData.getData()); + for (int i = 0; i < getNumParameters(); ++i) + p[i] = getParameter(i); + } + + void getCurrentProgramStateInformation (MemoryBlock& destData) + { + getStateInformation (destData); + } + + void setStateInformation (const void* data, int sizeInBytes) + { + const float* p = static_cast (data); + + for (int i = 0; i < getNumParameters(); ++i) + setParameter (i, p[i]); + } + + void setCurrentProgramStateInformation (const void* data, int sizeInBytes) + { + setStateInformation (data, sizeInBytes); + } + + bool hasEditor() const + { + return false; + } + + AudioProcessorEditor* createEditor() + { + return nullptr; + } + + bool isValid() const + { + return handle != nullptr; + } + + LADSPAModuleHandle::Ptr module; + const LADSPA_Descriptor* plugin; + +private: + LADSPA_Handle handle; + String name; + CriticalSection lock; + bool initialised; + AudioSampleBuffer tempBuffer; + Array inputs, outputs, parameters; + + struct ParameterValue + { + inline ParameterValue() noexcept : scaled (0), unscaled (0) {} + inline ParameterValue (float s, float u) noexcept : scaled (s), unscaled (u) {} + + float scaled, unscaled; + }; + + HeapBlock parameterValues; + + //============================================================================== + static float scaledValue (float low, float high, float alpha, bool useLog) noexcept + { + if (useLog && low > 0 && high > 0) + return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha); + + return low + (high - low) * alpha; + } + + static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value) + { + return LADSPA_IS_HINT_INTEGER (desc) ? ((float) (int) value) : value; + } + + float getNewParamScaled (const LADSPA_PortRangeHint& hint, float newValue) const + { + const LADSPA_PortRangeHintDescriptor& desc = hint.HintDescriptor; + + if (LADSPA_IS_HINT_TOGGLED (desc)) + return (newValue < 0.5f) ? 0.0f : 1.0f; + + const float scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) getSampleRate() : 1.0f; + const float lower = hint.LowerBound * scale; + const float upper = hint.UpperBound * scale; + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) + return toIntIfNecessary (desc, scaledValue (lower, upper, newValue, LADSPA_IS_HINT_LOGARITHMIC (desc))); + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) return toIntIfNecessary (desc, newValue); + if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) return toIntIfNecessary (desc, newValue * upper); + + return 0.0f; + } + + ParameterValue getParamValue (const LADSPA_PortRangeHint& hint) const + { + const LADSPA_PortRangeHintDescriptor& desc = hint.HintDescriptor; + + if (LADSPA_IS_HINT_HAS_DEFAULT (desc)) + { + if (LADSPA_IS_HINT_DEFAULT_0 (desc)) return ParameterValue(); + if (LADSPA_IS_HINT_DEFAULT_1 (desc)) return ParameterValue (1.0f, 1.0f); + if (LADSPA_IS_HINT_DEFAULT_100 (desc)) return ParameterValue (100.0f, 0.5f); + if (LADSPA_IS_HINT_DEFAULT_440 (desc)) return ParameterValue (440.0f, 0.5f); + + const float scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) getSampleRate() : 1.0f; + const float lower = hint.LowerBound * scale; + const float upper = hint.UpperBound * scale; + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_DEFAULT_MINIMUM (desc)) return ParameterValue (lower, 0.0f); + if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc) && LADSPA_IS_HINT_DEFAULT_MAXIMUM (desc)) return ParameterValue (upper, 1.0f); + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) + { + const bool useLog = LADSPA_IS_HINT_LOGARITHMIC (desc); + + if (LADSPA_IS_HINT_DEFAULT_LOW (desc)) return ParameterValue (scaledValue (lower, upper, 0.25f, useLog), 0.25f); + if (LADSPA_IS_HINT_DEFAULT_MIDDLE (desc)) return ParameterValue (scaledValue (lower, upper, 0.50f, useLog), 0.50f); + if (LADSPA_IS_HINT_DEFAULT_HIGH (desc)) return ParameterValue (scaledValue (lower, upper, 0.75f, useLog), 0.75f); + } + } + + return ParameterValue(); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAPluginInstance) +}; + + +//============================================================================== +//============================================================================== +LADSPAPluginFormat::LADSPAPluginFormat() {} +LADSPAPluginFormat::~LADSPAPluginFormat() {} + +void LADSPAPluginFormat::findAllTypesForFile (OwnedArray & results, + const String& fileOrIdentifier) +{ + if (! fileMightContainThisPluginType (fileOrIdentifier)) + return; + + PluginDescription desc; + desc.fileOrIdentifier = fileOrIdentifier; + desc.uid = 0; + + ScopedPointer instance (dynamic_cast (createInstanceFromDescription (desc, 44100.0, 512))); + + if (instance == nullptr || ! instance->isValid()) + return; + + instance->initialise (44100.0, 512); + + instance->fillInPluginDescription (desc); + + if (instance->module->moduleMain != nullptr) + { + for (int uid = 0;; ++uid) + { + if (const LADSPA_Descriptor* plugin = instance->module->moduleMain (uid)) + { + desc.uid = uid; + desc.name = plugin->Name != nullptr ? plugin->Name : "Unknown"; + + if (! arrayContainsPlugin (results, desc)) + results.add (new PluginDescription (desc)); + } + else + { + break; + } + } + } +} + +AudioPluginInstance* LADSPAPluginFormat::createInstanceFromDescription (const PluginDescription& desc, + double sampleRate, int blockSize) +{ + ScopedPointer result; + + if (fileMightContainThisPluginType (desc.fileOrIdentifier)) + { + File file (desc.fileOrIdentifier); + + const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); + file.getParentDirectory().setAsCurrentWorkingDirectory(); + + const LADSPAModuleHandle::Ptr module (LADSPAModuleHandle::findOrCreateModule (file)); + + if (module != nullptr) + { + shellLADSPAUIDToCreate = desc.uid; + + result = new LADSPAPluginInstance (module); + + if (result->plugin != nullptr && result->isValid()) + result->initialise (sampleRate, blockSize); + else + result = nullptr; + } + + previousWorkingDirectory.setAsCurrentWorkingDirectory(); + } + + return result.release(); +} + +bool LADSPAPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) +{ + const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); + return f.existsAsFile() && f.hasFileExtension (".so"); +} + +String LADSPAPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) +{ + return fileOrIdentifier; +} + +bool LADSPAPluginFormat::pluginNeedsRescanning (const PluginDescription& desc) +{ + return File (desc.fileOrIdentifier).getLastModificationTime() != desc.lastFileModTime; +} + +bool LADSPAPluginFormat::doesPluginStillExist (const PluginDescription& desc) +{ + return File::createFileWithoutCheckingPath (desc.fileOrIdentifier).exists(); +} + +StringArray LADSPAPluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive) +{ + StringArray results; + + for (int j = 0; j < directoriesToSearch.getNumPaths(); ++j) + recursiveFileSearch (results, directoriesToSearch[j], recursive); + + return results; +} + +void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive) +{ + DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories); + + while (iter.next()) + { + const File f (iter.getFile()); + bool isPlugin = false; + + if (fileMightContainThisPluginType (f.getFullPathName())) + { + isPlugin = true; + results.add (f.getFullPathName()); + } + + if (recursive && (! isPlugin) && f.isDirectory()) + recursiveFileSearch (results, f, true); + } +} + +FileSearchPath LADSPAPluginFormat::getDefaultLocationsToSearch() +{ + return FileSearchPath (SystemStats::getEnvironmentVariable ("LADSPA_PATH", + "/usr/lib/ladspa;/usr/local/lib/ladspa;~/.ladspa") + .replace (":", ";")); +} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h new file mode 100644 index 0000000000..21d3167723 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h @@ -0,0 +1,57 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if (JUCE_PLUGINHOST_LADSPA && JUCE_LINUX) || DOXYGEN + +//============================================================================== +/** + Implements a plugin format manager for LADSPA plugins. +*/ +class JUCE_API LADSPAPluginFormat : public AudioPluginFormat +{ +public: + //============================================================================== + LADSPAPluginFormat(); + ~LADSPAPluginFormat(); + + //============================================================================== + String getName() const override { return "LADSPA"; } + void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; + AudioPluginInstance* createInstanceFromDescription (const PluginDescription&, double, int) override; + bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; + String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; + bool pluginNeedsRescanning (const PluginDescription&) override; + StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive) override; + bool doesPluginStillExist (const PluginDescription&) override; + FileSearchPath getDefaultLocationsToSearch() override; + bool canScanForPlugins() const override { return true; } + +private: + void recursiveFileSearch (StringArray&, const File&, bool recursive); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAPluginFormat) +}; + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h new file mode 100644 index 0000000000..d7e66cdc89 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -0,0 +1,420 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_VST3COMMON_H_INCLUDED +#define JUCE_VST3COMMON_H_INCLUDED + +//============================================================================== +#define JUCE_DECLARE_VST3_COM_REF_METHODS \ + Steinberg::uint32 PLUGIN_API addRef() override { return (Steinberg::uint32) ++refCount; } \ + Steinberg::uint32 PLUGIN_API release() override { const int r = --refCount; if (r == 0) delete this; return (Steinberg::uint32) r; } + +#define JUCE_DECLARE_VST3_COM_QUERY_METHODS \ + Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID, void** obj) override \ + { \ + jassertfalse; \ + *obj = nullptr; \ + return Steinberg::kNotImplemented; \ + } + +static bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexcept +{ + return std::memcmp (a, b, sizeof (Steinberg::TUID)) == 0; +} + +#define TEST_FOR_AND_RETURN_IF_VALID(iidToTest, ClassType) \ + if (doUIDsMatch (iidToTest, ClassType::iid)) \ + { \ + addRef(); \ + *obj = dynamic_cast (this); \ + return Steinberg::kResultOk; \ + } + +#define TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID(iidToTest, CommonClassType, SourceClassType) \ + if (doUIDsMatch (iidToTest, CommonClassType::iid)) \ + { \ + addRef(); \ + *obj = (CommonClassType*) static_cast (this); \ + return Steinberg::kResultOk; \ + } + +//============================================================================== +static juce::String toString (const Steinberg::char8* string) noexcept { return juce::String (string); } +static juce::String toString (const Steinberg::char16* string) noexcept { return juce::String (juce::CharPointer_UTF16 ((juce::CharPointer_UTF16::CharType*) string)); } + +// NB: The casts are handled by a Steinberg::UString operator +static juce::String toString (const Steinberg::UString128& string) noexcept { return toString (static_cast (string)); } +static juce::String toString (const Steinberg::UString256& string) noexcept { return toString (static_cast (string)); } + +static void toString128 (Steinberg::Vst::String128 result, const juce::String& source) +{ + Steinberg::UString (result, 128).fromAscii (source.toUTF8()); +} + +static Steinberg::Vst::TChar* toString (const juce::String& source) noexcept +{ + return reinterpret_cast (source.toUTF16().getAddress()); +} + +#if JUCE_WINDOWS + static const Steinberg::FIDString defaultVST3WindowType = Steinberg::kPlatformTypeHWND; +#else + static const Steinberg::FIDString defaultVST3WindowType = Steinberg::kPlatformTypeNSView; +#endif + + +//============================================================================== +static Steinberg::Vst::SpeakerArrangement getArrangementForBus (Steinberg::Vst::IAudioProcessor* processor, + bool isInput, int busIndex) +{ + Steinberg::Vst::SpeakerArrangement arrangement = Steinberg::Vst::SpeakerArr::kEmpty; + + if (processor != nullptr) + processor->getBusArrangement (isInput ? Steinberg::Vst::kInput : Steinberg::Vst::kOutput, + (Steinberg::int32) busIndex, arrangement); + + return arrangement; +} + +/** For the sake of simplicity, there can only be 1 arrangement type per channel count. + i.e.: 4 channels == k31Cine OR k40Cine +*/ +static Steinberg::Vst::SpeakerArrangement getArrangementForNumChannels (int numChannels) noexcept +{ + using namespace Steinberg::Vst::SpeakerArr; + + switch (numChannels) + { + case 0: return kEmpty; + case 1: return kMono; + case 2: return kStereo; + case 3: return k30Cine; + case 4: return k31Cine; + case 5: return k50; + case 6: return k51; + case 7: return k61Cine; + case 8: return k71CineFullFront; + case 9: return k90; + case 10: return k91; + case 11: return k101; + case 12: return k111; + case 13: return k130; + case 14: return k131; + case 24: return (Steinberg::Vst::SpeakerArrangement) 1929904127; // k222 + default: break; + } + + jassert (numChannels >= 0); + + juce::BigInteger bi; + bi.setRange (0, jmin (numChannels, (int) (sizeof (Steinberg::Vst::SpeakerArrangement) * 8)), true); + return (Steinberg::Vst::SpeakerArrangement) bi.toInt64(); +} + +//============================================================================== +template +class ComSmartPtr +{ +public: + ComSmartPtr() noexcept : source (nullptr) {} + ComSmartPtr (ObjectType* object, bool autoAddRef = true) noexcept : source (object) { if (source != nullptr && autoAddRef) source->addRef(); } + ComSmartPtr (const ComSmartPtr& other) noexcept : source (other.source) { if (source != nullptr) source->addRef(); } + ~ComSmartPtr() { if (source != nullptr) source->release(); } + + operator ObjectType*() const noexcept { return source; } + ObjectType* get() const noexcept { return source; } + ObjectType& operator*() const noexcept { return *source; } + ObjectType* operator->() const noexcept { return source; } + + ComSmartPtr& operator= (const ComSmartPtr& other) { return operator= (other.source); } + + ComSmartPtr& operator= (ObjectType* const newObjectToTakePossessionOf) + { + ComSmartPtr p (newObjectToTakePossessionOf); + std::swap (p.source, source); + return *this; + } + + bool operator== (ObjectType* const other) noexcept { return source == other; } + bool operator!= (ObjectType* const other) noexcept { return source != other; } + + bool loadFrom (Steinberg::FUnknown* o) + { + *this = nullptr; + return o != nullptr && o->queryInterface (ObjectType::iid, (void**) &source) == Steinberg::kResultOk; + } + + bool loadFrom (Steinberg::IPluginFactory* factory, const Steinberg::TUID& uuid) + { + jassert (factory != nullptr); + *this = nullptr; + return factory->createInstance (uuid, ObjectType::iid, (void**) &source) == Steinberg::kResultOk; + } + +private: + ObjectType* source; +}; + +//============================================================================== +class MidiEventList : public Steinberg::Vst::IEventList +{ +public: + MidiEventList() {} + virtual ~MidiEventList() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + //============================================================================== + void clear() + { + events.clearQuick(); + } + + Steinberg::int32 PLUGIN_API getEventCount() override + { + return (Steinberg::int32) events.size(); + } + + // NB: This has to cope with out-of-range indexes from some plugins. + Steinberg::tresult PLUGIN_API getEvent (Steinberg::int32 index, Steinberg::Vst::Event& e) override + { + if (isPositiveAndBelow ((int) index, events.size())) + { + e = events.getReference ((int) index); + return Steinberg::kResultTrue; + } + + return Steinberg::kResultFalse; + } + + Steinberg::tresult PLUGIN_API addEvent (Steinberg::Vst::Event& e) override + { + events.add (e); + return Steinberg::kResultTrue; + } + + //============================================================================== + static void toMidiBuffer (MidiBuffer& result, Steinberg::Vst::IEventList& eventList) + { + const int32 numEvents = eventList.getEventCount(); + + for (Steinberg::int32 i = 0; i < numEvents; ++i) + { + Steinberg::Vst::Event e; + + if (eventList.getEvent (i, e) == Steinberg::kResultOk) + { + switch (e.type) + { + case Steinberg::Vst::Event::kNoteOnEvent: + result.addEvent (MidiMessage::noteOn (createSafeChannel (e.noteOn.channel), + createSafeNote (e.noteOn.pitch), + (Steinberg::uint8) denormaliseToMidiValue (e.noteOn.velocity)), + e.sampleOffset); + break; + + case Steinberg::Vst::Event::kNoteOffEvent: + result.addEvent (MidiMessage::noteOff (createSafeChannel (e.noteOff.channel), + createSafeNote (e.noteOff.pitch), + (Steinberg::uint8) denormaliseToMidiValue (e.noteOff.velocity)), + e.sampleOffset); + break; + + case Steinberg::Vst::Event::kPolyPressureEvent: + result.addEvent (MidiMessage::aftertouchChange (createSafeChannel (e.polyPressure.channel), + createSafeNote (e.polyPressure.pitch), + denormaliseToMidiValue (e.polyPressure.pressure)), + e.sampleOffset); + break; + + case Steinberg::Vst::Event::kDataEvent: + result.addEvent (MidiMessage::createSysExMessage (e.data.bytes, e.data.size), + e.sampleOffset); + break; + + default: + break; + } + } + } + } + + static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer) + { + MidiBuffer::Iterator iterator (midiBuffer); + MidiMessage msg; + int midiEventPosition = 0; + + enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once + int numEvents = 0; + + while (iterator.getNextEvent (msg, midiEventPosition)) + { + if (++numEvents > maxNumEvents) + break; + + Steinberg::Vst::Event e = { 0 }; + + if (msg.isNoteOn()) + { + e.type = Steinberg::Vst::Event::kNoteOnEvent; + e.noteOn.channel = createSafeChannel (msg.getChannel()); + e.noteOn.pitch = createSafeNote (msg.getNoteNumber()); + e.noteOn.velocity = normaliseMidiValue (msg.getVelocity()); + e.noteOn.length = 0; + e.noteOn.tuning = 0.0f; + e.noteOn.noteId = -1; + } + else if (msg.isNoteOff()) + { + e.type = Steinberg::Vst::Event::kNoteOffEvent; + e.noteOff.channel = createSafeChannel (msg.getChannel()); + e.noteOff.pitch = createSafeNote (msg.getNoteNumber()); + e.noteOff.velocity = normaliseMidiValue (msg.getVelocity()); + e.noteOff.tuning = 0.0f; + e.noteOff.noteId = -1; + } + else if (msg.isSysEx()) + { + e.type = Steinberg::Vst::Event::kDataEvent; + e.data.bytes = msg.getSysExData(); + e.data.size = msg.getSysExDataSize(); + e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx; + } + else if (msg.isAftertouch()) + { + e.type = Steinberg::Vst::Event::kPolyPressureEvent; + e.polyPressure.channel = createSafeChannel (msg.getChannel()); + e.polyPressure.pitch = createSafeNote (msg.getNoteNumber()); + e.polyPressure.pressure = normaliseMidiValue (msg.getAfterTouchValue()); + } + else + { + continue; + } + + e.busIndex = 0; + e.sampleOffset = midiEventPosition; + + result.addEvent (e); + } + } + +private: + Array events; + Atomic refCount; + + static Steinberg::int16 createSafeChannel (int channel) noexcept { return (Steinberg::int16) jlimit (0, 15, channel - 1); } + static int createSafeChannel (Steinberg::int16 channel) noexcept { return (int) jlimit (1, 16, channel + 1); } + + static Steinberg::int16 createSafeNote (int note) noexcept { return (Steinberg::int16) jlimit (0, 127, note); } + static int createSafeNote (Steinberg::int16 note) noexcept { return jlimit (0, 127, (int) note); } + + static float normaliseMidiValue (int value) noexcept { return jlimit (0.0f, 1.0f, (float) value / 127.0f); } + static int denormaliseToMidiValue (float value) noexcept { return roundToInt (jlimit (0.0f, 127.0f, value * 127.0f)); } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiEventList) +}; + +//============================================================================== +namespace VST3BufferExchange +{ + typedef Array Bus; + typedef Array BusMap; + + /** Assigns a series of AudioSampleBuffer's channels to an AudioBusBuffers' + + @warning For speed, does not check the channel count and offsets + according to the AudioSampleBuffer + */ + void associateBufferTo (Steinberg::Vst::AudioBusBuffers& vstBuffers, + Bus& bus, + AudioSampleBuffer& buffer, + int numChannels, int channelStartOffset, + int sampleOffset = 0) + { + const int channelEnd = numChannels + channelStartOffset; + jassert (channelEnd >= 0 && channelEnd <= buffer.getNumChannels()); + + bus.clearQuick(); + + for (int i = channelStartOffset; i < channelEnd; ++i) + bus.add (buffer.getWritePointer (i, sampleOffset)); + + vstBuffers.channelBuffers32 = bus.getRawDataPointer(); + vstBuffers.numChannels = numChannels; + vstBuffers.silenceFlags = 0; + } + + static void mapArrangementToBusses (int& channelIndexOffset, int index, + Array& result, + BusMap& busMapToUse, Steinberg::Vst::SpeakerArrangement arrangement, + AudioSampleBuffer& source) + { + const int numChansForBus = BigInteger ((juce::int64) arrangement).countNumberOfSetBits(); + + if (index >= result.size()) + result.add (Steinberg::Vst::AudioBusBuffers()); + + if (index >= busMapToUse.size()) + busMapToUse.add (Bus()); + + if (numChansForBus > 0) + { + associateBufferTo (result.getReference (index), + busMapToUse.getReference (index), + source, numChansForBus, channelIndexOffset); + } + + channelIndexOffset += numChansForBus; + } + + static void mapBufferToBusses (Array& result, BusMap& busMapToUse, + const Array& arrangements, + AudioSampleBuffer& source) + { + int channelIndexOffset = 0; + + for (int i = 0; i < arrangements.size(); ++i) + mapArrangementToBusses (channelIndexOffset, i, result, busMapToUse, + arrangements.getUnchecked (i), source); + } + + static void mapBufferToBusses (Array& result, + Steinberg::Vst::IAudioProcessor& processor, + BusMap& busMapToUse, bool isInput, int numBusses, + AudioSampleBuffer& source) + { + int channelIndexOffset = 0; + + for (int i = 0; i < numBusses; ++i) + mapArrangementToBusses (channelIndexOffset, i, + result, busMapToUse, + getArrangementForBus (&processor, isInput, i), + source); + } +} + +#endif // JUCE_VST3COMMON_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h new file mode 100644 index 0000000000..ffb90e8664 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -0,0 +1,172 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_VST3HEADERS_H_INCLUDED +#define JUCE_VST3HEADERS_H_INCLUDED + +#undef Point +#undef Component + +// Wow, those Steinberg guys really don't worry too much about compiler warnings. +#if _MSC_VER + #pragma warning (disable: 4505) + #pragma warning (push, 0) + #pragma warning (disable: 4702) +#elif __clang__ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wnon-virtual-dtor" + #pragma clang diagnostic ignored "-Wreorder" + #pragma clang diagnostic ignored "-Wunsequenced" + #pragma clang diagnostic ignored "-Wint-to-pointer-cast" + #pragma clang diagnostic ignored "-Wunused-parameter" + #pragma clang diagnostic ignored "-Wconversion" + #pragma clang diagnostic ignored "-Woverloaded-virtual" + #pragma clang diagnostic ignored "-Wshadow" + #pragma clang diagnostic ignored "-Wdeprecated-register" +#endif + +/* These files come with the Steinberg VST3 SDK - to get them, you'll need to + visit the Steinberg website and agree to whatever is currently required to + get them. + + Then, you'll need to make sure your include path contains your "VST3 SDK" + directory (or whatever you've named it on your machine). The Introjucer has + a special box for setting this path. +*/ +#if JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + +//============================================================================== +namespace Steinberg +{ + /** Missing IIDs */ + DEF_CLASS_IID (IPluginBase) + DEF_CLASS_IID (IPlugView) + DEF_CLASS_IID (IPlugFrame) + DEF_CLASS_IID (IBStream) + DEF_CLASS_IID (ISizeableStream) + DEF_CLASS_IID (IPluginFactory) + DEF_CLASS_IID (IPluginFactory2) + DEF_CLASS_IID (IPluginFactory3) +} +#endif //JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY + +#if _MSC_VER + #pragma warning (pop) +#elif __clang__ + #pragma clang diagnostic pop +#endif + +//============================================================================== +#undef ASSERT +#undef WARNING +#undef PRINTSYSERROR +#undef DEBUGSTR +#undef DBPRT0 +#undef DBPRT1 +#undef DBPRT2 +#undef DBPRT3 +#undef DBPRT4 +#undef DBPRT5 +#undef min +#undef max +#undef MIN +#undef MAX +#undef calloc +#undef free +#undef malloc +#undef realloc +#undef NEW +#undef NEWVEC +#undef VERIFY +#undef VERIFY_IS +#undef VERIFY_NOT +#undef META_CREATE_FUNC +#undef CLASS_CREATE_FUNC +#undef SINGLE_CREATE_FUNC +#undef _META_CLASS +#undef _META_CLASS_IFACE +#undef _META_CLASS_SINGLE +#undef META_CLASS +#undef META_CLASS_IFACE +#undef META_CLASS_SINGLE +#undef SINGLETON +#undef OBJ_METHODS +#undef QUERY_INTERFACE +#undef LICENCE_UID +#undef BEGIN_FACTORY +#undef DEF_CLASS +#undef DEF_CLASS1 +#undef DEF_CLASS2 +#undef DEF_CLASS_W +#undef END_FACTORY +#undef Point +#undef Component + +#endif // JUCE_VST3HEADERS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp new file mode 100644 index 0000000000..a7416264c8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -0,0 +1,2517 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_VST3 + +} // namespace juce + +#if JucePlugin_Build_VST3 + #undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY + #define JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY 1 +#endif + +#include +#include "juce_VST3Headers.h" + +#undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY + +namespace juce +{ + +#include "juce_VST3Common.h" + +using namespace Steinberg; + +//============================================================================== +struct VST3Classes +{ + +#ifndef JUCE_VST3_DEBUGGING + #define JUCE_VST3_DEBUGGING 0 +#endif + +#if JUCE_VST3_DEBUGGING + #define VST3_DBG(a) Logger::writeToLog (a); +#else + #define VST3_DBG(a) +#endif + +#if JUCE_DEBUG +static int warnOnFailure (int result) +{ + const char* message = "Unknown result!"; + + switch (result) + { + case kResultOk: return result; + case kNotImplemented: message = "kNotImplemented"; break; + case kNoInterface: message = "kNoInterface"; break; + case kResultFalse: message = "kResultFalse"; break; + case kInvalidArgument: message = "kInvalidArgument"; break; + case kInternalError: message = "kInternalError"; break; + case kNotInitialized: message = "kNotInitialized"; break; + case kOutOfMemory: message = "kOutOfMemory"; break; + default: break; + } + + DBG (message); + return result; +} +#else + #define warnOnFailure(x) x +#endif + +//============================================================================== +static int getHashForTUID (const TUID& tuid) noexcept +{ + int value = 0; + + for (int i = 0; i < numElementsInArray (tuid); ++i) + value = (value * 31) + tuid[i]; + + return value; +} + +template +static void fillDescriptionWith (PluginDescription& description, ObjectType& object) +{ + description.version = toString (object.version).trim(); + description.category = toString (object.subCategories).trim(); + + if (description.manufacturerName.trim().isEmpty()) + description.manufacturerName = toString (object.vendor).trim(); +} + +static void createPluginDescription (PluginDescription& description, + const File& pluginFile, const String& company, const String& name, + const PClassInfo& info, PClassInfo2* info2, PClassInfoW* infoW, + int numInputs, int numOutputs) +{ + description.fileOrIdentifier = pluginFile.getFullPathName(); + description.lastFileModTime = pluginFile.getLastModificationTime(); + description.manufacturerName = company; + description.name = name; + description.descriptiveName = name; + description.pluginFormatName = "VST3"; + description.numInputChannels = numInputs; + description.numOutputChannels = numOutputs; + description.uid = getHashForTUID (info.cid); + + if (infoW != nullptr) fillDescriptionWith (description, *infoW); + else if (info2 != nullptr) fillDescriptionWith (description, *info2); + + if (description.category.isEmpty()) + description.category = toString (info.category).trim(); + + description.isInstrument = description.category.containsIgnoreCase ("Instrument"); // This seems to be the only way to find that out! ARGH! +} + +static int getNumSingleDirectionBussesFor (Vst::IComponent* component, + bool checkInputs, + bool checkAudioChannels) +{ + jassert (component != nullptr); + + return (int) component->getBusCount (checkAudioChannels ? Vst::kAudio : Vst::kEvent, + checkInputs ? Vst::kInput : Vst::kOutput); +} + +/** Gives the total number of channels for a particular type of bus direction and media type */ +static int getNumSingleDirectionChannelsFor (Vst::IComponent* component, + bool checkInputs, + bool checkAudioChannels) +{ + jassert (component != nullptr); + + const Vst::BusDirections direction = checkInputs ? Vst::kInput : Vst::kOutput; + const Vst::MediaTypes mediaType = checkAudioChannels ? Vst::kAudio : Vst::kEvent; + const Steinberg::int32 numBuses = component->getBusCount (mediaType, direction); + + int numChannels = 0; + + for (Steinberg::int32 i = numBuses; --i >= 0;) + { + Vst::BusInfo busInfo; + warnOnFailure (component->getBusInfo (mediaType, direction, i, busInfo)); + numChannels += (int) busInfo.channelCount; + } + + return numChannels; +} + +static void setStateForAllBussesOfType (Vst::IComponent* component, + bool state, + bool activateInputs, + bool activateAudioChannels) +{ + jassert (component != nullptr); + + const Vst::BusDirections direction = activateInputs ? Vst::kInput : Vst::kOutput; + const Vst::MediaTypes mediaType = activateAudioChannels ? Vst::kAudio : Vst::kEvent; + const Steinberg::int32 numBuses = component->getBusCount (mediaType, direction); + + for (Steinberg::int32 i = numBuses; --i >= 0;) + warnOnFailure (component->activateBus (mediaType, direction, i, state)); +} + +//============================================================================== +/** Assigns a complete AudioSampleBuffer's channels to an AudioBusBuffers' */ +static void associateWholeBufferTo (Vst::AudioBusBuffers& vstBuffers, AudioSampleBuffer& buffer) noexcept +{ + vstBuffers.channelBuffers32 = buffer.getArrayOfWritePointers(); + vstBuffers.numChannels = buffer.getNumChannels(); + vstBuffers.silenceFlags = 0; +} + +//============================================================================== +static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playHead, double sampleRate) +{ + jassert (sampleRate > 0.0); //Must always be valid, as stated by the VST3 SDK + + using namespace Vst; + + zerostruct (context); + context.sampleRate = sampleRate; + + if (playHead != nullptr) + { + AudioPlayHead::CurrentPositionInfo position; + playHead->getCurrentPosition (position); + + context.projectTimeSamples = position.timeInSamples; //Must always be valid, as stated by the VST3 SDK + context.projectTimeMusic = position.timeInSeconds; //Does not always need to be valid... + context.tempo = position.bpm; + context.timeSigNumerator = position.timeSigNumerator; + context.timeSigDenominator = position.timeSigDenominator; + context.barPositionMusic = position.ppqPositionOfLastBarStart; + context.cycleStartMusic = position.ppqLoopStart; + context.cycleEndMusic = position.ppqLoopEnd; + + switch (position.frameRate) + { + case AudioPlayHead::fps24: context.frameRate.framesPerSecond = 24; break; + case AudioPlayHead::fps25: context.frameRate.framesPerSecond = 25; break; + case AudioPlayHead::fps30: context.frameRate.framesPerSecond = 30; break; + + case AudioPlayHead::fps2997: + case AudioPlayHead::fps2997drop: + case AudioPlayHead::fps30drop: + { + context.frameRate.framesPerSecond = 30; + context.frameRate.flags = FrameRate::kDropRate; + + if (position.frameRate == AudioPlayHead::fps2997drop) + context.frameRate.flags |= FrameRate::kPullDownRate; + } + break; + + case AudioPlayHead::fpsUnknown: break; + + default: jassertfalse; break; // New frame rate? + } + + if (position.isPlaying) context.state |= ProcessContext::kPlaying; + if (position.isRecording) context.state |= ProcessContext::kRecording; + if (position.isLooping) context.state |= ProcessContext::kCycleActive; + } + else + { + context.tempo = 120.0; + context.frameRate.framesPerSecond = 30; + context.timeSigNumerator = 4; + context.timeSigDenominator = 4; + } + + if (context.projectTimeMusic >= 0.0) context.state |= ProcessContext::kProjectTimeMusicValid; + if (context.barPositionMusic >= 0.0) context.state |= ProcessContext::kBarPositionValid; + if (context.tempo > 0.0) context.state |= ProcessContext::kTempoValid; + if (context.frameRate.framesPerSecond > 0) context.state |= ProcessContext::kSmpteValid; + + if (context.cycleStartMusic >= 0.0 + && context.cycleEndMusic > 0.0 + && context.cycleEndMusic > context.cycleStartMusic) + { + context.state |= ProcessContext::kCycleValid; + } + + if (context.timeSigNumerator > 0 && context.timeSigDenominator > 0) + context.state |= ProcessContext::kTimeSigValid; +} + +//============================================================================== +/** Get a list of speaker arrangements as per their speaker names + + (e.g.: 2 regular channels, aliased as 'kStringStereoS', is "L R") +*/ +static StringArray getSpeakerArrangements() +{ + using namespace Vst::SpeakerArr; + + const Vst::CString arrangements[] = + { + kStringMonoS, kStringStereoS, kStringStereoRS, kStringStereoCS, + kStringStereoSS, kStringStereoCLfeS, kString30CineS, kString30MusicS, + kString31CineS, kString31MusicS, kString40CineS, kString40MusicS, + kString41CineS, kString41MusicS, kString50S, kString51S, + kString60CineS, kString60MusicS, kString61CineS, kString61MusicS, + kString70CineS, kString70MusicS, kString71CineS, kString71MusicS, + kString80CineS, kString80MusicS, kString81CineS, kString81MusicS, + kString80CubeS, kStringBFormat1stOrderS, kString71CineTopCenterS, + kString71CineCenterHighS, kString71CineFrontHighS, kString71CineSideHighS, + kString71CineFullRearS, kString90S, kString91S, + kString100S, kString101S, kString110S, kString111S, + kString130S, kString131S, kString102S, kString122S, + nullptr + }; + + return StringArray (arrangements); +} + +/** Get a list of speaker arrangements as per their named configurations + + (e.g.: 2 regular channels, aliased as 'kStringStereoS', is "L R") +*/ +static StringArray getNamedSpeakerArrangements() +{ + using namespace Vst::SpeakerArr; + + const Vst::CString arrangements[] = + { + kStringEmpty, kStringMono, kStringStereo, kStringStereoR, + kStringStereoC, kStringStereoSide, kStringStereoCLfe, kString30Cine, + kString30Music, kString31Cine, kString31Music, kString40Cine, + kString40Music, kString41Cine, kString41Music, kString50, + kString51, kString60Cine, kString60Music, kString61Cine, + kString61Music, kString70Cine, kString70Music, kString71Cine, + kString71Music, kString71CineTopCenter, kString71CineCenterHigh, + kString71CineFrontHigh, kString71CineSideHigh, kString71CineFullRear, + kString80Cine, kString80Music, kString80Cube, kString81Cine, + kString81Music, kString102, kString122, kString90, + kString91, kString100, kString101, kString110, + kString111, kString130, kString131, + nullptr + }; + + return StringArray (arrangements); +} + +static Vst::SpeakerArrangement getSpeakerArrangementFrom (const String& string) +{ + return Vst::SpeakerArr::getSpeakerArrangementFromString (string.toUTF8()); +} + +//============================================================================== +static StringArray getPluginEffectCategories() +{ + using namespace Vst::PlugType; + + const Vst::CString categories[] = + { + kFxAnalyzer, kFxDelay, kFxDistortion, kFxDynamics, + kFxEQ, kFxFilter, kFx, kFxInstrument, + kFxInstrumentExternal, kFxSpatial, kFxGenerator, kFxMastering, + kFxModulation, kFxPitchShift, kFxRestoration, kFxReverb, + kFxSurround, kFxTools, kSpatial, kSpatialFx, + nullptr + }; + + return StringArray (categories); +} + +static StringArray getPluginInstrumentCategories() +{ + using namespace Vst::PlugType; + + const Vst::CString categories[] = + { + kInstrumentSynthSampler, kInstrumentDrum, + kInstrumentSampler, kInstrumentSynth, + kInstrumentExternal, kFxInstrument, + kFxInstrumentExternal, kFxSpatial, + kFxGenerator, + nullptr + }; + + return StringArray (categories); +} + +//============================================================================== +class VST3PluginInstance; + +class VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0 + public Vst::IComponentHandler2, // From VST V3.1.0 (a very well named class, of course!) + public Vst::IComponentHandler3, // From VST V3.5.0 (also very well named!) + public Vst::IContextMenuTarget, + public Vst::IHostApplication, + public Vst::IParamValueQueue, + public Vst::IUnitHandler +{ +public: + VST3HostContext (VST3PluginInstance* pluginInstance) : owner (pluginInstance) + { + appName = File::getSpecialLocation (File::currentApplicationFile).getFileNameWithoutExtension(); + attributeList = new AttributeList (this); + } + + virtual ~VST3HostContext() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + + FUnknown* getFUnknown() { return static_cast (this); } + + static bool hasFlag (Steinberg::int32 source, Steinberg::int32 flag) noexcept + { + return (source & flag) == flag; + } + + //============================================================================== + tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override + { + const int index = getIndexOfParamID (paramID); + + if (index < 0) + return kResultFalse; + + owner->beginParameterChangeGesture (index); + return kResultTrue; + } + + tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override + { + const int index = getIndexOfParamID (paramID); + + if (index < 0) + return kResultFalse; + + owner->sendParamChangeMessageToListeners (index, (float) valueNormalized); + return owner->editController->setParamNormalized (paramID, valueNormalized); + } + + tresult PLUGIN_API endEdit (Vst::ParamID paramID) override + { + const int index = getIndexOfParamID (paramID); + + if (index < 0) + return kResultFalse; + + owner->endParameterChangeGesture (index); + return kResultTrue; + } + + tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override + { + if (owner != nullptr) + { + if (hasFlag (flags, Vst::kReloadComponent)) + owner->reset(); + + if (hasFlag (flags, Vst::kIoChanged)) + { + const double sampleRate = owner->getSampleRate(); + const int blockSize = owner->getBlockSize(); + + owner->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0, + blockSize > 0 ? blockSize : 1024); + } + + if (hasFlag (flags, Vst::kLatencyChanged)) + if (owner->processor != nullptr) + owner->setLatencySamples (jmax (0, (int) owner->processor->getLatencySamples())); + + owner->updateHostDisplay(); + return kResultTrue; + } + + jassertfalse; + return kResultFalse; + } + + //============================================================================== + tresult PLUGIN_API setDirty (TBool) override + { + return kResultFalse; + } + + tresult PLUGIN_API requestOpenEditor (FIDString name) override + { + (void) name; + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API startGroupEdit() override + { + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API finishGroupEdit() override + { + jassertfalse; + return kResultFalse; + } + + //============================================================================== + class ContextMenu : public Vst::IContextMenu + { + public: + ContextMenu (VST3PluginInstance& pluginInstance) : owner (pluginInstance) {} + virtual ~ContextMenu() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + Steinberg::int32 PLUGIN_API getItemCount() override { return (Steinberg::int32) items.size(); } + + tresult PLUGIN_API addItem (const Item& item, IContextMenuTarget* target) override + { + jassert (target != nullptr); + + ItemAndTarget newItem; + newItem.item = item; + newItem.target = target; + + items.add (newItem); + return kResultOk; + } + + tresult PLUGIN_API removeItem (const Item& toRemove, IContextMenuTarget* target) override + { + for (int i = items.size(); --i >= 0;) + { + ItemAndTarget& item = items.getReference(i); + + if (item.item.tag == toRemove.tag && item.target == target) + items.remove (i); + } + + return kResultOk; + } + + tresult PLUGIN_API getItem (Steinberg::int32 tag, Item& result, IContextMenuTarget** target) override + { + for (int i = 0; i < items.size(); ++i) + { + const ItemAndTarget& item = items.getReference(i); + + if (item.item.tag == tag) + { + result = item.item; + + if (target != nullptr) + *target = item.target; + + return kResultTrue; + } + } + + zerostruct (result); + return kResultFalse; + } + + tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override + { + Array subItemStack; + OwnedArray menuStack; + PopupMenu* topLevelMenu = menuStack.add (new PopupMenu()); + + for (int i = 0; i < items.size(); ++i) + { + const Item& item = items.getReference (i).item; + + PopupMenu* menuToUse = menuStack.getLast(); + + if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled)) + { + subItemStack.add (&item); + menuStack.add (new PopupMenu()); + } + else if (hasFlag (item.flags, Item::kIsGroupEnd)) + { + if (const Item* subItem = subItemStack.getLast()) + { + if (PopupMenu* m = menuStack [menuStack.size() - 2]) + m->addSubMenu (toString (subItem->name), *menuToUse, + ! hasFlag (subItem->flags, Item::kIsDisabled), + nullptr, + hasFlag (subItem->flags, Item::kIsChecked)); + + menuStack.removeLast (1); + subItemStack.removeLast (1); + } + } + else if (hasFlag (item.flags, Item::kIsSeparator)) + { + menuToUse->addSeparator(); + } + else + { + menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement, + toString (item.name), + ! hasFlag (item.flags, Item::kIsDisabled), + hasFlag (item.flags, Item::kIsChecked)); + } + } + + PopupMenu::Options options; + + if (AudioProcessorEditor* ed = owner.getActiveEditor()) + options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1)); + + #if JUCE_MODAL_LOOPS_PERMITTED + // Unfortunately, Steinberg's docs explicitly say this should be modal.. + handleResult (topLevelMenu->showMenu (options)); + #else + topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, ComSmartPtr (this))); + #endif + + return kResultOk; + } + + #if ! JUCE_MODAL_LOOPS_PERMITTED + static void menuFinished (int modalResult, ComSmartPtr menu) { menu->handleResult (modalResult); } + #endif + + private: + enum { zeroTagReplacement = 0x7fffffff }; + + Atomic refCount; + VST3PluginInstance& owner; + + struct ItemAndTarget + { + Item item; + ComSmartPtr target; + }; + + Array items; + + void handleResult (int result) + { + if (result == 0) + return; + + if (result == zeroTagReplacement) + result = 0; + + for (int i = 0; i < items.size(); ++i) + { + const ItemAndTarget& item = items.getReference(i); + + if ((int) item.item.tag == result) + { + if (item.target != nullptr) + item.target->executeMenuItem ((Steinberg::int32) result); + + break; + } + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContextMenu) + }; + + Vst::IContextMenu* PLUGIN_API createContextMenu (IPlugView*, const Vst::ParamID*) override + { + if (owner != nullptr) + return new ContextMenu (*owner); + + return nullptr; + } + + tresult PLUGIN_API executeMenuItem (Steinberg::int32) override + { + jassertfalse; + return kResultFalse; + } + + //============================================================================== + tresult PLUGIN_API getName (Vst::String128 name) override + { + Steinberg::String str (appName.toUTF8()); + str.copyTo (name, 0, 127); + return kResultOk; + } + + tresult PLUGIN_API createInstance (TUID cid, TUID iid, void** obj) override + { + *obj = nullptr; + + if (! doUIDsMatch (cid, iid)) + { + jassertfalse; + return kInvalidArgument; + } + + if (doUIDsMatch (cid, Vst::IMessage::iid) && doUIDsMatch (iid, Vst::IMessage::iid)) + { + ComSmartPtr m (new Message (*this, attributeList)); + messageQueue.add (m); + m->addRef(); + *obj = m; + return kResultOk; + } + else if (doUIDsMatch (cid, Vst::IAttributeList::iid) && doUIDsMatch (iid, Vst::IAttributeList::iid)) + { + ComSmartPtr l (new AttributeList (this)); + l->addRef(); + *obj = l; + return kResultOk; + } + + jassertfalse; + return kNotImplemented; + } + + //============================================================================== + Vst::ParamID PLUGIN_API getParameterId() override + { + jassertfalse; + return 0; + } + + Steinberg::int32 PLUGIN_API getPointCount() override + { + jassertfalse; + return 0; + } + + tresult PLUGIN_API getPoint (Steinberg::int32, Steinberg::int32&, Vst::ParamValue&) override + { + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API addPoint (Steinberg::int32, Vst::ParamValue, Steinberg::int32&) override + { + jassertfalse; + return kResultFalse; + } + + //============================================================================== + tresult PLUGIN_API notifyUnitSelection (Vst::UnitID) override + { + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override + { + jassertfalse; + return kResultFalse; + } + + //============================================================================== + tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override + { + if (doUIDsMatch (iid, Vst::IAttributeList::iid)) + { + *obj = attributeList.get(); + return kResultOk; + } + + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler2) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler3) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IContextMenuTarget) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IHostApplication) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IParamValueQueue) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IUnitHandler) + TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (iid, FUnknown, Vst::IComponentHandler) + + *obj = nullptr; + return kNotImplemented; + } + +private: + //============================================================================== + VST3PluginInstance* const owner; + Atomic refCount; + String appName; + + typedef std::map ParamMapType; + ParamMapType paramToIndexMap; + + int getIndexOfParamID (Vst::ParamID paramID) + { + if (owner == nullptr || owner->editController == nullptr) + return -1; + + int result = getMappedParamID (paramID); + + if (result < 0) + { + const int numParams = owner->editController->getParameterCount(); + + for (int i = 0; i < numParams; ++i) + { + Vst::ParameterInfo paramInfo; + owner->editController->getParameterInfo (i, paramInfo); + paramToIndexMap[paramInfo.id] = i; + } + + result = getMappedParamID (paramID); + } + + return result; + } + + int getMappedParamID (Vst::ParamID paramID) + { + const ParamMapType::iterator it (paramToIndexMap.find (paramID)); + return it != paramToIndexMap.end() ? it->second : -1; + } + + //============================================================================== + class Message : public Vst::IMessage + { + public: + Message (VST3HostContext& o, Vst::IAttributeList* list) + : owner (o), attributeList (list) + { + } + + Message (VST3HostContext& o, Vst::IAttributeList* list, FIDString id) + : owner (o), attributeList (list), messageId (toString (id)) + { + } + + Message (VST3HostContext& o, Vst::IAttributeList* list, FIDString id, const var& v) + : value (v), owner (o), attributeList (list), messageId (toString (id)) + { + } + + virtual ~Message() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + FIDString PLUGIN_API getMessageID() override { return messageId.toRawUTF8(); } + void PLUGIN_API setMessageID (FIDString id) override { messageId = toString (id); } + Vst::IAttributeList* PLUGIN_API getAttributes() override { return attributeList; } + + var value; + + private: + VST3HostContext& owner; + ComSmartPtr attributeList; + String messageId; + Atomic refCount; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Message) + }; + + Array, CriticalSection> messageQueue; + + //============================================================================== + class AttributeList : public Vst::IAttributeList + { + public: + AttributeList (VST3HostContext* o) : owner (o) {} + virtual ~AttributeList() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + //============================================================================== + tresult PLUGIN_API setInt (AttrID id, Steinberg::int64 value) override + { + jassert (id != nullptr); + + if (! setValueForId (id, value)) + owner->messageQueue.add (ComSmartPtr (new Message (*owner, this, id, value))); + + return kResultTrue; + } + + tresult PLUGIN_API setFloat (AttrID id, double value) override + { + jassert (id != nullptr); + + if (! setValueForId (id, value)) + owner->messageQueue.add (ComSmartPtr (new Message (*owner, this, id, value))); + + return kResultTrue; + } + + tresult PLUGIN_API setString (AttrID id, const Vst::TChar* string) override + { + jassert (id != nullptr); + jassert (string != nullptr); + + const String text (toString (string)); + + if (! setValueForId (id, text)) + owner->messageQueue.add (ComSmartPtr (new Message (*owner, this, id, text))); + + return kResultTrue; + } + + tresult PLUGIN_API setBinary (AttrID id, const void* data, Steinberg::uint32 size) override + { + jassert (id != nullptr); + jassert (data != nullptr && size > 0); + + MemoryBlock block (data, (size_t) size); + + if (! setValueForId (id, block)) + owner->messageQueue.add (ComSmartPtr (new Message (*owner, this, id, block))); + + return kResultTrue; + } + + //============================================================================== + tresult PLUGIN_API getInt (AttrID id, Steinberg::int64& result) override + { + jassert (id != nullptr); + + if (fetchValueForId (id, result)) + return kResultTrue; + + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API getFloat (AttrID id, double& result) override + { + jassert (id != nullptr); + + if (fetchValueForId (id, result)) + return kResultTrue; + + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API getString (AttrID id, Vst::TChar* result, Steinberg::uint32 length) override + { + jassert (id != nullptr); + + String stringToFetch; + if (fetchValueForId (id, stringToFetch)) + { + Steinberg::String str (stringToFetch.toRawUTF8()); + str.copyTo (result, 0, (Steinberg::int32) jmin (length, (Steinberg::uint32) std::numeric_limits::max())); + + return kResultTrue; + } + + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API getBinary (AttrID id, const void*& data, Steinberg::uint32& size) override + { + jassert (id != nullptr); + + for (int i = owner->messageQueue.size(); --i >= 0;) + { + Message* const message = owner->messageQueue.getReference (i); + + if (std::strcmp (message->getMessageID(), id) == 0) + { + if (MemoryBlock* binaryData = message->value.getBinaryData()) + { + data = binaryData->getData(); + size = (Steinberg::uint32) binaryData->getSize(); + return kResultTrue; + } + } + } + + return kResultFalse; + } + + private: + VST3HostContext* owner; + Atomic refCount; + + //============================================================================== + template + bool setValueForId (AttrID id, const Type& value) + { + jassert (id != nullptr); + + for (int i = owner->messageQueue.size(); --i >= 0;) + { + VST3HostContext::Message* const message = owner->messageQueue.getReference (i); + + if (std::strcmp (message->getMessageID(), id) == 0) + { + message->value = value; + return true; + } + } + + return false; // No message found with that Id + } + + template + bool fetchValueForId (AttrID id, Type& value) + { + jassert (id != nullptr); + + for (int i = owner->messageQueue.size(); --i >= 0;) + { + VST3HostContext::Message* const message = owner->messageQueue.getReference (i); + + if (std::strcmp (message->getMessageID(), id) == 0) + { + value = message->value; + return true; + } + } + + return false; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AttributeList) + }; + + ComSmartPtr attributeList; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3HostContext) +}; + +//============================================================================== +class DescriptionFactory +{ +public: + DescriptionFactory (VST3HostContext* host, IPluginFactory* pluginFactory) + : vst3HostContext (host), factory (pluginFactory) + { + jassert (pluginFactory != nullptr); + } + + virtual ~DescriptionFactory() {} + + Result findDescriptionsAndPerform (const File& file) + { + StringArray foundNames; + PFactoryInfo factoryInfo; + factory->getFactoryInfo (&factoryInfo); + const String companyName (toString (factoryInfo.vendor).trim()); + + Result result (Result::ok()); + + const Steinberg::int32 numClasses = factory->countClasses(); + + for (Steinberg::int32 i = 0; i < numClasses; ++i) + { + PClassInfo info; + factory->getClassInfo (i, &info); + + if (std::strcmp (info.category, kVstAudioEffectClass) != 0) + continue; + + const String name (toString (info.name).trim()); + + if (foundNames.contains (name, true)) + continue; + + ScopedPointer info2; + ScopedPointer infoW; + + { + ComSmartPtr pf2; + ComSmartPtr pf3; + + if (pf2.loadFrom (factory)) + { + info2 = new PClassInfo2(); + pf2->getClassInfo2 (i, info2); + } + + if (pf3.loadFrom (factory)) + { + infoW = new PClassInfoW(); + pf3->getClassInfoUnicode (i, infoW); + } + } + + foundNames.add (name); + + PluginDescription desc; + + { + ComSmartPtr component; + + if (component.loadFrom (factory, info.cid)) + { + if (component->initialize (vst3HostContext->getFUnknown()) == kResultOk) + { + const int numInputs = getNumSingleDirectionChannelsFor (component, true, true); + const int numOutputs = getNumSingleDirectionChannelsFor (component, false, true); + + createPluginDescription (desc, file, companyName, name, + info, info2, infoW, numInputs, numOutputs); + + component->terminate(); + } + else + { + jassertfalse; + } + } + else + { + jassertfalse; + } + } + + result = performOnDescription (desc); + + if (result.failed()) + break; + } + + return result; + } + +protected: + virtual Result performOnDescription (PluginDescription& description) = 0; + +private: + ComSmartPtr vst3HostContext; + ComSmartPtr factory; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DescriptionFactory) +}; + +struct MatchingDescriptionFinder : public DescriptionFactory +{ + MatchingDescriptionFinder (VST3HostContext* host, IPluginFactory* pluginFactory, const PluginDescription& desc) + : DescriptionFactory (host, pluginFactory), description (desc) + { + } + + static const char* getSuccessString() noexcept { return "Found Description"; } + + Result performOnDescription (PluginDescription& desc) + { + if (description.isDuplicateOf (desc)) + return Result::fail (getSuccessString()); + + return Result::ok(); + } + +private: + const PluginDescription& description; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MatchingDescriptionFinder) +}; + +struct DescriptionLister : public DescriptionFactory +{ + DescriptionLister (VST3HostContext* host, IPluginFactory* pluginFactory) + : DescriptionFactory (host, pluginFactory) + { + } + + Result performOnDescription (PluginDescription& desc) + { + list.add (new PluginDescription (desc)); + return Result::ok(); + } + + OwnedArray list; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DescriptionLister) +}; + +//============================================================================== +struct DLLHandle +{ + DLLHandle (const String& modulePath) + : factory (nullptr) + { + if (modulePath.trim().isNotEmpty()) + open (modulePath); + } + + ~DLLHandle() + { + typedef bool (PLUGIN_API *ExitModuleFn) (); + + #if JUCE_WINDOWS + if (ExitModuleFn exitFn = (ExitModuleFn) getFunction ("ExitDll")) + exitFn(); + + releaseFactory(); + library.close(); + + #else + if (bundleRef != nullptr) + { + if (ExitModuleFn exitFn = (ExitModuleFn) getFunction ("bundleExit")) + exitFn(); + + releaseFactory(); + + CFRelease (bundleRef); + bundleRef = nullptr; + } + #endif + } + + void open (const PluginDescription& description) + { + #if JUCE_WINDOWS + jassert (description.fileOrIdentifier.isNotEmpty()); + jassert (File (description.fileOrIdentifier).existsAsFile()); + library.open (description.fileOrIdentifier); + #else + open (description.fileOrIdentifier); + #endif + } + + /** @note The factory should begin with a refCount of 1, + so don't increment the reference count + (ie: don't use a ComSmartPtr in here)! + Its lifetime will be handled by this DllHandle, + when such will be destroyed. + + @see releaseFactory + */ + IPluginFactory* JUCE_CALLTYPE getPluginFactory() + { + if (factory == nullptr) + if (GetFactoryProc proc = (GetFactoryProc) getFunction ("GetPluginFactory")) + factory = proc(); + + jassert (factory != nullptr); // The plugin NEEDS to provide a factory to be able to be called a VST3! + return factory; + } + + void* getFunction (const char* functionName) + { + #if JUCE_WINDOWS + return library.getFunction (functionName); + #else + if (bundleRef == nullptr) + return nullptr; + + CFStringRef name = String (functionName).toCFString(); + void* fn = CFBundleGetFunctionPointerForName (bundleRef, name); + CFRelease (name); + return fn; + #endif + } + +private: + IPluginFactory* factory; + + void releaseFactory() + { + if (factory != nullptr) + factory->release(); + } + + #if JUCE_WINDOWS + DynamicLibrary library; + + bool open (const String& filePath) + { + if (library.open (filePath)) + { + typedef bool (PLUGIN_API *InitModuleProc) (); + if (InitModuleProc proc = (InitModuleProc) getFunction ("InitDll")) + { + if (proc()) + return true; + } + else + { + return true; + } + + library.close(); + } + + return false; + } + + #else + CFBundleRef bundleRef; + + bool open (const String& filePath) + { + const File file (filePath); + const char* const utf8 = file.getFullPathName().toRawUTF8(); + + if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, (CFIndex) std::strlen (utf8), file.isDirectory())) + { + bundleRef = CFBundleCreate (kCFAllocatorDefault, url); + CFRelease (url); + + if (bundleRef != nullptr) + { + CFErrorRef error = nullptr; + + if (CFBundleLoadExecutableAndReturnError (bundleRef, &error)) + { + typedef bool (*BundleEntryProc)(CFBundleRef); + + if (BundleEntryProc proc = (BundleEntryProc) getFunction ("bundleEntry")) + { + if (proc (bundleRef)) + return true; + } + else + { + return true; + } + } + + if (error != nullptr) + { + if (CFStringRef failureMessage = CFErrorCopyFailureReason (error)) + { + DBG (String::fromCFString (failureMessage)); + CFRelease (failureMessage); + } + + CFRelease (error); + } + + CFRelease (bundleRef); + bundleRef = nullptr; + } + } + + return false; + } + #endif + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DLLHandle) +}; + +//============================================================================== +class VST3ModuleHandle : public ReferenceCountedObject +{ +public: + explicit VST3ModuleHandle (const File& pluginFile) : file (pluginFile) + { + getActiveModules().add (this); + } + + ~VST3ModuleHandle() + { + getActiveModules().removeFirstMatchingValue (this); + } + + /** + Since there is no apparent indication if a VST3 plugin is a shell or not, + we're stuck iterating through a VST3's factory, creating a description + for every housed plugin. + */ + static bool getAllDescriptionsForFile (OwnedArray& results, + const String& fileOrIdentifier) + { + DLLHandle tempModule (fileOrIdentifier); + + ComSmartPtr pluginFactory (tempModule.getPluginFactory()); + + if (pluginFactory != nullptr) + { + ComSmartPtr host (new VST3HostContext (nullptr)); + DescriptionLister lister (host, pluginFactory); + const Result result (lister.findDescriptionsAndPerform (File (fileOrIdentifier))); + + results.addCopiesOf (lister.list); + + return result.wasOk(); + } + + jassertfalse; + return false; + } + + //============================================================================== + typedef ReferenceCountedObjectPtr Ptr; + + static VST3ModuleHandle::Ptr findOrCreateModule (const File& file, const PluginDescription& description) + { + Array& activeModules = getActiveModules(); + + for (int i = activeModules.size(); --i >= 0;) + { + VST3ModuleHandle* const module = activeModules.getUnchecked (i); + + // VST3s are basically shells, you must therefore check their name along with their file: + if (module->file == file && module->name == description.name) + return module; + } + + VST3ModuleHandle::Ptr m (new VST3ModuleHandle (file)); + + if (! m->open (file, description)) + m = nullptr; + + return m; + } + + //============================================================================== + IPluginFactory* getPluginFactory() { return dllHandle->getPluginFactory(); } + + File file; + String name; + +private: + ScopedPointer dllHandle; + + //============================================================================== + static Array& getActiveModules() + { + static Array activeModules; + return activeModules; + } + + //============================================================================== + bool open (const File& f, const PluginDescription& description) + { + dllHandle = new DLLHandle (f.getFullPathName()); + + ComSmartPtr pluginFactory (dllHandle->getPluginFactory()); + + if (pluginFactory != nullptr) + { + ComSmartPtr host (new VST3HostContext (nullptr)); + MatchingDescriptionFinder finder (host, pluginFactory, description); + + const Result result (finder.findDescriptionsAndPerform (f)); + + if (result.getErrorMessage() == MatchingDescriptionFinder::getSuccessString()) + { + name = description.name; + return true; + } + } + + return false; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3ModuleHandle) +}; + +//============================================================================== +class VST3PluginWindow : public AudioProcessorEditor, + public ComponentMovementWatcher, + public IPlugFrame +{ +public: + VST3PluginWindow (AudioProcessor* owner, IPlugView* pluginView) + : AudioProcessorEditor (owner), + ComponentMovementWatcher (this), + refCount (1), + view (pluginView, false), + pluginHandle (nullptr), + recursiveResize (false) + { + setSize (10, 10); + setOpaque (true); + setVisible (true); + + warnOnFailure (view->setFrame (this)); + + ViewRect rect; + warnOnFailure (view->getSize (&rect)); + resizeWithRect (*this, rect); + } + + ~VST3PluginWindow() + { + warnOnFailure (view->removed()); + warnOnFailure (view->setFrame (nullptr)); + + processor.editorBeingDeleted (this); + + #if JUCE_MAC + dummyComponent.setView (nullptr); + #endif + + view = nullptr; + } + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel) override + { + view->onWheel (wheel.deltaY); + } + + void focusGained (FocusChangeType) override { view->onFocus (true); } + void focusLost (FocusChangeType) override { view->onFocus (false); } + + /** It seems that most, if not all, plugins do their own keyboard hooks, + but IPlugView does have a set of keyboard related methods... + */ + bool keyStateChanged (bool /*isKeyDown*/) override { return true; } + bool keyPressed (const KeyPress& /*key*/) override { return true; } + + //============================================================================== + void componentMovedOrResized (bool, bool wasResized) override + { + if (recursiveResize) + return; + + Component* const topComp = getTopLevelComponent(); + + if (topComp->getPeer() != nullptr) + { + #if JUCE_WINDOWS + const Point pos (topComp->getLocalPoint (this, Point())); + #endif + + recursiveResize = true; + + ViewRect rect; + + if (wasResized && view->canResize() == kResultTrue) + { + rect.right = (Steinberg::int32) getWidth(); + rect.bottom = (Steinberg::int32) getHeight(); + view->checkSizeConstraint (&rect); + + setSize ((int) rect.getWidth(), (int) rect.getHeight()); + + #if JUCE_WINDOWS + SetWindowPos (pluginHandle, 0, + pos.x, pos.y, rect.getWidth(), rect.getHeight(), + isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW); + #elif JUCE_MAC + dummyComponent.setBounds (getLocalBounds()); + #endif + + view->onSize (&rect); + } + else + { + warnOnFailure (view->getSize (&rect)); + + #if JUCE_WINDOWS + SetWindowPos (pluginHandle, 0, + pos.x, pos.y, rect.getWidth(), rect.getHeight(), + isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW); + #elif JUCE_MAC + dummyComponent.setBounds (0, 0, (int) rect.getWidth(), (int) rect.getHeight()); + #endif + } + + // Some plugins don't update their cursor correctly when mousing out the window + Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate(); + + recursiveResize = false; + } + } + + void componentPeerChanged() override { } + + void componentVisibilityChanged() override + { + attachPluginWindow(); + componentMovedOrResized (true, true); + } + + tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override + { + if (incomingView != nullptr + && newSize != nullptr + && incomingView == view) + { + resizeWithRect (dummyComponent, *newSize); + setSize (dummyComponent.getWidth(), dummyComponent.getHeight()); + return kResultTrue; + } + + jassertfalse; + return kInvalidArgument; + } + +private: + //============================================================================== + Atomic refCount; + ComSmartPtr view; + + #if JUCE_WINDOWS + class ChildComponent : public Component + { + public: + ChildComponent() {} + void paint (Graphics& g) override { g.fillAll (Colours::cornflowerblue); } + + using Component::createNewPeer; + + private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildComponent) + }; + + ChildComponent dummyComponent; + ScopedPointer peer; + typedef HWND HandleFormat; + #elif JUCE_MAC + AutoResizingNSViewComponentWithParent dummyComponent; + typedef NSView* HandleFormat; + #else + Component dummyComponent; + typedef void* HandleFormat; + #endif + + HandleFormat pluginHandle; + bool recursiveResize; + + //============================================================================== + static void resizeWithRect (Component& comp, const ViewRect& rect) + { + comp.setBounds ((int) rect.left, (int) rect.top, + jmax (10, std::abs ((int) rect.getWidth())), + jmax (10, std::abs ((int) rect.getHeight()))); + } + + void attachPluginWindow() + { + if (pluginHandle == nullptr) + { + #if JUCE_WINDOWS + if (Component* topComp = getTopLevelComponent()) + peer = dummyComponent.createNewPeer (0, topComp->getWindowHandle()); + else + peer = nullptr; + + if (peer != nullptr) + pluginHandle = (HandleFormat) peer->getNativeHandle(); + #elif JUCE_MAC + dummyComponent.setBounds (getLocalBounds()); + addAndMakeVisible (dummyComponent); + pluginHandle = (NSView*) dummyComponent.getView(); + jassert (pluginHandle != nil); + #endif + + if (pluginHandle != nullptr) + warnOnFailure (view->attached (pluginHandle, defaultVST3WindowType)); + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginWindow) +}; + +//============================================================================== +class VST3PluginInstance : public AudioPluginInstance +{ +public: + VST3PluginInstance (const VST3ModuleHandle::Ptr& handle) + : module (handle), + numInputAudioBusses (0), + numOutputAudioBusses (0), + inputParameterChanges (new ParameterChangeList()), + outputParameterChanges (new ParameterChangeList()), + midiInputs (new MidiEventList()), + midiOutputs (new MidiEventList()), + isComponentInitialised (false), + isControllerInitialised (false), + isActive (false) + { + host = new VST3HostContext (this); + } + + ~VST3PluginInstance() + { + jassert (getActiveEditor() == nullptr); // You must delete any editors before deleting the plugin instance! + + releaseResources(); + + if (editControllerConnection != nullptr && componentConnection != nullptr) + { + editControllerConnection->disconnect (componentConnection); + componentConnection->disconnect (editControllerConnection); + } + + editController->setComponentHandler (nullptr); + + if (isControllerInitialised) editController->terminate(); + if (isComponentInitialised) component->terminate(); + + componentConnection = nullptr; + editControllerConnection = nullptr; + unitData = nullptr; + unitInfo = nullptr; + programListData = nullptr; + componentHandler2 = nullptr; + componentHandler = nullptr; + processor = nullptr; + editController2 = nullptr; + editController = nullptr; + component = nullptr; + host = nullptr; + module = nullptr; + } + + bool initialise() + { + #if JUCE_WINDOWS + // On Windows it's highly advisable to create your plugins using the message thread, + // because many plugins need a chance to create HWNDs that will get their messages + // delivered by the main message thread, and that's not possible from a background thread. + jassert (MessageManager::getInstance()->isThisTheMessageThread()); + #endif + + ComSmartPtr factory (module->getPluginFactory()); + + PFactoryInfo factoryInfo; + factory->getFactoryInfo (&factoryInfo); + company = toString (factoryInfo.vendor).trim(); + + if (! fetchComponentAndController (factory, factory->countClasses())) + return false; + + // (May return an error if the plugin combines the IComponent and IEditController implementations) + editController->initialize (host->getFUnknown()); + + isControllerInitialised = true; + editController->setComponentHandler (host); + grabInformationObjects(); + synchroniseStates(); + interconnectComponentAndController(); + setupIO(); + return true; + } + + //============================================================================== + void fillInPluginDescription (PluginDescription& description) const override + { + jassert (module != nullptr); + + createPluginDescription (description, module->file, + company, module->name, + *info, info2, infoW, + getNumInputChannels(), + getNumOutputChannels()); + } + + void* getPlatformSpecificData() override { return component; } + void refreshParameterList() override {} + + //============================================================================== + const String getName() const override + { + return module != nullptr ? module->name : String::empty; + } + + void repopulateArrangements() + { + inputArrangements.clearQuick(); + outputArrangements.clearQuick(); + + // NB: Some plugins need a valid arrangement despite specifying 0 for their I/O busses + for (int i = 0; i < jmax (1, numInputAudioBusses); ++i) + inputArrangements.add (getArrangementForBus (processor, true, i)); + + for (int i = 0; i < jmax (1, numOutputAudioBusses); ++i) + outputArrangements.add (getArrangementForBus (processor, false, i)); + } + + void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock) override + { + // Avoid redundantly calling things like setActive, which can be a heavy-duty call for some plugins: + if (isActive + && getSampleRate() == sampleRate + && getBlockSize() == estimatedSamplesPerBlock) + return; + + using namespace Vst; + + ProcessSetup setup; + setup.symbolicSampleSize = kSample32; + setup.maxSamplesPerBlock = estimatedSamplesPerBlock; + setup.sampleRate = sampleRate; + setup.processMode = isNonRealtime() ? kOffline : kRealtime; + + warnOnFailure (processor->setupProcessing (setup)); + + if (! isComponentInitialised) + isComponentInitialised = component->initialize (host->getFUnknown()) == kResultTrue; + + editController->setComponentHandler (host); + + if (inputArrangements.size() <= 0 || outputArrangements.size() <= 0) + repopulateArrangements(); + + warnOnFailure (processor->setBusArrangements (inputArrangements.getRawDataPointer(), numInputAudioBusses, + outputArrangements.getRawDataPointer(), numOutputAudioBusses)); + + // Update the num. busses in case the configuration has been modified by the plugin. (May affect number of channels!): + const int newNumInputAudioBusses = getNumSingleDirectionBussesFor (component, true, true); + const int newNumOutputAudioBusses = getNumSingleDirectionBussesFor (component, false, true); + + // Repopulate arrangements if the number of busses have changed: + if (numInputAudioBusses != newNumInputAudioBusses + || numOutputAudioBusses != newNumOutputAudioBusses) + { + numInputAudioBusses = newNumInputAudioBusses; + numOutputAudioBusses = newNumOutputAudioBusses; + + repopulateArrangements(); + } + + // Needed for having the same sample rate in processBlock(); some plugins need this! + setPlayConfigDetails (getNumSingleDirectionChannelsFor (component, true, true), + getNumSingleDirectionChannelsFor (component, false, true), + sampleRate, estimatedSamplesPerBlock); + + setStateForAllBusses (true); + + setLatencySamples (jmax (0, (int) processor->getLatencySamples())); + + warnOnFailure (component->setActive (true)); + warnOnFailure (processor->setProcessing (true)); + + isActive = true; + } + + void releaseResources() override + { + if (! isActive) + return; // Avoids redundantly calling things like setActive + + JUCE_TRY + { + isActive = false; + + setStateForAllBusses (false); + + if (processor != nullptr) + warnOnFailure (processor->setProcessing (false)); + + if (component != nullptr) + warnOnFailure (component->setActive (false)); + } + JUCE_CATCH_ALL_ASSERT + } + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override + { + using namespace Vst; + + if (isActive + && processor != nullptr + && processor->canProcessSampleSize (kSample32) == kResultTrue) + { + const int numSamples = buffer.getNumSamples(); + + ProcessData data; + data.processMode = isNonRealtime() ? kOffline : kRealtime; + data.symbolicSampleSize = kSample32; + data.numInputs = numInputAudioBusses; + data.numOutputs = numOutputAudioBusses; + data.inputParameterChanges = inputParameterChanges; + data.outputParameterChanges = outputParameterChanges; + data.numSamples = (Steinberg::int32) numSamples; + + updateTimingInformation (data, getSampleRate()); + + for (int i = getNumInputChannels(); i < buffer.getNumChannels(); ++i) + buffer.clear (i, 0, numSamples); + + associateTo (data, buffer); + associateTo (data, midiMessages); + + processor->process (data); + + MidiEventList::toMidiBuffer (midiMessages, *midiOutputs); + } + } + + //============================================================================== + String getChannelName (int channelIndex, bool forInput, bool forAudioChannel) const + { + const int numBusses = getNumSingleDirectionBussesFor (component, forInput, forAudioChannel); + int numCountedChannels = 0; + + for (int i = 0; i < numBusses; ++i) + { + Vst::BusInfo busInfo (getBusInfo (forInput, forAudioChannel, i)); + + numCountedChannels += busInfo.channelCount; + + if (channelIndex < numCountedChannels) + return toString (busInfo.name); + } + + return String::empty; + } + + const String getInputChannelName (int channelIndex) const override { return getChannelName (channelIndex, true, true); } + const String getOutputChannelName (int channelIndex) const override { return getChannelName (channelIndex, false, true); } + + bool isInputChannelStereoPair (int channelIndex) const override + { + if (channelIndex < 0 || channelIndex >= getNumInputChannels()) + return false; + + return getBusInfo (true, true).channelCount == 2; + } + + bool isOutputChannelStereoPair (int channelIndex) const override + { + if (channelIndex < 0 || channelIndex >= getNumOutputChannels()) + return false; + + return getBusInfo (false, true).channelCount == 2; + } + + bool acceptsMidi() const override { return getBusInfo (true, false).channelCount > 0; } + bool producesMidi() const override { return getBusInfo (false, false).channelCount > 0; } + + //============================================================================== + bool silenceInProducesSilenceOut() const override + { + if (processor != nullptr) + return processor->getTailSamples() == Vst::kNoTail; + + return true; + } + + /** May return a negative value as a means of informing us that the plugin has "infinite tail," or 0 for "no tail." */ + double getTailLengthSeconds() const override + { + if (processor != nullptr) + { + const double sampleRate = getSampleRate(); + + if (sampleRate > 0.0) + return jlimit (0, 0x7fffffff, (int) processor->getTailSamples()) / sampleRate; + } + + return 0.0; + } + + //============================================================================== + AudioProcessorEditor* createEditor() override + { + if (IPlugView* view = tryCreatingView()) + return new VST3PluginWindow (this, view); + + return nullptr; + } + + bool hasEditor() const override + { + // (if possible, avoid creating a second instance of the editor, because that crashes some plugins) + if (getActiveEditor() != nullptr) + return true; + + ComSmartPtr view (tryCreatingView(), false); + return view != nullptr; + } + + //============================================================================== + int getNumParameters() override + { + if (editController != nullptr) + return (int) editController->getParameterCount(); + + return 0; + } + + const String getParameterName (int parameterIndex) override + { + return toString (getParameterInfoForIndex (parameterIndex).title); + } + + float getParameter (int parameterIndex) override + { + if (editController != nullptr) + { + const uint32 id = getParameterInfoForIndex (parameterIndex).id; + return (float) editController->getParamNormalized (id); + } + + return 0.0f; + } + + const String getParameterText (int parameterIndex) override + { + if (editController != nullptr) + { + const uint32 id = getParameterInfoForIndex (parameterIndex).id; + + Vst::String128 result; + warnOnFailure (editController->getParamStringByValue (id, editController->getParamNormalized (id), result)); + + return toString (result); + } + + return String::empty; + } + + void setParameter (int parameterIndex, float newValue) override + { + if (editController != nullptr) + { + const uint32 id = getParameterInfoForIndex (parameterIndex).id; + editController->setParamNormalized (id, (double) newValue); + } + } + + //============================================================================== + int getNumPrograms() override { return getProgramListInfo (0).programCount; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + void changeProgramName (int, const String&) override {} + + const String getProgramName (int index) override + { + Vst::String128 result; + unitInfo->getProgramName (getProgramListInfo (0).id, index, result); + return toString (result); + } + + //============================================================================== + void reset() override + { + if (component != nullptr) + { + component->setActive (false); + component->setActive (true); + } + } + + //============================================================================== + void getStateInformation (MemoryBlock& destData) override + { + XmlElement state ("VST3PluginState"); + + appendStateFrom (state, component, "IComponent"); + appendStateFrom (state, editController, "IEditController"); + + AudioProcessor::copyXmlToBinary (state, destData); + } + + void setStateInformation (const void* data, int sizeInBytes) override + { + ScopedPointer head (AudioProcessor::getXmlFromBinary (data, sizeInBytes)); + + if (head != nullptr) + { + ComSmartPtr s (createMemoryStreamForState (*head, "IComponent")); + + if (s != nullptr && component != nullptr) + component->setState (s); + + if (editController != nullptr) + { + if (s != nullptr) + editController->setComponentState (s); + + s = createMemoryStreamForState (*head, "IEditController"); + + if (s != nullptr) + editController->setState (s); + } + } + } + + /** @note Not applicable to VST3 */ + void getCurrentProgramStateInformation (MemoryBlock& destData) override + { + destData.setSize (0, true); + } + + /** @note Not applicable to VST3 */ + void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override + { + (void) data; + (void) sizeInBytes; + } + +private: + //============================================================================== + VST3ModuleHandle::Ptr module; + + friend VST3HostContext; + ComSmartPtr host; + + // Information objects: + String company; + ScopedPointer info; + ScopedPointer info2; + ScopedPointer infoW; + + // Rudimentary interfaces: + ComSmartPtr component; + ComSmartPtr editController; + ComSmartPtr editController2; + ComSmartPtr processor; + ComSmartPtr componentHandler; + ComSmartPtr componentHandler2; + ComSmartPtr unitInfo; + ComSmartPtr unitData; + ComSmartPtr programListData; + ComSmartPtr componentConnection; + ComSmartPtr editControllerConnection; + + /** The number of IO busses MUST match that of the plugin, + even if there aren't enough channels to process, + as very poorly specified by the Steinberg SDK + */ + int numInputAudioBusses, numOutputAudioBusses; + Array inputArrangements, outputArrangements; // Caching to improve performance and to avoid possible non-thread-safe calls to getBusArrangements(). + VST3BufferExchange::BusMap inputBusMap, outputBusMap; + Array inputBusses, outputBusses; + + //============================================================================== + template + static void appendStateFrom (XmlElement& head, ComSmartPtr& object, const String& identifier) + { + if (object != nullptr) + { + Steinberg::MemoryStream stream; + + if (object->getState (&stream) == kResultTrue) + { + MemoryBlock info (stream.getData(), (std::size_t) stream.getSize()); + head.createNewChildElement (identifier)->addTextElement (info.toBase64Encoding()); + } + } + } + + static Steinberg::MemoryStream* createMemoryStreamForState (XmlElement& head, StringRef identifier) + { + Steinberg::MemoryStream* stream = nullptr; + + if (XmlElement* const state = head.getChildByName (identifier)) + { + MemoryBlock mem; + + if (mem.fromBase64Encoding (state->getAllSubText())) + { + stream = new Steinberg::MemoryStream(); + stream->setSize ((TSize) mem.getSize()); + mem.copyTo (stream->getData(), 0, mem.getSize()); + } + } + + return stream; + } + + //============================================================================== + class ParameterChangeList : public Vst::IParameterChanges + { + public: + ParameterChangeList() {} + virtual ~ParameterChangeList() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + Steinberg::int32 PLUGIN_API getParameterCount() override { return 0; } + + Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32) override + { + return nullptr; + } + + Vst::IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID&, Steinberg::int32& index) override + { + index = 0; + return nullptr; + } + + private: + Atomic refCount; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterChangeList) + }; + + ComSmartPtr inputParameterChanges, outputParameterChanges; + ComSmartPtr midiInputs, midiOutputs; + Vst::ProcessContext timingInfo; //< Only use this in processBlock()! + bool isComponentInitialised, isControllerInitialised, isActive; + + //============================================================================== + bool fetchComponentAndController (IPluginFactory* factory, const Steinberg::int32 numClasses) + { + jassert (numClasses >= 0); // The plugin must provide at least an IComponent and IEditController! + + for (Steinberg::int32 j = 0; j < numClasses; ++j) + { + info = new PClassInfo(); + factory->getClassInfo (j, info); + + if (std::strcmp (info->category, kVstAudioEffectClass) != 0) + continue; + + const String name (toString (info->name).trim()); + + if (module->name != name) + continue; + + { + ComSmartPtr pf2; + ComSmartPtr pf3; + + if (pf2.loadFrom (factory)) + { + info2 = new PClassInfo2(); + pf2->getClassInfo2 (j, info2); + } + else + { + info2 = nullptr; + } + + if (pf3.loadFrom (factory)) + { + pf3->setHostContext (host->getFUnknown()); + infoW = new PClassInfoW(); + pf3->getClassInfoUnicode (j, infoW); + } + else + { + infoW = nullptr; + } + } + + bool failed = true; + + if (component.loadFrom (factory, info->cid) && component != nullptr) + { + warnOnFailure (component->setIoMode (isNonRealtime() ? Vst::kOffline : Vst::kRealtime)); + + if (warnOnFailure (component->initialize (host->getFUnknown())) != kResultOk) + return false; + + isComponentInitialised = true; + + // Get the IEditController: + TUID controllerCID = { 0 }; + + if (component->getControllerClassId (controllerCID) == kResultTrue && FUID (controllerCID).isValid()) + editController.loadFrom (factory, controllerCID); + + if (editController == nullptr) + { + // Try finding the IEditController the long way around: + for (Steinberg::int32 i = 0; i < numClasses; ++i) + { + PClassInfo classInfo; + factory->getClassInfo (i, &classInfo); + + if (std::strcmp (classInfo.category, kVstComponentControllerClass) == 0) + editController.loadFrom (factory, classInfo.cid); + } + } + + if (editController == nullptr) + editController.loadFrom (component); + + failed = editController == nullptr; + } + + if (failed) + { + jassertfalse; // The plugin won't function without a valid IComponent and IEditController implementation! + + if (component != nullptr) + { + component->terminate(); + component = nullptr; + } + + if (editController != nullptr) + { + editController->terminate(); + editController = nullptr; + } + + break; + } + + return true; + } + + return false; + } + + /** Some plugins need to be "connected" to intercommunicate between their implemented classes */ + void interconnectComponentAndController() + { + componentConnection.loadFrom (component); + editControllerConnection.loadFrom (editController); + + if (componentConnection != nullptr && editControllerConnection != nullptr) + { + warnOnFailure (editControllerConnection->connect (componentConnection)); + warnOnFailure (componentConnection->connect (editControllerConnection)); + } + } + + void synchroniseStates() + { + Steinberg::MemoryStream stream; + + if (component->getState (&stream) == kResultTrue) + if (stream.seek (0, Steinberg::IBStream::kIBSeekSet, nullptr) == kResultTrue) + warnOnFailure (editController->setComponentState (&stream)); + } + + void grabInformationObjects() + { + processor.loadFrom (component); + unitInfo.loadFrom (component); + programListData.loadFrom (component); + unitData.loadFrom (component); + editController2.loadFrom (component); + componentHandler.loadFrom (component); + componentHandler2.loadFrom (component); + + if (processor == nullptr) processor.loadFrom (editController); + if (unitInfo == nullptr) unitInfo.loadFrom (editController); + if (programListData == nullptr) programListData.loadFrom (editController); + if (unitData == nullptr) unitData.loadFrom (editController); + if (editController2 == nullptr) editController2.loadFrom (editController); + if (componentHandler == nullptr) componentHandler.loadFrom (editController); + if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController); + } + + void setStateForAllBusses (bool newState) + { + setStateForAllBussesOfType (component, newState, true, true); // Activate/deactivate audio inputs + setStateForAllBussesOfType (component, newState, false, true); // Activate/deactivate audio outputs + setStateForAllBussesOfType (component, newState, true, false); // Activate/deactivate MIDI inputs + setStateForAllBussesOfType (component, newState, false, false); // Activate/deactivate MIDI outputs + } + + void setupIO() + { + setStateForAllBusses (true); + + Vst::ProcessSetup setup; + setup.symbolicSampleSize = Vst::kSample32; + setup.maxSamplesPerBlock = 1024; + setup.sampleRate = 44100.0; + setup.processMode = Vst::kRealtime; + + warnOnFailure (processor->setupProcessing (setup)); + + numInputAudioBusses = getNumSingleDirectionBussesFor (component, true, true); + numOutputAudioBusses = getNumSingleDirectionBussesFor (component, false, true); + + setPlayConfigDetails (getNumSingleDirectionChannelsFor (component, true, true), + getNumSingleDirectionChannelsFor (component, false, true), + setup.sampleRate, (int) setup.maxSamplesPerBlock); + } + + //============================================================================== + Vst::BusInfo getBusInfo (bool forInput, bool forAudio, int index = 0) const + { + Vst::BusInfo busInfo; + busInfo.mediaType = forAudio ? Vst::kAudio : Vst::kEvent; + busInfo.direction = forInput ? Vst::kInput : Vst::kOutput; + + component->getBusInfo (busInfo.mediaType, busInfo.direction, + (Steinberg::int32) index, busInfo); + return busInfo; + } + + //============================================================================== + /** @note An IPlugView, when first created, should start with a ref-count of 1! */ + IPlugView* tryCreatingView() const + { + IPlugView* v = editController->createView (Vst::ViewType::kEditor); + + if (v == nullptr) v = editController->createView (nullptr); + if (v == nullptr) editController->queryInterface (IPlugView::iid, (void**) &v); + + return v; + } + + //============================================================================== + void associateTo (Vst::ProcessData& destination, AudioSampleBuffer& buffer) + { + using namespace VST3BufferExchange; + + mapBufferToBusses (inputBusses, inputBusMap, inputArrangements, buffer); + mapBufferToBusses (outputBusses, outputBusMap, outputArrangements, buffer); + + destination.inputs = inputBusses.getRawDataPointer(); + destination.outputs = outputBusses.getRawDataPointer(); + } + + void associateTo (Vst::ProcessData& destination, MidiBuffer& midiBuffer) + { + midiInputs->clear(); + midiOutputs->clear(); + + MidiEventList::toEventList (*midiInputs, midiBuffer); + + destination.inputEvents = midiInputs; + destination.outputEvents = midiOutputs; + } + + void updateTimingInformation (Vst::ProcessData& destination, double processSampleRate) + { + toProcessContext (timingInfo, getPlayHead(), processSampleRate); + destination.processContext = &timingInfo; + } + + Vst::ParameterInfo getParameterInfoForIndex (int index) const + { + Vst::ParameterInfo paramInfo = { 0 }; + + if (processor != nullptr) + editController->getParameterInfo (index, paramInfo); + + return paramInfo; + } + + Vst::ProgramListInfo getProgramListInfo (int index) const + { + Vst::ProgramListInfo paramInfo = { 0 }; + + if (unitInfo != nullptr) + unitInfo->getProgramListInfo (index, paramInfo); + + return paramInfo; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginInstance) +}; + +}; + +//============================================================================== +VST3PluginFormat::VST3PluginFormat() {} +VST3PluginFormat::~VST3PluginFormat() {} + +void VST3PluginFormat::findAllTypesForFile (OwnedArray& results, const String& fileOrIdentifier) +{ + if (! fileMightContainThisPluginType (fileOrIdentifier)) + return; + + VST3Classes::VST3ModuleHandle::getAllDescriptionsForFile (results, fileOrIdentifier); +} + +AudioPluginInstance* VST3PluginFormat::createInstanceFromDescription (const PluginDescription& description, double, int) +{ + ScopedPointer result; + + if (fileMightContainThisPluginType (description.fileOrIdentifier)) + { + File file (description.fileOrIdentifier); + + const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); + file.getParentDirectory().setAsCurrentWorkingDirectory(); + + if (const VST3Classes::VST3ModuleHandle::Ptr module = VST3Classes::VST3ModuleHandle::findOrCreateModule (file, description)) + { + result = new VST3Classes::VST3PluginInstance (module); + + if (! result->initialise()) + result = nullptr; + } + + previousWorkingDirectory.setAsCurrentWorkingDirectory(); + } + + return result.release(); +} + +bool VST3PluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) +{ + const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); + + return f.hasFileExtension (".vst3") + #if JUCE_MAC + && f.exists(); + #else + && f.existsAsFile(); + #endif +} + +String VST3PluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) +{ + return fileOrIdentifier; //Impossible to tell because every VST3 is a type of shell... +} + +bool VST3PluginFormat::pluginNeedsRescanning (const PluginDescription& description) +{ + return File (description.fileOrIdentifier).getLastModificationTime() != description.lastFileModTime; +} + +bool VST3PluginFormat::doesPluginStillExist (const PluginDescription& description) +{ + return File (description.fileOrIdentifier).exists(); +} + +StringArray VST3PluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive) +{ + StringArray results; + + for (int i = 0; i < directoriesToSearch.getNumPaths(); ++i) + recursiveFileSearch (results, directoriesToSearch[i], recursive); + + return results; +} + +void VST3PluginFormat::recursiveFileSearch (StringArray& results, const File& directory, const bool recursive) +{ + DirectoryIterator iter (directory, false, "*", File::findFilesAndDirectories); + + while (iter.next()) + { + const File f (iter.getFile()); + bool isPlugin = false; + + if (fileMightContainThisPluginType (f.getFullPathName())) + { + isPlugin = true; + results.add (f.getFullPathName()); + } + + if (recursive && (! isPlugin) && f.isDirectory()) + recursiveFileSearch (results, f, true); + } +} + +FileSearchPath VST3PluginFormat::getDefaultLocationsToSearch() +{ + #if JUCE_WINDOWS + const String programFiles (File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName()); + return FileSearchPath (programFiles + "\\Common Files\\VST3"); + #elif JUCE_MAC + return FileSearchPath ("/Library/Audio/Plug-Ins/VST3;~/Library/Audio/Plug-Ins/VST3"); + #else + return FileSearchPath(); + #endif +} + +#endif //JUCE_PLUGINHOST_VST3 diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h new file mode 100644 index 0000000000..308ff5ab13 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h @@ -0,0 +1,72 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_VST3PLUGINFORMAT_H_INCLUDED +#define JUCE_VST3PLUGINFORMAT_H_INCLUDED + +#if JUCE_PLUGINHOST_VST3 +/** + Implements a plugin format for VST3s. +*/ +class JUCE_API VST3PluginFormat : public AudioPluginFormat +{ +public: + /** Constructor */ + VST3PluginFormat(); + + /** Destructor */ + ~VST3PluginFormat(); + + //============================================================================== + /** @internal */ + String getName() const override { return "VST3"; } + /** @internal */ + void findAllTypesForFile (OwnedArray& results, const String& fileOrIdentifier) override; + /** @internal */ + AudioPluginInstance* createInstanceFromDescription (const PluginDescription& description, double, int) override; + /** @internal */ + bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; + /** @internal */ + String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; + /** @internal */ + bool pluginNeedsRescanning (const PluginDescription& description) override; + /** @internal */ + StringArray searchPathsForPlugins (const FileSearchPath& searchPath, bool recursive) override; + /** @internal */ + bool doesPluginStillExist (const PluginDescription& description) override; + /** @internal */ + FileSearchPath getDefaultLocationsToSearch() override; + /** @internal */ + bool canScanForPlugins() const override { return true; } + +private: + //============================================================================== + void recursiveFileSearch (StringArray&, const File&, bool recursive); + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginFormat) +}; + +#endif // JUCE_PLUGINHOST_VST3 +#endif // JUCE_VST3PLUGINFORMAT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h new file mode 100644 index 0000000000..f442eab855 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h @@ -0,0 +1,187 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifdef __aeffect__ // NB: this must come first, *before* the header-guard. + +#ifndef JUCE_VSTMIDIEVENTLIST_H_INCLUDED +#define JUCE_VSTMIDIEVENTLIST_H_INCLUDED + +//============================================================================== +/** Holds a set of VSTMidiEvent objects and makes it easy to add + events to the list. + + This is used by both the VST hosting code and the plugin wrapper. +*/ +class VSTMidiEventList +{ +public: + //============================================================================== + VSTMidiEventList() + : numEventsUsed (0), numEventsAllocated (0) + { + } + + ~VSTMidiEventList() + { + freeEvents(); + } + + //============================================================================== + void clear() + { + numEventsUsed = 0; + + if (events != nullptr) + events->numEvents = 0; + } + + void addEvent (const void* const midiData, const int numBytes, const int frameOffset) + { + ensureSize (numEventsUsed + 1); + + VstMidiEvent* const e = (VstMidiEvent*) (events->events [numEventsUsed]); + events->numEvents = ++numEventsUsed; + + if (numBytes <= 4) + { + if (e->type == kVstSysExType) + { + delete[] (((VstMidiSysexEvent*) e)->sysexDump); + e->type = kVstMidiType; + e->byteSize = sizeof (VstMidiEvent); + e->noteLength = 0; + e->noteOffset = 0; + e->detune = 0; + e->noteOffVelocity = 0; + } + + e->deltaFrames = frameOffset; + memcpy (e->midiData, midiData, (size_t) numBytes); + } + else + { + VstMidiSysexEvent* const se = (VstMidiSysexEvent*) e; + + if (se->type == kVstSysExType) + delete[] se->sysexDump; + + se->sysexDump = new char [numBytes]; + memcpy (se->sysexDump, midiData, (size_t) numBytes); + + se->type = kVstSysExType; + se->byteSize = sizeof (VstMidiSysexEvent); + se->deltaFrames = frameOffset; + se->flags = 0; + se->dumpBytes = numBytes; + se->resvd1 = 0; + se->resvd2 = 0; + } + } + + //============================================================================== + // Handy method to pull the events out of an event buffer supplied by the host + // or plugin. + static void addEventsToMidiBuffer (const VstEvents* events, MidiBuffer& dest) + { + for (int i = 0; i < events->numEvents; ++i) + { + const VstEvent* const e = events->events[i]; + + if (e != nullptr) + { + if (e->type == kVstMidiType) + { + dest.addEvent ((const juce::uint8*) ((const VstMidiEvent*) e)->midiData, + 4, e->deltaFrames); + } + else if (e->type == kVstSysExType) + { + dest.addEvent ((const juce::uint8*) ((const VstMidiSysexEvent*) e)->sysexDump, + (int) ((const VstMidiSysexEvent*) e)->dumpBytes, + e->deltaFrames); + } + } + } + } + + //============================================================================== + void ensureSize (int numEventsNeeded) + { + if (numEventsNeeded > numEventsAllocated) + { + numEventsNeeded = (numEventsNeeded + 32) & ~31; + + const size_t size = 20 + sizeof (VstEvent*) * (size_t) numEventsNeeded; + + if (events == nullptr) + events.calloc (size, 1); + else + events.realloc (size, 1); + + for (int i = numEventsAllocated; i < numEventsNeeded; ++i) + events->events[i] = allocateVSTEvent(); + + numEventsAllocated = numEventsNeeded; + } + } + + void freeEvents() + { + if (events != nullptr) + { + for (int i = numEventsAllocated; --i >= 0;) + freeVSTEvent (events->events[i]); + + events.free(); + numEventsUsed = 0; + numEventsAllocated = 0; + } + } + + //============================================================================== + HeapBlock events; + +private: + int numEventsUsed, numEventsAllocated; + + static VstEvent* allocateVSTEvent() + { + VstEvent* const e = (VstEvent*) std::calloc (1, sizeof (VstMidiEvent) > sizeof (VstMidiSysexEvent) ? sizeof (VstMidiEvent) + : sizeof (VstMidiSysexEvent)); + e->type = kVstMidiType; + e->byteSize = sizeof (VstMidiEvent); + return e; + } + + static void freeVSTEvent (VstEvent* e) + { + if (e->type == kVstSysExType) + delete[] (((VstMidiSysexEvent*) e)->sysexDump); + + std::free (e); + } +}; + +#endif // JUCE_VSTMIDIEVENTLIST_H_INCLUDED +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp new file mode 100644 index 0000000000..5509e2c384 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -0,0 +1,2889 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_VST + +//============================================================================== +#if JUCE_MAC && JUCE_SUPPORT_CARBON + #include "../../juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" +#endif + +//============================================================================== +#undef PRAGMA_ALIGN_SUPPORTED +#define VST_FORCE_DEPRECATED 0 + +#if JUCE_MSVC + #pragma warning (push) + #pragma warning (disable: 4996) +#elif ! JUCE_MINGW + #define __cdecl +#endif + +/* Obviously you're going to need the Steinberg vstsdk2.4 folder in + your include path if you want to add VST support. + + If you're not interested in VSTs, you can disable them by setting the + JUCE_PLUGINHOST_VST flag to 0. +*/ +#include "pluginterfaces/vst2.x/aeffectx.h" + +#if JUCE_MSVC + #pragma warning (pop) + #pragma warning (disable: 4355) // ("this" used in initialiser list warning) +#endif + +//============================================================================== +#include "juce_VSTMidiEventList.h" + +#if JUCE_MINGW + #ifndef WM_APPCOMMAND + #define WM_APPCOMMAND 0x0319 + #endif + + extern "C" void _fpreset(); + extern "C" void _clearfp(); +#elif ! JUCE_WINDOWS + static void _fpreset() {} + static void _clearfp() {} +#endif + +#ifndef JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN + #define JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN +#endif + +#ifndef JUCE_VST_WRAPPER_INVOKE_MAIN + #define JUCE_VST_WRAPPER_INVOKE_MAIN effect = module->moduleMain (&audioMaster); +#endif + +//============================================================================== +namespace +{ + const int fxbVersionNum = 1; + + struct fxProgram + { + VstInt32 chunkMagic; // 'CcnK' + VstInt32 byteSize; // of this chunk, excl. magic + byteSize + VstInt32 fxMagic; // 'FxCk' + VstInt32 version; + VstInt32 fxID; // fx unique id + VstInt32 fxVersion; + VstInt32 numParams; + char prgName[28]; + float params[1]; // variable no. of parameters + }; + + struct fxSet + { + VstInt32 chunkMagic; // 'CcnK' + VstInt32 byteSize; // of this chunk, excl. magic + byteSize + VstInt32 fxMagic; // 'FxBk' + VstInt32 version; + VstInt32 fxID; // fx unique id + VstInt32 fxVersion; + VstInt32 numPrograms; + char future[128]; + fxProgram programs[1]; // variable no. of programs + }; + + struct fxChunkSet + { + VstInt32 chunkMagic; // 'CcnK' + VstInt32 byteSize; // of this chunk, excl. magic + byteSize + VstInt32 fxMagic; // 'FxCh', 'FPCh', or 'FBCh' + VstInt32 version; + VstInt32 fxID; // fx unique id + VstInt32 fxVersion; + VstInt32 numPrograms; + char future[128]; + VstInt32 chunkSize; + char chunk[8]; // variable + }; + + struct fxProgramSet + { + VstInt32 chunkMagic; // 'CcnK' + VstInt32 byteSize; // of this chunk, excl. magic + byteSize + VstInt32 fxMagic; // 'FxCh', 'FPCh', or 'FBCh' + VstInt32 version; + VstInt32 fxID; // fx unique id + VstInt32 fxVersion; + VstInt32 numPrograms; + char name[28]; + VstInt32 chunkSize; + char chunk[8]; // variable + }; + + static VstInt32 fxbName (const char* name) noexcept { return (VstInt32) ByteOrder::bigEndianInt (name); } + static VstInt32 fxbSwap (const VstInt32 x) noexcept { return (VstInt32) ByteOrder::swapIfLittleEndian ((uint32) x); } + + static float fxbSwapFloat (const float x) noexcept + { + #ifdef JUCE_LITTLE_ENDIAN + union { uint32 asInt; float asFloat; } n; + n.asFloat = x; + n.asInt = ByteOrder::swap (n.asInt); + return n.asFloat; + #else + return x; + #endif + } +} + +//============================================================================== +namespace +{ + static double getVSTHostTimeNanoseconds() noexcept + { + #if JUCE_WINDOWS + return timeGetTime() * 1000000.0; + #elif JUCE_LINUX + timeval micro; + gettimeofday (µ, 0); + return micro.tv_usec * 1000.0; + #elif JUCE_MAC + UnsignedWide micro; + Microseconds (µ); + return micro.lo * 1000.0; + #endif + } + + static int shellUIDToCreate = 0; + static int insideVSTCallback = 0; + + struct IdleCallRecursionPreventer + { + IdleCallRecursionPreventer() : isMessageThread (MessageManager::getInstance()->isThisTheMessageThread()) + { + if (isMessageThread) + ++insideVSTCallback; + } + + ~IdleCallRecursionPreventer() + { + if (isMessageThread) + --insideVSTCallback; + } + + const bool isMessageThread; + JUCE_DECLARE_NON_COPYABLE (IdleCallRecursionPreventer) + }; + + #if JUCE_MAC + static bool makeFSRefFromPath (FSRef* destFSRef, const String& path) + { + return FSPathMakeRef (reinterpret_cast (path.toRawUTF8()), destFSRef, 0) == noErr; + } + #endif + + #if JUCE_MAC && JUCE_PPC + static void* newCFMFromMachO (void* const machofp) noexcept + { + void* result = (void*) new char[8]; + + ((void**) result)[0] = machofp; + ((void**) result)[1] = result; + + return result; + } + #endif +} + +//============================================================================== +typedef AEffect* (VSTCALLBACK *MainCall) (audioMasterCallback); +static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); + +//============================================================================== +// Change this to disable logging of various VST activities +#ifndef VST_LOGGING + #define VST_LOGGING 1 +#endif + +#if VST_LOGGING + #define JUCE_VST_LOG(a) Logger::writeToLog(a); +#else + #define JUCE_VST_LOG(a) +#endif + +//============================================================================== +#if JUCE_LINUX + +extern Display* display; +extern XContext windowHandleXContext; + +namespace +{ + static bool xErrorTriggered = false; + + static int temporaryErrorHandler (Display*, XErrorEvent*) + { + xErrorTriggered = true; + return 0; + } + + typedef void (*EventProcPtr) (XEvent* ev); + + static EventProcPtr getPropertyFromXWindow (Window handle, Atom atom) + { + XErrorHandler oldErrorHandler = XSetErrorHandler (temporaryErrorHandler); + xErrorTriggered = false; + + int userSize; + unsigned long bytes, userCount; + unsigned char* data; + Atom userType; + + XGetWindowProperty (display, handle, atom, 0, 1, false, AnyPropertyType, + &userType, &userSize, &userCount, &bytes, &data); + + XSetErrorHandler (oldErrorHandler); + + return (userCount == 1 && ! xErrorTriggered) ? *reinterpret_cast (data) : nullptr; + } + + Window getChildWindow (Window windowToCheck) + { + Window rootWindow, parentWindow; + Window* childWindows; + unsigned int numChildren = 0; + + XQueryTree (display, windowToCheck, &rootWindow, &parentWindow, &childWindows, &numChildren); + + if (numChildren > 0) + return childWindows [0]; + + return 0; + } + + static void translateJuceToXButtonModifiers (const MouseEvent& e, XEvent& ev) noexcept + { + if (e.mods.isLeftButtonDown()) + { + ev.xbutton.button = Button1; + ev.xbutton.state |= Button1Mask; + } + else if (e.mods.isRightButtonDown()) + { + ev.xbutton.button = Button3; + ev.xbutton.state |= Button3Mask; + } + else if (e.mods.isMiddleButtonDown()) + { + ev.xbutton.button = Button2; + ev.xbutton.state |= Button2Mask; + } + } + + static void translateJuceToXMotionModifiers (const MouseEvent& e, XEvent& ev) noexcept + { + if (e.mods.isLeftButtonDown()) ev.xmotion.state |= Button1Mask; + else if (e.mods.isRightButtonDown()) ev.xmotion.state |= Button3Mask; + else if (e.mods.isMiddleButtonDown()) ev.xmotion.state |= Button2Mask; + } + + static void translateJuceToXCrossingModifiers (const MouseEvent& e, XEvent& ev) noexcept + { + if (e.mods.isLeftButtonDown()) ev.xcrossing.state |= Button1Mask; + else if (e.mods.isRightButtonDown()) ev.xcrossing.state |= Button3Mask; + else if (e.mods.isMiddleButtonDown()) ev.xcrossing.state |= Button2Mask; + } + + static void translateJuceToXMouseWheelModifiers (const MouseEvent& e, const float increment, XEvent& ev) noexcept + { + if (increment < 0) + { + ev.xbutton.button = Button5; + ev.xbutton.state |= Button5Mask; + } + else if (increment > 0) + { + ev.xbutton.button = Button4; + ev.xbutton.state |= Button4Mask; + } + } +} + +#endif + +//============================================================================== +class ModuleHandle : public ReferenceCountedObject +{ +public: + //============================================================================== + File file; + MainCall moduleMain, customMain; + String pluginName; + ScopedPointer vstXml; + + typedef ReferenceCountedObjectPtr Ptr; + + static Array& getActiveModules() + { + static Array activeModules; + return activeModules; + } + + //============================================================================== + static ModuleHandle* findOrCreateModule (const File& file) + { + for (int i = getActiveModules().size(); --i >= 0;) + { + ModuleHandle* const module = getActiveModules().getUnchecked(i); + + if (module->file == file) + return module; + } + + _fpreset(); // (doesn't do any harm) + + const IdleCallRecursionPreventer icrp; + shellUIDToCreate = 0; + + JUCE_VST_LOG ("Attempting to load VST: " + file.getFullPathName()); + + ScopedPointer m (new ModuleHandle (file)); + + if (! m->open()) + m = nullptr; + + _fpreset(); // (doesn't do any harm) + + return m.release(); + } + + //============================================================================== + ModuleHandle (const File& f) + : file (f), moduleMain (nullptr), customMain (nullptr) + #if JUCE_MAC + #if JUCE_PPC + , fragId (0) + #endif + , resHandle (0), bundleRef (0), resFileId (0) + #endif + { + getActiveModules().add (this); + + #if JUCE_WINDOWS || JUCE_LINUX + fullParentDirectoryPathName = f.getParentDirectory().getFullPathName(); + #elif JUCE_MAC + FSRef ref; + makeFSRefFromPath (&ref, f.getParentDirectory().getFullPathName()); + FSGetCatalogInfo (&ref, kFSCatInfoNone, 0, 0, &parentDirFSSpec, 0); + #endif + } + + ~ModuleHandle() + { + getActiveModules().removeFirstMatchingValue (this); + close(); + } + + //============================================================================== +#if JUCE_WINDOWS || JUCE_LINUX + DynamicLibrary module; + String fullParentDirectoryPathName; + + bool open() + { + pluginName = file.getFileNameWithoutExtension(); + + module.open (file.getFullPathName()); + + moduleMain = (MainCall) module.getFunction ("VSTPluginMain"); + + if (moduleMain == nullptr) + moduleMain = (MainCall) module.getFunction ("main"); + + JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN + + if (moduleMain != nullptr) + { + vstXml = XmlDocument::parse (file.withFileExtension ("vstxml")); + + #if JUCE_WINDOWS + if (vstXml == nullptr) + vstXml = XmlDocument::parse (getDLLResource (file, "VSTXML", 1)); + #endif + } + + return moduleMain != nullptr; + } + + void close() + { + _fpreset(); // (doesn't do any harm) + + module.close(); + } + + void closeEffect (AEffect* eff) + { + eff->dispatcher (eff, effClose, 0, 0, 0, 0); + } + + #if JUCE_WINDOWS + static String getDLLResource (const File& dllFile, const String& type, int resID) + { + DynamicLibrary dll (dllFile.getFullPathName()); + HMODULE dllModule = (HMODULE) dll.getNativeHandle(); + + if (dllModule != INVALID_HANDLE_VALUE) + { + if (HRSRC res = FindResource (dllModule, MAKEINTRESOURCE (resID), type.toWideCharPointer())) + { + if (HGLOBAL hGlob = LoadResource (dllModule, res)) + { + const char* data = static_cast (LockResource (hGlob)); + return String::fromUTF8 (data, SizeofResource (dllModule, res)); + } + } + } + + return String::empty; + } + #endif +#else + #if JUCE_PPC + CFragConnectionID fragId; + #endif + Handle resHandle; + CFBundleRef bundleRef; + FSSpec parentDirFSSpec; + short resFileId; + + bool open() + { + bool ok = false; + + if (file.hasFileExtension (".vst")) + { + const char* const utf8 = file.getFullPathName().toRawUTF8(); + + if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, + strlen (utf8), file.isDirectory())) + { + bundleRef = CFBundleCreate (kCFAllocatorDefault, url); + CFRelease (url); + + if (bundleRef != 0) + { + if (CFBundleLoadExecutable (bundleRef)) + { + moduleMain = (MainCall) CFBundleGetFunctionPointerForName (bundleRef, CFSTR("main_macho")); + + if (moduleMain == nullptr) + moduleMain = (MainCall) CFBundleGetFunctionPointerForName (bundleRef, CFSTR("VSTPluginMain")); + + JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN + + if (moduleMain != nullptr) + { + if (CFTypeRef name = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleName"))) + { + if (CFGetTypeID (name) == CFStringGetTypeID()) + { + char buffer[1024]; + + if (CFStringGetCString ((CFStringRef) name, buffer, sizeof (buffer), CFStringGetSystemEncoding())) + pluginName = buffer; + } + } + + if (pluginName.isEmpty()) + pluginName = file.getFileNameWithoutExtension(); + + resFileId = CFBundleOpenBundleResourceMap (bundleRef); + + ok = true; + + Array vstXmlFiles; + file.getChildFile ("Contents") + .getChildFile ("Resources") + .findChildFiles (vstXmlFiles, File::findFiles, false, "*.vstxml"); + + if (vstXmlFiles.size() > 0) + vstXml = XmlDocument::parse (vstXmlFiles.getReference(0)); + } + } + + if (! ok) + { + CFBundleUnloadExecutable (bundleRef); + CFRelease (bundleRef); + bundleRef = 0; + } + } + } + } + #if JUCE_PPC + else + { + FSRef fn; + + if (FSPathMakeRef ((UInt8*) file.getFullPathName().toRawUTF8(), &fn, 0) == noErr) + { + resFileId = FSOpenResFile (&fn, fsRdPerm); + + if (resFileId != -1) + { + const int numEffs = Count1Resources ('aEff'); + + for (int i = 0; i < numEffs; ++i) + { + resHandle = Get1IndResource ('aEff', i + 1); + + if (resHandle != 0) + { + OSType type; + Str255 name; + SInt16 id; + GetResInfo (resHandle, &id, &type, name); + pluginName = String ((const char*) name + 1, name[0]); + DetachResource (resHandle); + HLock (resHandle); + + ::Ptr ptr; + Str255 errorText; + + OSErr err = GetMemFragment (*resHandle, GetHandleSize (resHandle), + name, kPrivateCFragCopy, + &fragId, &ptr, errorText); + + if (err == noErr) + { + moduleMain = (MainCall) newMachOFromCFM (ptr); + ok = true; + } + else + { + HUnlock (resHandle); + } + + break; + } + } + + if (! ok) + CloseResFile (resFileId); + } + } + } + #endif + + return ok; + } + + void close() + { + #if JUCE_PPC + if (fragId != 0) + { + if (moduleMain != nullptr) + disposeMachOFromCFM ((void*) moduleMain); + + CloseConnection (&fragId); + HUnlock (resHandle); + + if (resFileId != 0) + CloseResFile (resFileId); + } + else + #endif + if (bundleRef != 0) + { + CFBundleCloseBundleResourceMap (bundleRef, resFileId); + + if (CFGetRetainCount (bundleRef) == 1) + CFBundleUnloadExecutable (bundleRef); + + if (CFGetRetainCount (bundleRef) > 0) + CFRelease (bundleRef); + } + } + + void closeEffect (AEffect* eff) + { + #if JUCE_PPC + if (fragId != 0) + { + Array thingsToDelete; + thingsToDelete.add ((void*) eff->dispatcher); + thingsToDelete.add ((void*) eff->process); + thingsToDelete.add ((void*) eff->setParameter); + thingsToDelete.add ((void*) eff->getParameter); + thingsToDelete.add ((void*) eff->processReplacing); + + eff->dispatcher (eff, effClose, 0, 0, 0, 0); + + for (int i = thingsToDelete.size(); --i >= 0;) + disposeMachOFromCFM (thingsToDelete[i]); + } + else + #endif + { + eff->dispatcher (eff, effClose, 0, 0, 0, 0); + } + } + + #if JUCE_PPC + static void* newMachOFromCFM (void* cfmfp) + { + if (cfmfp == 0) + return nullptr; + + UInt32* const mfp = new UInt32[6]; + + mfp[0] = 0x3d800000 | ((UInt32) cfmfp >> 16); + mfp[1] = 0x618c0000 | ((UInt32) cfmfp & 0xffff); + mfp[2] = 0x800c0000; + mfp[3] = 0x804c0004; + mfp[4] = 0x7c0903a6; + mfp[5] = 0x4e800420; + + MakeDataExecutable (mfp, sizeof (UInt32) * 6); + return mfp; + } + + static void disposeMachOFromCFM (void* ptr) + { + delete[] static_cast (ptr); + } + + void coerceAEffectFunctionCalls (AEffect* eff) + { + if (fragId != 0) + { + eff->dispatcher = (AEffectDispatcherProc) newMachOFromCFM ((void*) eff->dispatcher); + eff->process = (AEffectProcessProc) newMachOFromCFM ((void*) eff->process); + eff->setParameter = (AEffectSetParameterProc) newMachOFromCFM ((void*) eff->setParameter); + eff->getParameter = (AEffectGetParameterProc) newMachOFromCFM ((void*) eff->getParameter); + eff->processReplacing = (AEffectProcessProc) newMachOFromCFM ((void*) eff->processReplacing); + } + } + #endif + +#endif + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleHandle) +}; + +static const int defaultVSTSampleRateValue = 44100; +static const int defaultVSTBlockSizeValue = 512; + +//============================================================================== +//============================================================================== +class VSTPluginInstance : public AudioPluginInstance, + private Timer, + private AsyncUpdater +{ +public: + VSTPluginInstance (const ModuleHandle::Ptr& mh) + : effect (nullptr), + module (mh), + usesCocoaNSView (false), + name (mh->pluginName), + wantsMidiMessages (false), + initialised (false), + isPowerOn (false), + tempBuffer (1, 1) + { + try + { + const IdleCallRecursionPreventer icrp; + _fpreset(); + + JUCE_VST_LOG ("Creating VST instance: " + name); + + #if JUCE_MAC + if (module->resFileId != 0) + UseResFile (module->resFileId); + + #if JUCE_PPC + if (module->fragId != 0) + { + static void* audioMasterCoerced = nullptr; + if (audioMasterCoerced == nullptr) + audioMasterCoerced = newCFMFromMachO ((void*) &audioMaster); + + effect = module->moduleMain ((audioMasterCallback) audioMasterCoerced); + } + else + #endif + #endif + { + JUCE_VST_WRAPPER_INVOKE_MAIN + } + + if (effect != nullptr && effect->magic == kEffectMagic) + { + #if JUCE_PPC + module->coerceAEffectFunctionCalls (effect); + #endif + + jassert (effect->resvd2 == 0); + jassert (effect->object != 0); + + _fpreset(); // some dodgy plugs fuck around with this + } + else + { + effect = nullptr; + } + } + catch (...) + {} + } + + ~VSTPluginInstance() + { + const ScopedLock sl (lock); + + if (effect != nullptr && effect->magic == kEffectMagic) + { + #if JUCE_MAC + if (module->resFileId != 0) + UseResFile (module->resFileId); + #endif + + // Must delete any editors before deleting the plugin instance! + jassert (getActiveEditor() == 0); + + _fpreset(); // some dodgy plugs fuck around with this + + module->closeEffect (effect); + } + + module = nullptr; + effect = nullptr; + } + + void fillInPluginDescription (PluginDescription& desc) const override + { + desc.name = name; + + { + char buffer [512] = { 0 }; + dispatch (effGetEffectName, 0, 0, buffer, 0); + + desc.descriptiveName = String::fromUTF8 (buffer).trim(); + + if (desc.descriptiveName.isEmpty()) + desc.descriptiveName = name; + } + + desc.fileOrIdentifier = module->file.getFullPathName(); + desc.uid = getUID(); + desc.lastFileModTime = module->file.getLastModificationTime(); + desc.pluginFormatName = "VST"; + desc.category = getCategory(); + + { + char buffer [kVstMaxVendorStrLen + 8] = { 0 }; + dispatch (effGetVendorString, 0, 0, buffer, 0); + desc.manufacturerName = String::fromUTF8 (buffer); + } + + desc.version = getVersion(); + desc.numInputChannels = getNumInputChannels(); + desc.numOutputChannels = getNumOutputChannels(); + desc.isInstrument = (effect != nullptr && (effect->flags & effFlagsIsSynth) != 0); + } + + void initialise (double initialSampleRate, int initialBlockSize) + { + if (initialised || effect == nullptr) + return; + + #if JUCE_WINDOWS + // On Windows it's highly advisable to create your plugins using the message thread, + // because many plugins need a chance to create HWNDs that will get their + // messages delivered by the main message thread, and that's not possible from + // a background thread. + jassert (MessageManager::getInstance()->isThisTheMessageThread()); + #endif + + JUCE_VST_LOG ("Initialising VST: " + module->pluginName + " (" + getVersion() + ")"); + initialised = true; + + setPlayConfigDetails (effect->numInputs, effect->numOutputs, + initialSampleRate, initialBlockSize); + + dispatch (effIdentify, 0, 0, 0, 0); + + if (getSampleRate() > 0) + dispatch (effSetSampleRate, 0, 0, 0, (float) getSampleRate()); + + if (getBlockSize() > 0) + dispatch (effSetBlockSize, 0, jmax (32, getBlockSize()), 0, 0); + + dispatch (effOpen, 0, 0, 0, 0); + + setPlayConfigDetails (effect->numInputs, effect->numOutputs, + getSampleRate(), getBlockSize()); + + if (getNumPrograms() > 1) + setCurrentProgram (0); + else + dispatch (effSetProgram, 0, 0, 0, 0); + + for (int i = effect->numInputs; --i >= 0;) dispatch (effConnectInput, i, 1, 0, 0); + for (int i = effect->numOutputs; --i >= 0;) dispatch (effConnectOutput, i, 1, 0, 0); + + if (getVstCategory() != kPlugCategShell) // (workaround for Waves 5 plugins which crash during this call) + updateStoredProgramNames(); + + wantsMidiMessages = dispatch (effCanDo, 0, 0, (void*) "receiveVstMidiEvent", 0) > 0; + + #if JUCE_MAC && JUCE_SUPPORT_CARBON + usesCocoaNSView = (dispatch (effCanDo, 0, 0, (void*) "hasCockosViewAsConfig", 0) & 0xffff0000) == 0xbeef0000; + #endif + + setLatencySamples (effect->initialDelay); + } + + void* getPlatformSpecificData() override { return effect; } + const String getName() const override { return name; } + + int getUID() const + { + int uid = effect != nullptr ? effect->uniqueID : 0; + + if (uid == 0) + uid = module->file.hashCode(); + + return uid; + } + + bool silenceInProducesSilenceOut() const override + { + return effect == nullptr || (effect->flags & effFlagsNoSoundInStop) != 0; + } + + double getTailLengthSeconds() const override + { + if (effect == nullptr) + return 0.0; + + const double sampleRate = getSampleRate(); + + if (sampleRate <= 0) + return 0.0; + + VstIntPtr samples = dispatch (effGetTailSize, 0, 0, 0, 0); + return samples / sampleRate; + } + + bool acceptsMidi() const override { return wantsMidiMessages; } + bool producesMidi() const override { return dispatch (effCanDo, 0, 0, (void*) "sendVstMidiEvent", 0) > 0; } + + VstPlugCategory getVstCategory() const noexcept { return (VstPlugCategory) dispatch (effGetPlugCategory, 0, 0, 0, 0); } + + //============================================================================== + void prepareToPlay (double rate, int samplesPerBlockExpected) override + { + setPlayConfigDetails (effect->numInputs, effect->numOutputs, rate, samplesPerBlockExpected); + + vstHostTime.tempo = 120.0; + vstHostTime.timeSigNumerator = 4; + vstHostTime.timeSigDenominator = 4; + vstHostTime.sampleRate = rate; + vstHostTime.samplePos = 0; + vstHostTime.flags = kVstNanosValid | kVstAutomationWriting | kVstAutomationReading; + + initialise (rate, samplesPerBlockExpected); + + if (initialised) + { + wantsMidiMessages = wantsMidiMessages + || (dispatch (effCanDo, 0, 0, (void*) "receiveVstMidiEvent", 0) > 0); + + if (wantsMidiMessages) + midiEventsToSend.ensureSize (256); + else + midiEventsToSend.freeEvents(); + + incomingMidi.clear(); + + dispatch (effSetSampleRate, 0, 0, 0, (float) rate); + dispatch (effSetBlockSize, 0, jmax (16, samplesPerBlockExpected), 0, 0); + + tempBuffer.setSize (jmax (1, effect->numOutputs), samplesPerBlockExpected); + + if (! isPowerOn) + setPower (true); + + // dodgy hack to force some plugins to initialise the sample rate.. + if ((! hasEditor()) && getNumParameters() > 0) + { + const float old = getParameter (0); + setParameter (0, (old < 0.5f) ? 1.0f : 0.0f); + setParameter (0, old); + } + + dispatch (effStartProcess, 0, 0, 0, 0); + + setLatencySamples (effect->initialDelay); + } + } + + void releaseResources() override + { + if (initialised) + { + dispatch (effStopProcess, 0, 0, 0, 0); + setPower (false); + } + + tempBuffer.setSize (1, 1); + incomingMidi.clear(); + + midiEventsToSend.freeEvents(); + } + + void reset() override + { + if (isPowerOn) + { + setPower (false); + setPower (true); + } + } + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override + { + const int numSamples = buffer.getNumSamples(); + + if (initialised) + { + if (AudioPlayHead* const playHead = getPlayHead()) + { + AudioPlayHead::CurrentPositionInfo position; + playHead->getCurrentPosition (position); + + vstHostTime.samplePos = (double) position.timeInSamples; + vstHostTime.tempo = position.bpm; + vstHostTime.timeSigNumerator = position.timeSigNumerator; + vstHostTime.timeSigDenominator = position.timeSigDenominator; + vstHostTime.ppqPos = position.ppqPosition; + vstHostTime.barStartPos = position.ppqPositionOfLastBarStart; + vstHostTime.flags |= kVstTempoValid | kVstTimeSigValid | kVstPpqPosValid | kVstBarsValid; + + VstInt32 newTransportFlags = 0; + if (position.isPlaying) newTransportFlags |= kVstTransportPlaying; + if (position.isRecording) newTransportFlags |= kVstTransportRecording; + + if (newTransportFlags != (vstHostTime.flags & (kVstTransportPlaying | kVstTransportRecording))) + vstHostTime.flags = (vstHostTime.flags & ~(kVstTransportPlaying | kVstTransportRecording)) | newTransportFlags | kVstTransportChanged; + else + vstHostTime.flags &= ~kVstTransportChanged; + + switch (position.frameRate) + { + case AudioPlayHead::fps24: setHostTimeFrameRate (0, 24.0, position.timeInSeconds); break; + case AudioPlayHead::fps25: setHostTimeFrameRate (1, 25.0, position.timeInSeconds); break; + case AudioPlayHead::fps2997: setHostTimeFrameRate (2, 29.97, position.timeInSeconds); break; + case AudioPlayHead::fps30: setHostTimeFrameRate (3, 30.0, position.timeInSeconds); break; + case AudioPlayHead::fps2997drop: setHostTimeFrameRate (4, 29.97, position.timeInSeconds); break; + case AudioPlayHead::fps30drop: setHostTimeFrameRate (5, 29.97, position.timeInSeconds); break; + default: break; + } + + if (position.isLooping) + { + vstHostTime.cycleStartPos = position.ppqLoopStart; + vstHostTime.cycleEndPos = position.ppqLoopEnd; + vstHostTime.flags |= kVstCyclePosValid; + } + else + { + vstHostTime.flags &= ~kVstCyclePosValid; + } + } + + vstHostTime.nanoSeconds = getVSTHostTimeNanoseconds(); + + if (wantsMidiMessages) + { + midiEventsToSend.clear(); + midiEventsToSend.ensureSize (1); + + MidiBuffer::Iterator iter (midiMessages); + const uint8* midiData; + int numBytesOfMidiData, samplePosition; + + while (iter.getNextEvent (midiData, numBytesOfMidiData, samplePosition)) + { + midiEventsToSend.addEvent (midiData, numBytesOfMidiData, + jlimit (0, numSamples - 1, samplePosition)); + } + + effect->dispatcher (effect, effProcessEvents, 0, 0, midiEventsToSend.events, 0); + } + + _clearfp(); + + if ((effect->flags & effFlagsCanReplacing) != 0) + { + effect->processReplacing (effect, buffer.getArrayOfWritePointers(), buffer.getArrayOfWritePointers(), numSamples); + } + else + { + tempBuffer.setSize (effect->numOutputs, numSamples); + tempBuffer.clear(); + + effect->process (effect, buffer.getArrayOfWritePointers(), tempBuffer.getArrayOfWritePointers(), numSamples); + + for (int i = effect->numOutputs; --i >= 0;) + buffer.copyFrom (i, 0, tempBuffer.getReadPointer (i), numSamples); + } + } + else + { + // Not initialised, so just bypass.. + for (int i = 0; i < getNumOutputChannels(); ++i) + buffer.clear (i, 0, buffer.getNumSamples()); + } + + { + // copy any incoming midi.. + const ScopedLock sl (midiInLock); + + midiMessages.swapWith (incomingMidi); + incomingMidi.clear(); + } + } + + //============================================================================== + bool hasEditor() const override { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; } + AudioProcessorEditor* createEditor() override; + + //============================================================================== + const String getInputChannelName (int index) const override + { + if (index >= 0 && index < getNumInputChannels()) + { + VstPinProperties pinProps; + if (dispatch (effGetInputProperties, index, 0, &pinProps, 0.0f) != 0) + return String (pinProps.label, sizeof (pinProps.label)); + } + + return String::empty; + } + + bool isInputChannelStereoPair (int index) const override + { + if (index < 0 || index >= getNumInputChannels()) + return false; + + VstPinProperties pinProps; + if (dispatch (effGetInputProperties, index, 0, &pinProps, 0.0f) != 0) + return (pinProps.flags & kVstPinIsStereo) != 0; + + return true; + } + + const String getOutputChannelName (int index) const override + { + if (index >= 0 && index < getNumOutputChannels()) + { + VstPinProperties pinProps; + if (dispatch (effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0) + return String (pinProps.label, sizeof (pinProps.label)); + } + + return String::empty; + } + + bool isOutputChannelStereoPair (int index) const override + { + if (index < 0 || index >= getNumOutputChannels()) + return false; + + VstPinProperties pinProps; + if (dispatch (effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0) + return (pinProps.flags & kVstPinIsStereo) != 0; + + return true; + } + + bool isValidChannel (int index, bool isInput) const + { + return isPositiveAndBelow (index, isInput ? getNumInputChannels() : getNumOutputChannels()); + } + + //============================================================================== + int getNumParameters() { return effect != nullptr ? effect->numParams : 0; } + + float getParameter (int index) override + { + if (effect != nullptr && isPositiveAndBelow (index, (int) effect->numParams)) + { + const ScopedLock sl (lock); + return effect->getParameter (effect, index); + } + + return 0.0f; + } + + void setParameter (int index, float newValue) override + { + if (effect != nullptr && isPositiveAndBelow (index, (int) effect->numParams)) + { + const ScopedLock sl (lock); + + if (effect->getParameter (effect, index) != newValue) + effect->setParameter (effect, index, newValue); + } + } + + const String getParameterName (int index) override { return getTextForOpcode (index, effGetParamName); } + const String getParameterText (int index) override { return getTextForOpcode (index, effGetParamDisplay); } + String getParameterLabel (int index) const override { return getTextForOpcode (index, effGetParamLabel); } + + bool isParameterAutomatable (int index) const override + { + if (effect != nullptr) + { + jassert (index >= 0 && index < effect->numParams); + return dispatch (effCanBeAutomated, index, 0, 0, 0) != 0; + } + + return false; + } + + //============================================================================== + int getNumPrograms() override { return effect != nullptr ? jmax (0, effect->numPrograms) : 0; } + + // NB: some plugs return negative numbers from this function. + int getCurrentProgram() override { return (int) dispatch (effGetProgram, 0, 0, 0, 0); } + + void setCurrentProgram (int newIndex) override + { + if (getNumPrograms() > 0 && newIndex != getCurrentProgram()) + dispatch (effSetProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0); + } + + const String getProgramName (int index) override + { + if (index >= 0) + { + if (index == getCurrentProgram()) + return getCurrentProgramName(); + + if (effect != nullptr) + { + char nm[264] = { 0 }; + + if (dispatch (effGetProgramNameIndexed, jlimit (0, getNumPrograms(), index), -1, nm, 0) != 0) + return String::fromUTF8 (nm).trim(); + } + } + + return programNames [index]; + } + + void changeProgramName (int index, const String& newName) override + { + if (index >= 0 && index == getCurrentProgram()) + { + if (getNumPrograms() > 0 && newName != getCurrentProgramName()) + dispatch (effSetProgramName, 0, 0, (void*) newName.substring (0, 24).toRawUTF8(), 0.0f); + } + else + { + jassertfalse; // xxx not implemented! + } + } + + //============================================================================== + void getStateInformation (MemoryBlock& mb) override { saveToFXBFile (mb, true); } + void getCurrentProgramStateInformation (MemoryBlock& mb) override { saveToFXBFile (mb, false); } + + void setStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } + void setCurrentProgramStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } + + //============================================================================== + void timerCallback() override + { + if (dispatch (effIdle, 0, 0, 0, 0) == 0) + stopTimer(); + } + + void handleAsyncUpdate() override + { + // indicates that something about the plugin has changed.. + updateHostDisplay(); + } + + VstIntPtr handleCallback (VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) + { + switch (opcode) + { + case audioMasterAutomate: sendParamChangeMessageToListeners (index, opt); break; + case audioMasterProcessEvents: handleMidiFromPlugin ((const VstEvents*) ptr); break; + + #if JUCE_MSVC + #pragma warning (push) + #pragma warning (disable: 4311) + #endif + case audioMasterGetTime: return (VstIntPtr) &vstHostTime; + #if JUCE_MSVC + #pragma warning (pop) + #endif + + case audioMasterIdle: + if (insideVSTCallback == 0 && MessageManager::getInstance()->isThisTheMessageThread()) + { + const IdleCallRecursionPreventer icrp; + + #if JUCE_MAC + if (getActiveEditor() != nullptr) + dispatch (effEditIdle, 0, 0, 0, 0); + #endif + + Timer::callPendingTimersSynchronously(); + + handleUpdateNowIfNeeded(); + + for (int i = ComponentPeer::getNumPeers(); --i >= 0;) + if (ComponentPeer* p = ComponentPeer::getPeer(i)) + p->performAnyPendingRepaintsNow(); + } + break; + + case audioMasterSizeWindow: + if (AudioProcessorEditor* ed = getActiveEditor()) + ed->setSize (index, (int) value); + + return 1; + + case audioMasterUpdateDisplay: triggerAsyncUpdate(); break; + case audioMasterIOChanged: setLatencySamples (effect->initialDelay); break; + case audioMasterNeedIdle: startTimer (50); break; + + case audioMasterGetSampleRate: return (VstIntPtr) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue); + case audioMasterGetBlockSize: return (VstIntPtr) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue); + case audioMasterWantMidi: wantsMidiMessages = true; break; + case audioMasterGetDirectory: return getVstDirectory(); + + case audioMasterTempoAt: + if (extraFunctions != nullptr) + return (VstIntPtr) extraFunctions->getTempoAt ((int64) value); + + break; + + case audioMasterGetAutomationState: + if (extraFunctions != nullptr) + return (VstIntPtr) extraFunctions->getAutomationState(); + + break; + + case audioMasterPinConnected: + return isValidChannel (index, value == 0) ? 0 : 1; // (yes, 0 = true) + + case audioMasterGetCurrentProcessLevel: + return isNonRealtime() ? 4 : 0; + + // none of these are handled (yet).. + case audioMasterBeginEdit: + case audioMasterEndEdit: + case audioMasterSetTime: + case audioMasterGetParameterQuantization: + case audioMasterGetInputLatency: + case audioMasterGetOutputLatency: + case audioMasterGetPreviousPlug: + case audioMasterGetNextPlug: + case audioMasterWillReplaceOrAccumulate: + case audioMasterOfflineStart: + case audioMasterOfflineRead: + case audioMasterOfflineWrite: + case audioMasterOfflineGetCurrentPass: + case audioMasterOfflineGetCurrentMetaPass: + case audioMasterVendorSpecific: + case audioMasterSetIcon: + case audioMasterGetLanguage: + case audioMasterOpenWindow: + case audioMasterCloseWindow: + break; + + default: + return handleGeneralCallback (opcode, index, value, ptr, opt); + } + + return 0; + } + + // handles non plugin-specific callbacks.. + static VstIntPtr handleGeneralCallback (VstInt32 opcode, VstInt32 /*index*/, VstIntPtr /*value*/, void *ptr, float /*opt*/) + { + switch (opcode) + { + case audioMasterCanDo: + { + static const char* canDos[] = { "supplyIdle", + "sendVstEvents", + "sendVstMidiEvent", + "sendVstTimeInfo", + "receiveVstEvents", + "receiveVstMidiEvent", + "supportShell", + "shellCategory" }; + + for (int i = 0; i < numElementsInArray (canDos); ++i) + if (strcmp (canDos[i], (const char*) ptr) == 0) + return 1; + + return 0; + } + + case audioMasterVersion: return 2400; + case audioMasterCurrentId: return shellUIDToCreate; + case audioMasterGetNumAutomatableParameters: return 0; + case audioMasterGetAutomationState: return 1; + case audioMasterGetVendorVersion: return 0x0101; + + case audioMasterGetVendorString: + case audioMasterGetProductString: + { + String hostName ("Juce VST Host"); + + if (JUCEApplicationBase* app = JUCEApplicationBase::getInstance()) + hostName = app->getApplicationName(); + + hostName.copyToUTF8 ((char*) ptr, (size_t) jmin (kVstMaxVendorStrLen, kVstMaxProductStrLen) - 1); + break; + } + + case audioMasterGetSampleRate: return (VstIntPtr) defaultVSTSampleRateValue; + case audioMasterGetBlockSize: return (VstIntPtr) defaultVSTBlockSizeValue; + case audioMasterSetOutputSampleRate: return 0; + + default: + DBG ("*** Unhandled VST Callback: " + String ((int) opcode)); + break; + } + + return 0; + } + + //============================================================================== + VstIntPtr dispatch (const int opcode, const int index, const VstIntPtr value, void* const ptr, float opt) const + { + VstIntPtr result = 0; + + if (effect != nullptr) + { + const ScopedLock sl (lock); + const IdleCallRecursionPreventer icrp; + + try + { + #if JUCE_MAC + const ResFileRefNum oldResFile = CurResFile(); + + if (module->resFileId != 0) + UseResFile (module->resFileId); + #endif + + result = effect->dispatcher (effect, opcode, index, value, ptr, opt); + + #if JUCE_MAC + const ResFileRefNum newResFile = CurResFile(); + if (newResFile != oldResFile) // avoid confusing the parent app's resource file with the plug-in's + { + module->resFileId = newResFile; + UseResFile (oldResFile); + } + #endif + } + catch (...) + {} + } + + return result; + } + + bool loadFromFXBFile (const void* const data, const size_t dataSize) + { + if (dataSize < 28) + return false; + + const fxSet* const set = (const fxSet*) data; + + if ((set->chunkMagic != fxbName ("CcnK") && set->chunkMagic != fxbName ("KncC")) + || fxbSwap (set->version) > fxbVersionNum) + return false; + + if (set->fxMagic == fxbName ("FxBk")) + { + // bank of programs + if (fxbSwap (set->numPrograms) >= 0) + { + const int oldProg = getCurrentProgram(); + const int numParams = fxbSwap (((const fxProgram*) (set->programs))->numParams); + const int progLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); + + for (int i = 0; i < fxbSwap (set->numPrograms); ++i) + { + if (i != oldProg) + { + const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + i * progLen); + if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize) + return false; + + if (fxbSwap (set->numPrograms) > 0) + setCurrentProgram (i); + + if (! restoreProgramSettings (prog)) + return false; + } + } + + if (fxbSwap (set->numPrograms) > 0) + setCurrentProgram (oldProg); + + const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + oldProg * progLen); + if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize) + return false; + + if (! restoreProgramSettings (prog)) + return false; + } + } + else if (set->fxMagic == fxbName ("FxCk")) + { + // single program + const fxProgram* const prog = (const fxProgram*) data; + + if (prog->chunkMagic != fxbName ("CcnK")) + return false; + + changeProgramName (getCurrentProgram(), prog->prgName); + + for (int i = 0; i < fxbSwap (prog->numParams); ++i) + setParameter (i, fxbSwapFloat (prog->params[i])); + } + else if (set->fxMagic == fxbName ("FBCh") || set->fxMagic == fxbName ("hCBF")) + { + // non-preset chunk + const fxChunkSet* const cset = (const fxChunkSet*) data; + + if (fxbSwap (cset->chunkSize) + sizeof (fxChunkSet) - 8 > (unsigned int) dataSize) + return false; + + setChunkData (cset->chunk, fxbSwap (cset->chunkSize), false); + } + else if (set->fxMagic == fxbName ("FPCh") || set->fxMagic == fxbName ("hCPF")) + { + // preset chunk + const fxProgramSet* const cset = (const fxProgramSet*) data; + + if (fxbSwap (cset->chunkSize) + sizeof (fxProgramSet) - 8 > (unsigned int) dataSize) + return false; + + setChunkData (cset->chunk, fxbSwap (cset->chunkSize), true); + + changeProgramName (getCurrentProgram(), cset->name); + } + else + { + return false; + } + + return true; + } + + bool saveToFXBFile (MemoryBlock& dest, bool isFXB, int maxSizeMB = 128) + { + const int numPrograms = getNumPrograms(); + const int numParams = getNumParameters(); + + if (usesChunks()) + { + MemoryBlock chunk; + getChunkData (chunk, ! isFXB, maxSizeMB); + + if (isFXB) + { + const size_t totalLen = sizeof (fxChunkSet) + chunk.getSize() - 8; + dest.setSize (totalLen, true); + + fxChunkSet* const set = (fxChunkSet*) dest.getData(); + set->chunkMagic = fxbName ("CcnK"); + set->byteSize = 0; + set->fxMagic = fxbName ("FBCh"); + set->version = fxbSwap (fxbVersionNum); + set->fxID = fxbSwap (getUID()); + set->fxVersion = fxbSwap (getVersionNumber()); + set->numPrograms = fxbSwap (numPrograms); + set->chunkSize = fxbSwap ((VstInt32) chunk.getSize()); + + chunk.copyTo (set->chunk, 0, chunk.getSize()); + } + else + { + const size_t totalLen = sizeof (fxProgramSet) + chunk.getSize() - 8; + dest.setSize (totalLen, true); + + fxProgramSet* const set = (fxProgramSet*) dest.getData(); + set->chunkMagic = fxbName ("CcnK"); + set->byteSize = 0; + set->fxMagic = fxbName ("FPCh"); + set->version = fxbSwap (fxbVersionNum); + set->fxID = fxbSwap (getUID()); + set->fxVersion = fxbSwap (getVersionNumber()); + set->numPrograms = fxbSwap (numPrograms); + set->chunkSize = fxbSwap ((VstInt32) chunk.getSize()); + + getCurrentProgramName().copyToUTF8 (set->name, sizeof (set->name) - 1); + chunk.copyTo (set->chunk, 0, chunk.getSize()); + } + } + else + { + if (isFXB) + { + const int progLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); + const int len = (sizeof (fxSet) - sizeof (fxProgram)) + progLen * jmax (1, numPrograms); + dest.setSize (len, true); + + fxSet* const set = (fxSet*) dest.getData(); + set->chunkMagic = fxbName ("CcnK"); + set->byteSize = 0; + set->fxMagic = fxbName ("FxBk"); + set->version = fxbSwap (fxbVersionNum); + set->fxID = fxbSwap (getUID()); + set->fxVersion = fxbSwap (getVersionNumber()); + set->numPrograms = fxbSwap (numPrograms); + + const int oldProgram = getCurrentProgram(); + MemoryBlock oldSettings; + createTempParameterStore (oldSettings); + + setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + oldProgram * progLen)); + + for (int i = 0; i < numPrograms; ++i) + { + if (i != oldProgram) + { + setCurrentProgram (i); + setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + i * progLen)); + } + } + + setCurrentProgram (oldProgram); + restoreFromTempParameterStore (oldSettings); + } + else + { + const int totalLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); + dest.setSize (totalLen, true); + + setParamsInProgramBlock ((fxProgram*) dest.getData()); + } + } + + return true; + } + + bool usesChunks() const noexcept { return effect != nullptr && (effect->flags & effFlagsProgramChunks) != 0; } + + bool getChunkData (MemoryBlock& mb, bool isPreset, int maxSizeMB) const + { + if (usesChunks()) + { + void* data = nullptr; + const VstIntPtr bytes = dispatch (effGetChunk, isPreset ? 1 : 0, 0, &data, 0.0f); + + if (data != nullptr && bytes <= maxSizeMB * 1024 * 1024) + { + mb.setSize (bytes); + mb.copyFrom (data, 0, bytes); + + return true; + } + } + + return false; + } + + bool setChunkData (const void* data, const int size, bool isPreset) + { + if (size > 0 && usesChunks()) + { + dispatch (effSetChunk, isPreset ? 1 : 0, size, (void*) data, 0.0f); + + if (! isPreset) + updateStoredProgramNames(); + + return true; + } + + return false; + } + + AEffect* effect; + ModuleHandle::Ptr module; + + ScopedPointer extraFunctions; + bool usesCocoaNSView; + +private: + String name; + CriticalSection lock; + bool wantsMidiMessages, initialised, isPowerOn; + mutable StringArray programNames; + AudioSampleBuffer tempBuffer; + CriticalSection midiInLock; + MidiBuffer incomingMidi; + VSTMidiEventList midiEventsToSend; + VstTimeInfo vstHostTime; + + //============================================================================== + void setHostTimeFrameRate (long frameRateIndex, double frameRate, double currentTime) noexcept + { + vstHostTime.flags |= kVstSmpteValid; + vstHostTime.smpteFrameRate = (VstInt32) frameRateIndex; + vstHostTime.smpteOffset = (VstInt32) (currentTime * 80.0 * frameRate + 0.5); + } + + bool restoreProgramSettings (const fxProgram* const prog) + { + if (prog->chunkMagic == fxbName ("CcnK") && prog->fxMagic == fxbName ("FxCk")) + { + changeProgramName (getCurrentProgram(), prog->prgName); + + for (int i = 0; i < fxbSwap (prog->numParams); ++i) + setParameter (i, fxbSwapFloat (prog->params[i])); + + return true; + } + + return false; + } + + String getTextForOpcode (const int index, const AEffectOpcodes opcode) const + { + if (effect == nullptr) + return String::empty; + + jassert (index >= 0 && index < effect->numParams); + char nm [256] = { 0 }; + dispatch (opcode, index, 0, nm, 0); + return String (CharPointer_UTF8 (nm)).trim(); + } + + String getCurrentProgramName() + { + String progName; + + if (effect != nullptr) + { + { + char nm[256] = { 0 }; + dispatch (effGetProgramName, 0, 0, nm, 0); + progName = String (CharPointer_UTF8 (nm)).trim(); + } + + const int index = getCurrentProgram(); + + if (index >= 0 && programNames[index].isEmpty()) + { + while (programNames.size() < index) + programNames.add (String::empty); + + programNames.set (index, progName); + } + } + + return progName; + } + + void setParamsInProgramBlock (fxProgram* const prog) + { + const int numParams = getNumParameters(); + + prog->chunkMagic = fxbName ("CcnK"); + prog->byteSize = 0; + prog->fxMagic = fxbName ("FxCk"); + prog->version = fxbSwap (fxbVersionNum); + prog->fxID = fxbSwap (getUID()); + prog->fxVersion = fxbSwap (getVersionNumber()); + prog->numParams = fxbSwap (numParams); + + getCurrentProgramName().copyToUTF8 (prog->prgName, sizeof (prog->prgName) - 1); + + for (int i = 0; i < numParams; ++i) + prog->params[i] = fxbSwapFloat (getParameter (i)); + } + + void updateStoredProgramNames() + { + if (effect != nullptr && getNumPrograms() > 0) + { + char nm[256] = { 0 }; + + // only do this if the plugin can't use indexed names.. + if (dispatch (effGetProgramNameIndexed, 0, -1, nm, 0) == 0) + { + const int oldProgram = getCurrentProgram(); + MemoryBlock oldSettings; + createTempParameterStore (oldSettings); + + for (int i = 0; i < getNumPrograms(); ++i) + { + setCurrentProgram (i); + getCurrentProgramName(); // (this updates the list) + } + + setCurrentProgram (oldProgram); + restoreFromTempParameterStore (oldSettings); + } + } + } + + void handleMidiFromPlugin (const VstEvents* const events) + { + if (events != nullptr) + { + const ScopedLock sl (midiInLock); + VSTMidiEventList::addEventsToMidiBuffer (events, incomingMidi); + } + } + + //============================================================================== + void createTempParameterStore (MemoryBlock& dest) + { + dest.setSize (64 + 4 * getNumParameters()); + dest.fillWith (0); + + getCurrentProgramName().copyToUTF8 ((char*) dest.getData(), 63); + + float* const p = (float*) (((char*) dest.getData()) + 64); + for (int i = 0; i < getNumParameters(); ++i) + p[i] = getParameter(i); + } + + void restoreFromTempParameterStore (const MemoryBlock& m) + { + changeProgramName (getCurrentProgram(), (const char*) m.getData()); + + float* p = (float*) (((char*) m.getData()) + 64); + for (int i = 0; i < getNumParameters(); ++i) + setParameter (i, p[i]); + } + + VstIntPtr getVstDirectory() const + { + #if JUCE_MAC + return (VstIntPtr) (void*) &module->parentDirFSSpec; + #else + return (VstIntPtr) (pointer_sized_uint) module->fullParentDirectoryPathName.toRawUTF8(); + #endif + } + + //============================================================================== + int getVersionNumber() const noexcept { return effect != nullptr ? effect->version : 0; } + + String getVersion() const + { + unsigned int v = (unsigned int) dispatch (effGetVendorVersion, 0, 0, 0, 0); + + String s; + + if (v == 0 || (int) v == -1) + v = getVersionNumber(); + + if (v != 0) + { + int versionBits[32]; + int n = 0; + + for (int vv = v; vv != 0; vv /= 10) + versionBits [n++] = vv % 10; + + if (n > 4) // if the number ends up silly, it's probably encoded as hex instead of decimal.. + { + n = 0; + + for (int vv = v; vv != 0; vv >>= 8) + versionBits [n++] = vv & 255; + } + + while (n > 1 && versionBits [n - 1] == 0) + --n; + + s << 'V'; + + while (n > 0) + { + s << versionBits [--n]; + + if (n > 0) + s << '.'; + } + } + + return s; + } + + const char* getCategory() const + { + switch (getVstCategory()) + { + case kPlugCategEffect: return "Effect"; + case kPlugCategSynth: return "Synth"; + case kPlugCategAnalysis: return "Analysis"; + case kPlugCategMastering: return "Mastering"; + case kPlugCategSpacializer: return "Spacial"; + case kPlugCategRoomFx: return "Reverb"; + case kPlugSurroundFx: return "Surround"; + case kPlugCategRestoration: return "Restoration"; + case kPlugCategGenerator: return "Tone generation"; + default: break; + } + + return nullptr; + } + + void setPower (const bool on) + { + dispatch (effMainsChanged, 0, on ? 1 : 0, 0, 0); + isPowerOn = on; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginInstance) +}; + +//============================================================================== +class VSTPluginWindow; +static Array activeVSTWindows; + +//============================================================================== +class VSTPluginWindow : public AudioProcessorEditor, + #if ! JUCE_MAC + public ComponentMovementWatcher, + #endif + public Timer +{ +public: + VSTPluginWindow (VSTPluginInstance& plug) + : AudioProcessorEditor (&plug), + #if ! JUCE_MAC + ComponentMovementWatcher (this), + #endif + plugin (plug), + isOpen (false), + recursiveResize (false), + pluginWantsKeys (false), + pluginRefusesToResize (false), + alreadyInside (false) + { + #if JUCE_WINDOWS + pluginHWND = 0; + sizeCheckCount = 0; + + #elif JUCE_LINUX + pluginWindow = None; + pluginProc = None; + + #elif JUCE_MAC + #if JUCE_SUPPORT_CARBON + if (! plug.usesCocoaNSView) + addAndMakeVisible (carbonWrapper = new CarbonWrapperComponent (*this)); + else + #endif + addAndMakeVisible (cocoaWrapper = new AutoResizingNSViewComponentWithParent()); + #endif + + activeVSTWindows.add (this); + + setSize (1, 1); + setOpaque (true); + setVisible (true); + } + + ~VSTPluginWindow() + { + closePluginWindow(); + + #if JUCE_MAC + #if JUCE_SUPPORT_CARBON + carbonWrapper = nullptr; + #endif + cocoaWrapper = nullptr; + #endif + + activeVSTWindows.removeFirstMatchingValue (this); + plugin.editorBeingDeleted (this); + } + + //============================================================================== + #if ! JUCE_MAC + void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override + { + if (recursiveResize) + return; + + Component* const topComp = getTopLevelComponent(); + + if (topComp->getPeer() != nullptr) + { + const Point pos (topComp->getLocalPoint (this, Point())); + + recursiveResize = true; + + #if JUCE_WINDOWS + if (pluginHWND != 0) + MoveWindow (pluginHWND, pos.getX(), pos.getY(), getWidth(), getHeight(), TRUE); + #elif JUCE_LINUX + if (pluginWindow != 0) + { + XResizeWindow (display, pluginWindow, getWidth(), getHeight()); + XMoveWindow (display, pluginWindow, pos.getX(), pos.getY()); + XMapRaised (display, pluginWindow); + } + #endif + + recursiveResize = false; + } + } + + void componentVisibilityChanged() override + { + if (isShowing()) + openPluginWindow(); + else if (! shouldAvoidDeletingWindow()) + closePluginWindow(); + + componentMovedOrResized (true, true); + } + + void componentPeerChanged() override + { + closePluginWindow(); + openPluginWindow(); + } + #endif + + #if JUCE_MAC + void visibilityChanged() override + { + if (cocoaWrapper != nullptr) + { + if (isVisible()) + openPluginWindow ((NSView*) cocoaWrapper->getView()); + else + closePluginWindow(); + } + } + + void childBoundsChanged (Component*) override + { + if (cocoaWrapper != nullptr) + { + int w = cocoaWrapper->getWidth(); + int h = cocoaWrapper->getHeight(); + + if (w != getWidth() || h != getHeight()) + setSize (w, h); + } + } + #endif + + //============================================================================== + bool keyStateChanged (bool) override { return pluginWantsKeys; } + bool keyPressed (const juce::KeyPress&) override { return pluginWantsKeys; } + + //============================================================================== + #if JUCE_MAC + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + #else + void paint (Graphics& g) override + { + if (isOpen) + { + #if JUCE_LINUX + if (pluginWindow != 0) + { + const Rectangle clip (g.getClipBounds()); + + XEvent ev = { 0 }; + ev.xexpose.type = Expose; + ev.xexpose.display = display; + ev.xexpose.window = pluginWindow; + ev.xexpose.x = clip.getX(); + ev.xexpose.y = clip.getY(); + ev.xexpose.width = clip.getWidth(); + ev.xexpose.height = clip.getHeight(); + + sendEventToChild (ev); + } + #endif + } + else + { + g.fillAll (Colours::black); + } + } + #endif + + //============================================================================== + void timerCallback() override + { + if (isShowing()) + { + #if JUCE_WINDOWS + if (--sizeCheckCount <= 0) + { + sizeCheckCount = 10; + checkPluginWindowSize(); + } + #endif + + static bool reentrant = false; + + if (! reentrant) + { + reentrant = true; + plugin.dispatch (effEditIdle, 0, 0, 0, 0); + reentrant = false; + } + } + } + + //============================================================================== + void mouseDown (const MouseEvent& e) override + { + (void) e; + + #if JUCE_LINUX + if (pluginWindow == 0) + return; + + toFront (true); + + XEvent ev; + prepareXEvent (ev, e); + ev.xbutton.type = ButtonPress; + translateJuceToXButtonModifiers (e, ev); + sendEventToChild (ev); + + #elif JUCE_WINDOWS + toFront (true); + #endif + } + + void broughtToFront() override + { + activeVSTWindows.removeFirstMatchingValue (this); + activeVSTWindows.add (this); + + #if JUCE_MAC + dispatch (effEditTop, 0, 0, 0, 0); + #endif + } + + //============================================================================== +private: + VSTPluginInstance& plugin; + bool isOpen, recursiveResize; + bool pluginWantsKeys, pluginRefusesToResize, alreadyInside; + + #if JUCE_WINDOWS + HWND pluginHWND; + void* originalWndProc; + int sizeCheckCount; + #elif JUCE_LINUX + Window pluginWindow; + EventProcPtr pluginProc; + #endif + + // This is a workaround for old Mackie plugins that crash if their + // window is deleted more than once. + bool shouldAvoidDeletingWindow() const + { + return plugin.getPluginDescription() + .manufacturerName.containsIgnoreCase ("Loud Technologies"); + } + + // This is an old workaround for some plugins that need a repaint when their + // windows are first created, but it breaks some Izotope plugins.. + bool shouldRepaintCarbonWindowWhenCreated() + { + return ! plugin.getName().containsIgnoreCase ("izotope"); + } + + //============================================================================== +#if JUCE_MAC + void openPluginWindow (void* parentWindow) + { + if (isOpen || parentWindow == 0) + return; + + isOpen = true; + + ERect* rect = nullptr; + dispatch (effEditGetRect, 0, 0, &rect, 0); + dispatch (effEditOpen, 0, 0, parentWindow, 0); + + // do this before and after like in the steinberg example + dispatch (effEditGetRect, 0, 0, &rect, 0); + dispatch (effGetProgram, 0, 0, 0, 0); // also in steinberg code + + // Install keyboard hooks + pluginWantsKeys = (dispatch (effKeysRequired, 0, 0, 0, 0) == 0); + + // double-check it's not too tiny + int w = 250, h = 150; + + if (rect != nullptr) + { + w = rect->right - rect->left; + h = rect->bottom - rect->top; + + if (w == 0 || h == 0) + { + w = 250; + h = 150; + } + } + + w = jmax (w, 32); + h = jmax (h, 32); + + setSize (w, h); + + startTimer (18 + juce::Random::getSystemRandom().nextInt (5)); + repaint(); + } + +#else + void openPluginWindow() + { + if (isOpen || getWindowHandle() == 0) + return; + + JUCE_VST_LOG ("Opening VST UI: " + plugin.getName()); + isOpen = true; + + ERect* rect = nullptr; + dispatch (effEditGetRect, 0, 0, &rect, 0); + dispatch (effEditOpen, 0, 0, getWindowHandle(), 0); + + // do this before and after like in the steinberg example + dispatch (effEditGetRect, 0, 0, &rect, 0); + dispatch (effGetProgram, 0, 0, 0, 0); // also in steinberg code + + // Install keyboard hooks + pluginWantsKeys = (dispatch (effKeysRequired, 0, 0, 0, 0) == 0); + + #if JUCE_WINDOWS + originalWndProc = 0; + pluginHWND = GetWindow ((HWND) getWindowHandle(), GW_CHILD); + + if (pluginHWND == 0) + { + isOpen = false; + setSize (300, 150); + return; + } + + #pragma warning (push) + #pragma warning (disable: 4244) + + if (! pluginWantsKeys) + { + originalWndProc = (void*) GetWindowLongPtr (pluginHWND, GWLP_WNDPROC); + SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) vstHookWndProc); + } + + #pragma warning (pop) + + RECT r; + GetWindowRect (pluginHWND, &r); + int w = r.right - r.left; + int h = r.bottom - r.top; + + if (rect != nullptr) + { + const int rw = rect->right - rect->left; + const int rh = rect->bottom - rect->top; + + if ((rw > 50 && rh > 50 && rw < 2000 && rh < 2000 && rw != w && rh != h) + || ((w == 0 && rw > 0) || (h == 0 && rh > 0))) + { + // very dodgy logic to decide which size is right. + if (abs (rw - w) > 350 || abs (rh - h) > 350) + { + SetWindowPos (pluginHWND, 0, + 0, 0, rw, rh, + SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); + + GetWindowRect (pluginHWND, &r); + + w = r.right - r.left; + h = r.bottom - r.top; + + pluginRefusesToResize = (w != rw) || (h != rh); + + w = rw; + h = rh; + } + } + } + + #elif JUCE_LINUX + pluginWindow = getChildWindow ((Window) getWindowHandle()); + + if (pluginWindow != 0) + pluginProc = (EventProcPtr) getPropertyFromXWindow (pluginWindow, + XInternAtom (display, "_XEventProc", False)); + + int w = 250, h = 150; + + if (rect != nullptr) + { + w = rect->right - rect->left; + h = rect->bottom - rect->top; + + if (w == 0 || h == 0) + { + w = 250; + h = 150; + } + } + + if (pluginWindow != 0) + XMapRaised (display, pluginWindow); + #endif + + // double-check it's not too tiny + w = jmax (w, 32); + h = jmax (h, 32); + + setSize (w, h); + + #if JUCE_WINDOWS + checkPluginWindowSize(); + #endif + + startTimer (18 + juce::Random::getSystemRandom().nextInt (5)); + repaint(); + } +#endif + + //============================================================================== + void closePluginWindow() + { + if (isOpen) + { + JUCE_VST_LOG ("Closing VST UI: " + plugin.getName()); + isOpen = false; + dispatch (effEditClose, 0, 0, 0, 0); + stopTimer(); + + #if JUCE_WINDOWS + #pragma warning (push) + #pragma warning (disable: 4244) + if (originalWndProc != 0 && pluginHWND != 0 && IsWindow (pluginHWND)) + SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) originalWndProc); + #pragma warning (pop) + + originalWndProc = 0; + pluginHWND = 0; + #elif JUCE_LINUX + pluginWindow = 0; + pluginProc = 0; + #endif + } + } + + //============================================================================== + VstIntPtr dispatch (const int opcode, const int index, const int value, void* const ptr, float opt) + { + return plugin.dispatch (opcode, index, value, ptr, opt); + } + + //============================================================================== +#if JUCE_WINDOWS + void checkPluginWindowSize() + { + RECT r; + GetWindowRect (pluginHWND, &r); + const int w = r.right - r.left; + const int h = r.bottom - r.top; + + if (isShowing() && w > 0 && h > 0 + && (w != getWidth() || h != getHeight()) + && ! pluginRefusesToResize) + { + setSize (w, h); + sizeCheckCount = 0; + } + } + + // hooks to get keyboard events from VST windows.. + static LRESULT CALLBACK vstHookWndProc (HWND hW, UINT message, WPARAM wParam, LPARAM lParam) + { + for (int i = activeVSTWindows.size(); --i >= 0;) + { + Component::SafePointer w (activeVSTWindows[i]); + + if (w != nullptr && w->pluginHWND == hW) + { + if (message == WM_CHAR + || message == WM_KEYDOWN + || message == WM_SYSKEYDOWN + || message == WM_KEYUP + || message == WM_SYSKEYUP + || message == WM_APPCOMMAND) + { + SendMessage ((HWND) w->getTopLevelComponent()->getWindowHandle(), + message, wParam, lParam); + } + + if (w != nullptr) // (may have been deleted in SendMessage callback) + return CallWindowProc ((WNDPROC) w->originalWndProc, + (HWND) w->pluginHWND, + message, wParam, lParam); + } + } + + return DefWindowProc (hW, message, wParam, lParam); + } +#endif + +#if JUCE_LINUX + //============================================================================== + // overload mouse/keyboard events to forward them to the plugin's inner window.. + void sendEventToChild (XEvent& event) + { + if (pluginProc != 0) + { + // if the plugin publishes an event procedure, pass the event directly.. + pluginProc (&event); + } + else if (pluginWindow != 0) + { + // if the plugin has a window, then send the event to the window so that + // its message thread will pick it up.. + XSendEvent (display, pluginWindow, False, NoEventMask, &event); + XFlush (display); + } + } + + void prepareXEvent (XEvent& ev, const MouseEvent& e) const noexcept + { + zerostruct (ev); + ev.xcrossing.display = display; + ev.xcrossing.window = pluginWindow; + ev.xcrossing.root = RootWindow (display, DefaultScreen (display)); + ev.xcrossing.time = CurrentTime; + ev.xcrossing.x = e.x; + ev.xcrossing.y = e.y; + ev.xcrossing.x_root = e.getScreenX(); + ev.xcrossing.y_root = e.getScreenY(); + } + + void mouseEnter (const MouseEvent& e) override + { + if (pluginWindow != 0) + { + XEvent ev; + prepareXEvent (ev, e); + ev.xcrossing.type = EnterNotify; + ev.xcrossing.mode = NotifyNormal; + ev.xcrossing.detail = NotifyAncestor; + translateJuceToXCrossingModifiers (e, ev); + sendEventToChild (ev); + } + } + + void mouseExit (const MouseEvent& e) override + { + if (pluginWindow != 0) + { + XEvent ev; + prepareXEvent (ev, e); + ev.xcrossing.type = LeaveNotify; + ev.xcrossing.mode = NotifyNormal; + ev.xcrossing.detail = NotifyAncestor; + ev.xcrossing.focus = hasKeyboardFocus (true); + translateJuceToXCrossingModifiers (e, ev); + sendEventToChild (ev); + } + } + + void mouseMove (const MouseEvent& e) override + { + if (pluginWindow != 0) + { + XEvent ev; + prepareXEvent (ev, e); + ev.xmotion.type = MotionNotify; + ev.xmotion.is_hint = NotifyNormal; + sendEventToChild (ev); + } + } + + void mouseDrag (const MouseEvent& e) override + { + if (pluginWindow != 0) + { + XEvent ev; + prepareXEvent (ev, e); + ev.xmotion.type = MotionNotify; + ev.xmotion.is_hint = NotifyNormal; + translateJuceToXMotionModifiers (e, ev); + sendEventToChild (ev); + } + } + + void mouseUp (const MouseEvent& e) override + { + if (pluginWindow != 0) + { + XEvent ev; + prepareXEvent (ev, e); + ev.xbutton.type = ButtonRelease; + translateJuceToXButtonModifiers (e, ev); + sendEventToChild (ev); + } + } + + void mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel) override + { + if (pluginWindow != 0) + { + XEvent ev; + prepareXEvent (ev, e); + ev.xbutton.type = ButtonPress; + translateJuceToXMouseWheelModifiers (e, wheel.deltaY, ev); + sendEventToChild (ev); + + ev.xbutton.type = ButtonRelease; + sendEventToChild (ev); + } + } +#endif + + //============================================================================== +#if JUCE_MAC + #if JUCE_SUPPORT_CARBON + class CarbonWrapperComponent : public CarbonViewWrapperComponent + { + public: + CarbonWrapperComponent (VSTPluginWindow& w) + : owner (w), alreadyInside (false) + { + keepPluginWindowWhenHidden = w.shouldAvoidDeletingWindow(); + setRepaintsChildHIViewWhenCreated (w.shouldRepaintCarbonWindowWhenCreated()); + } + + ~CarbonWrapperComponent() + { + deleteWindow(); + } + + HIViewRef attachView (WindowRef windowRef, HIViewRef /*rootView*/) override + { + owner.openPluginWindow (windowRef); + return 0; + } + + void removeView (HIViewRef) override + { + if (owner.isOpen) + { + owner.isOpen = false; + owner.dispatch (effEditClose, 0, 0, 0, 0); + owner.dispatch (effEditSleep, 0, 0, 0, 0); + } + } + + bool getEmbeddedViewSize (int& w, int& h) override + { + ERect* rect = nullptr; + owner.dispatch (effEditGetRect, 0, 0, &rect, 0); + w = rect->right - rect->left; + h = rect->bottom - rect->top; + return true; + } + + void handleMouseDown (int x, int y) override + { + if (! alreadyInside) + { + alreadyInside = true; + getTopLevelComponent()->toFront (true); + owner.dispatch (effEditMouse, x, y, 0, 0); + alreadyInside = false; + } + else + { + PostEvent (::mouseDown, 0); + } + } + + void handlePaint() override + { + if (ComponentPeer* const peer = getPeer()) + { + const Point pos (peer->globalToLocal (getScreenPosition())); + ERect r; + r.left = (VstInt16) pos.getX(); + r.top = (VstInt16) pos.getY(); + r.right = (VstInt16) (r.left + getWidth()); + r.bottom = (VstInt16) (r.top + getHeight()); + + owner.dispatch (effEditDraw, 0, 0, &r, 0); + } + } + + private: + VSTPluginWindow& owner; + bool alreadyInside; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CarbonWrapperComponent) + }; + + friend class CarbonWrapperComponent; + ScopedPointer carbonWrapper; + #endif + + ScopedPointer cocoaWrapper; + + void resized() override + { + #if JUCE_SUPPORT_CARBON + if (carbonWrapper != nullptr) + carbonWrapper->setSize (getWidth(), getHeight()); + #endif + + if (cocoaWrapper != nullptr) + cocoaWrapper->setSize (getWidth(), getHeight()); + } +#endif + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow) +}; + +//============================================================================== +AudioProcessorEditor* VSTPluginInstance::createEditor() +{ + return hasEditor() ? new VSTPluginWindow (*this) + : nullptr; +} + +//============================================================================== +// entry point for all callbacks from the plugin +static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) +{ + if (effect != nullptr) + if (VSTPluginInstance* instance = (VSTPluginInstance*) (effect->resvd2)) + return instance->handleCallback (opcode, index, value, ptr, opt); + + return VSTPluginInstance::handleGeneralCallback (opcode, index, value, ptr, opt); +} + +//============================================================================== +VSTPluginFormat::VSTPluginFormat() {} +VSTPluginFormat::~VSTPluginFormat() {} + +static VSTPluginInstance* createAndUpdateDesc (VSTPluginFormat& format, PluginDescription& desc) +{ + if (AudioPluginInstance* p = format.createInstanceFromDescription (desc, 44100.0, 512)) + { + if (VSTPluginInstance* instance = dynamic_cast (p)) + { + #if JUCE_MAC + if (instance->module->resFileId != 0) + UseResFile (instance->module->resFileId); + #endif + + instance->fillInPluginDescription (desc); + return instance; + } + + jassertfalse; + } + + return nullptr; +} + +void VSTPluginFormat::findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) +{ + if (! fileMightContainThisPluginType (fileOrIdentifier)) + return; + + PluginDescription desc; + desc.fileOrIdentifier = fileOrIdentifier; + desc.uid = 0; + + ScopedPointer instance (createAndUpdateDesc (*this, desc)); + + if (instance == nullptr) + return; + + if (instance->getVstCategory() != kPlugCategShell) + { + // Normal plugin... + results.add (new PluginDescription (desc)); + + instance->dispatch (effOpen, 0, 0, 0, 0); + } + else + { + // It's a shell plugin, so iterate all the subtypes... + for (;;) + { + char shellEffectName [256] = { 0 }; + const int uid = (int) instance->dispatch (effShellGetNextPlugin, 0, 0, shellEffectName, 0); + + if (uid == 0) + break; + + desc.uid = uid; + desc.name = shellEffectName; + + aboutToScanVSTShellPlugin (desc); + + ScopedPointer shellInstance (createAndUpdateDesc (*this, desc)); + + if (shellInstance != nullptr) + { + jassert (desc.uid == uid); + desc.hasSharedContainer = true; + desc.name = shellEffectName; + + if (! arrayContainsPlugin (results, desc)) + results.add (new PluginDescription (desc)); + } + } + } +} + +AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc, + double sampleRate, int blockSize) +{ + ScopedPointer result; + + if (fileMightContainThisPluginType (desc.fileOrIdentifier)) + { + File file (desc.fileOrIdentifier); + + const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); + file.getParentDirectory().setAsCurrentWorkingDirectory(); + + if (ModuleHandle::Ptr module = ModuleHandle::findOrCreateModule (file)) + { + shellUIDToCreate = desc.uid; + + result = new VSTPluginInstance (module); + + if (result->effect != nullptr) + { + result->effect->resvd2 = (VstIntPtr) (pointer_sized_int) (VSTPluginInstance*) result; + result->initialise (sampleRate, blockSize); + } + else + { + result = nullptr; + } + } + + previousWorkingDirectory.setAsCurrentWorkingDirectory(); + } + + return result.release(); +} + +bool VSTPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) +{ + const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); + + #if JUCE_MAC + if (f.isDirectory() && f.hasFileExtension (".vst")) + return true; + + #if JUCE_PPC + FSRef fileRef; + if (makeFSRefFromPath (&fileRef, f.getFullPathName())) + { + const short resFileId = FSOpenResFile (&fileRef, fsRdPerm); + + if (resFileId != -1) + { + const int numEffects = Count1Resources ('aEff'); + CloseResFile (resFileId); + + if (numEffects > 0) + return true; + } + } + #endif + + return false; + #elif JUCE_WINDOWS + return f.existsAsFile() && f.hasFileExtension (".dll"); + #elif JUCE_LINUX + return f.existsAsFile() && f.hasFileExtension (".so"); + #endif +} + +String VSTPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) +{ + return fileOrIdentifier; +} + +bool VSTPluginFormat::pluginNeedsRescanning (const PluginDescription& desc) +{ + return File (desc.fileOrIdentifier).getLastModificationTime() != desc.lastFileModTime; +} + +bool VSTPluginFormat::doesPluginStillExist (const PluginDescription& desc) +{ + return File (desc.fileOrIdentifier).exists(); +} + +StringArray VSTPluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive) +{ + StringArray results; + + for (int j = 0; j < directoriesToSearch.getNumPaths(); ++j) + recursiveFileSearch (results, directoriesToSearch [j], recursive); + + return results; +} + +void VSTPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive) +{ + // avoid allowing the dir iterator to be recursive, because we want to avoid letting it delve inside + // .component or .vst directories. + DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories); + + while (iter.next()) + { + const File f (iter.getFile()); + bool isPlugin = false; + + if (fileMightContainThisPluginType (f.getFullPathName())) + { + isPlugin = true; + results.add (f.getFullPathName()); + } + + if (recursive && (! isPlugin) && f.isDirectory()) + recursiveFileSearch (results, f, true); + } +} + +FileSearchPath VSTPluginFormat::getDefaultLocationsToSearch() +{ + #if JUCE_MAC + return FileSearchPath ("~/Library/Audio/Plug-Ins/VST;/Library/Audio/Plug-Ins/VST"); + #elif JUCE_LINUX + return FileSearchPath (SystemStats::getEnvironmentVariable ("VST_PATH", + "/usr/lib/vst;/usr/local/lib/vst;~/.vst") + .replace (":", ";")); + #elif JUCE_WINDOWS + const String programFiles (File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName()); + + FileSearchPath paths; + paths.add (WindowsRegistry::getValue ("HKLM\\Software\\VST\\VSTPluginsPath", + programFiles + "\\Steinberg\\VstPlugins")); + paths.removeNonExistentPaths(); + + paths.add (WindowsRegistry::getValue ("HKLM\\Software\\VST\\VSTPluginsPath", + programFiles + "\\VstPlugins")); + return paths; + #endif +} + +const XmlElement* VSTPluginFormat::getVSTXML (AudioPluginInstance* plugin) +{ + if (VSTPluginInstance* const vst = dynamic_cast (plugin)) + if (vst->module != nullptr) + return vst->module->vstXml.get(); + + return nullptr; +} + +bool VSTPluginFormat::loadFromFXBFile (AudioPluginInstance* plugin, const void* data, size_t dataSize) +{ + if (VSTPluginInstance* vst = dynamic_cast (plugin)) + return vst->loadFromFXBFile (data, dataSize); + + return false; +} + +bool VSTPluginFormat::saveToFXBFile (AudioPluginInstance* plugin, MemoryBlock& dest, bool asFXB) +{ + if (VSTPluginInstance* vst = dynamic_cast (plugin)) + return vst->saveToFXBFile (dest, asFXB); + + return false; +} + +bool VSTPluginFormat::getChunkData (AudioPluginInstance* plugin, MemoryBlock& result, bool isPreset) +{ + if (VSTPluginInstance* vst = dynamic_cast (plugin)) + return vst->getChunkData (result, isPreset, 128); + + return false; +} + +bool VSTPluginFormat::setChunkData (AudioPluginInstance* plugin, const void* data, int size, bool isPreset) +{ + if (VSTPluginInstance* vst = dynamic_cast (plugin)) + return vst->setChunkData (data, size, isPreset); + + return false; +} + +void VSTPluginFormat::setExtraFunctions (AudioPluginInstance* plugin, ExtraFunctions* functions) +{ + ScopedPointer f (functions); + + if (VSTPluginInstance* vst = dynamic_cast (plugin)) + vst->extraFunctions = f; +} + +VSTPluginFormat::VstIntPtr JUCE_CALLTYPE VSTPluginFormat::dispatcher (AudioPluginInstance* plugin, int32 opcode, int32 index, VstIntPtr value, void* ptr, float opt) +{ + if (VSTPluginInstance* vst = dynamic_cast (plugin)) + return vst->dispatch (opcode, index, value, ptr, opt); + + return 0; +} + +void VSTPluginFormat::aboutToScanVSTShellPlugin (const PluginDescription&) {} + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h new file mode 100644 index 0000000000..4e4b744176 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h @@ -0,0 +1,113 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_VST || DOXYGEN + +//============================================================================== +/** + Implements a plugin format manager for VSTs. +*/ +class JUCE_API VSTPluginFormat : public AudioPluginFormat +{ +public: + //============================================================================== + VSTPluginFormat(); + ~VSTPluginFormat(); + + //============================================================================== + /** Attempts to retreive the VSTXML data from a plugin. + Will return nullptr if the plugin isn't a VST, or if it doesn't have any VSTXML. + */ + static const XmlElement* getVSTXML (AudioPluginInstance* plugin); + + /** Attempts to reload a VST plugin's state from some FXB or FXP data. */ + static bool loadFromFXBFile (AudioPluginInstance* plugin, const void* data, size_t dataSize); + + /** Attempts to save a VST's state to some FXP or FXB data. */ + static bool saveToFXBFile (AudioPluginInstance* plugin, MemoryBlock& result, bool asFXB); + + /** Attempts to get a VST's state as a chunk of memory. */ + static bool getChunkData (AudioPluginInstance* plugin, MemoryBlock& result, bool isPreset); + + /** Attempts to set a VST's state from a chunk of memory. */ + static bool setChunkData (AudioPluginInstance* plugin, const void* data, int size, bool isPreset); + + //============================================================================== + /** Base class for some extra functions that can be attached to a VST plugin instance. */ + class ExtraFunctions + { + public: + virtual ~ExtraFunctions() {} + + /** This should return 10000 * the BPM at this position in the current edit. */ + virtual int64 getTempoAt (int64 samplePos) = 0; + + /** This should return the host's automation state. + @returns 0 = not supported, 1 = off, 2 = read, 3 = write, 4 = read/write + */ + virtual int getAutomationState() = 0; + }; + + /** Provides an ExtraFunctions callback object for a plugin to use. + The plugin will take ownership of the object and will delete it automatically. + */ + static void setExtraFunctions (AudioPluginInstance* plugin, ExtraFunctions* functions); + + //============================================================================== + #if JUCE_64BIT + typedef int64 VstIntPtr; + #else + typedef int32 VstIntPtr; + #endif + + /** This simply calls directly to the VST's AEffect::dispatcher() function. */ + static VstIntPtr JUCE_CALLTYPE dispatcher (AudioPluginInstance*, int32, int32, VstIntPtr, void*, float); + + //============================================================================== + String getName() const override { return "VST"; } + void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; + AudioPluginInstance* createInstanceFromDescription (const PluginDescription&, double, int) override; + bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; + String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; + bool pluginNeedsRescanning (const PluginDescription&) override; + StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive) override; + bool doesPluginStillExist (const PluginDescription&) override; + FileSearchPath getDefaultLocationsToSearch() override; + bool canScanForPlugins() const override { return true; } + + /** Can be overridden to receive a callback when each member of a shell plugin is about to be + tested during a call to findAllTypesForFile(). + Only the name and uid members of the PluginDescription are guaranteed to be valid when + this is called. + */ + virtual void aboutToScanVSTShellPlugin (const PluginDescription&); + +private: + void recursiveFileSearch (StringArray&, const File&, bool recursive); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginFormat) +}; + + +#endif diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp new file mode 100644 index 0000000000..d1f1679fba --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp @@ -0,0 +1,158 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#if defined (JUCE_AUDIO_PROCESSORS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE + /* When you add this cpp file to your project, you mustn't include it in a file where you've + already included any other headers - just put it inside a file on its own, possibly with your config + flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix + header files that the compiler may be using. + */ + #error "Incorrect use of JUCE cpp file" +#endif + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" + +#include "../juce_core/native/juce_BasicNativeHeaders.h" +#include "juce_audio_processors.h" +#include "../juce_gui_extra/juce_gui_extra.h" + +//============================================================================== +#if JUCE_MAC + #if JUCE_SUPPORT_CARBON \ + && ((JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_AU) \ + || ! (defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6)) + #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) + #define Component CarbonDummyCompName + #include + #undef Point + #undef Component + #endif +#endif + +#if JUCE_PLUGINHOST_VST && JUCE_LINUX + #include + #include + #undef KeyPress +#endif + +#if ! JUCE_WINDOWS && ! JUCE_MAC + #undef JUCE_PLUGINHOST_VST3 + #define JUCE_PLUGINHOST_VST3 0 +#endif + +//============================================================================== +namespace juce +{ + +static inline bool arrayContainsPlugin (const OwnedArray& list, + const PluginDescription& desc) +{ + for (int i = list.size(); --i >= 0;) + if (list.getUnchecked(i)->isDuplicateOf (desc)) + return true; + + return false; +} + +#if JUCE_MAC +//============================================================================== +struct AutoResizingNSViewComponent : public NSViewComponent, + private AsyncUpdater +{ + AutoResizingNSViewComponent() : recursive (false) {} + + void childBoundsChanged (Component*) override + { + if (recursive) + { + triggerAsyncUpdate(); + } + else + { + recursive = true; + resizeToFitView(); + recursive = true; + } + } + + void handleAsyncUpdate() override { resizeToFitView(); } + + bool recursive; +}; + +//============================================================================== +struct AutoResizingNSViewComponentWithParent : public AutoResizingNSViewComponent, + private Timer +{ + AutoResizingNSViewComponentWithParent() + { + NSView* v = [[NSView alloc] init]; + setView (v); + [v release]; + + startTimer (30); + } + + NSView* getChildView() const + { + if (NSView* parent = (NSView*) getView()) + if ([[parent subviews] count] > 0) + return [[parent subviews] objectAtIndex: 0]; + + return nil; + } + + void timerCallback() override + { + if (NSView* child = getChildView()) + { + stopTimer(); + setView (child); + } + } +}; +#endif + +#if JUCE_CLANG + #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#include "format/juce_AudioPluginFormat.cpp" +#include "format/juce_AudioPluginFormatManager.cpp" +#include "processors/juce_AudioProcessor.cpp" +#include "processors/juce_AudioProcessorEditor.cpp" +#include "processors/juce_AudioProcessorGraph.cpp" +#include "processors/juce_GenericAudioProcessorEditor.cpp" +#include "processors/juce_PluginDescription.cpp" +#include "format_types/juce_LADSPAPluginFormat.cpp" +#include "format_types/juce_VSTPluginFormat.cpp" +#include "format_types/juce_VST3PluginFormat.cpp" +#include "format_types/juce_AudioUnitPluginFormat.mm" +#include "scanning/juce_KnownPluginList.cpp" +#include "scanning/juce_PluginDirectoryScanner.cpp" +#include "scanning/juce_PluginListComponent.cpp" + +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h new file mode 100644 index 0000000000..2811656805 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h @@ -0,0 +1,98 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIO_PROCESSORS_H_INCLUDED +#define JUCE_AUDIO_PROCESSORS_H_INCLUDED + +#include "../juce_gui_basics/juce_gui_basics.h" +#include "../juce_audio_basics/juce_audio_basics.h" + + +//============================================================================= +/** Config: JUCE_PLUGINHOST_VST + Enables the VST audio plugin hosting classes. This requires the Steinberg VST SDK to be + installed on your machine. + + @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3 +*/ +#ifndef JUCE_PLUGINHOST_VST + #define JUCE_PLUGINHOST_VST 0 +#endif + +/** Config: JUCE_PLUGINHOST_VST3 + Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be + installed on your machine. + + @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU +*/ +#ifndef JUCE_PLUGINHOST_VST3 + #define JUCE_PLUGINHOST_VST3 0 +#endif + +/** Config: JUCE_PLUGINHOST_AU + Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. + + @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_VST3 +*/ +#ifndef JUCE_PLUGINHOST_AU + #define JUCE_PLUGINHOST_AU 0 +#endif + +#if ! (JUCE_PLUGINHOST_AU || JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) +// #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 flags if you're using this module!" +#endif + +#if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT) + #define JUCE_SUPPORT_CARBON 1 +#endif + +//============================================================================= +//============================================================================= +namespace juce +{ + +class AudioProcessor; +#include "processors/juce_AudioPlayHead.h" +#include "processors/juce_AudioProcessorEditor.h" +#include "processors/juce_AudioProcessorListener.h" +#include "processors/juce_AudioProcessorParameter.h" +#include "processors/juce_AudioProcessor.h" +#include "processors/juce_PluginDescription.h" +#include "processors/juce_AudioPluginInstance.h" +#include "processors/juce_AudioProcessorGraph.h" +#include "processors/juce_GenericAudioProcessorEditor.h" +#include "format/juce_AudioPluginFormat.h" +#include "format/juce_AudioPluginFormatManager.h" +#include "scanning/juce_KnownPluginList.h" +#include "format_types/juce_AudioUnitPluginFormat.h" +#include "format_types/juce_LADSPAPluginFormat.h" +#include "format_types/juce_VSTMidiEventList.h" +#include "format_types/juce_VSTPluginFormat.h" +#include "format_types/juce_VST3PluginFormat.h" +#include "scanning/juce_PluginDirectoryScanner.h" +#include "scanning/juce_PluginListComponent.h" + +} + +#endif // JUCE_AUDIO_PROCESSORS_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm new file mode 100644 index 0000000000..918e84810a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm @@ -0,0 +1,25 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#include "juce_audio_processors.cpp" diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_module_info b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_module_info new file mode 100644 index 0000000000..40a0d87714 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/juce_module_info @@ -0,0 +1,25 @@ +{ + "id": "juce_audio_processors", + "name": "JUCE audio plugin hosting classes", + "version": "3.0.8", + "description": "Classes for loading and playing VST, AU, or internally-generated audio processors.", + "website": "http://www.juce.com/juce", + "license": "GPL/Commercial", + + "dependencies": [ { "id": "juce_gui_extra", "version": "matching" }, + { "id": "juce_audio_basics", "version": "matching" } ], + + "include": "juce_audio_processors.h", + + "compile": [ { "file": "juce_audio_processors.cpp", "target": "! xcode" }, + { "file": "juce_audio_processors.mm", "target": "xcode" } ], + + "browse": [ "processors/*", + "format/*", + "format_types/*", + "scanning/*" + ], + + "OSXFrameworks": "CoreAudio CoreMIDI AudioToolbox", + "iOSFrameworks": "AudioToolbox" +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h new file mode 100644 index 0000000000..b92b802f92 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h @@ -0,0 +1,140 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPLAYHEAD_H_INCLUDED +#define JUCE_AUDIOPLAYHEAD_H_INCLUDED + + +//============================================================================== +/** + A subclass of AudioPlayHead can supply information about the position and + status of a moving play head during audio playback. + + One of these can be supplied to an AudioProcessor object so that it can find + out about the position of the audio that it is rendering. + + @see AudioProcessor::setPlayHead, AudioProcessor::getPlayHead +*/ +class JUCE_API AudioPlayHead +{ +protected: + //============================================================================== + AudioPlayHead() {} + +public: + virtual ~AudioPlayHead() {} + + //============================================================================== + /** Frame rate types. */ + enum FrameRateType + { + fps24 = 0, + fps25 = 1, + fps2997 = 2, + fps30 = 3, + fps2997drop = 4, + fps30drop = 5, + fpsUnknown = 99 + }; + + //============================================================================== + /** This structure is filled-in by the AudioPlayHead::getCurrentPosition() method. + */ + struct JUCE_API CurrentPositionInfo + { + /** The tempo in BPM */ + double bpm; + + /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ + int timeSigNumerator; + /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ + int timeSigDenominator; + + /** The current play position, in samples from the start of the edit. */ + int64 timeInSamples; + /** The current play position, in seconds from the start of the edit. */ + double timeInSeconds; + + /** For timecode, the position of the start of the edit, in seconds from 00:00:00:00. */ + double editOriginTime; + + /** The current play position, in pulses-per-quarter-note. */ + double ppqPosition; + + /** The position of the start of the last bar, in pulses-per-quarter-note. + + This is the time from the start of the edit to the start of the current + bar, in ppq units. + + Note - this value may be unavailable on some hosts, e.g. Pro-Tools. If + it's not available, the value will be 0. + */ + double ppqPositionOfLastBarStart; + + /** The video frame rate, if applicable. */ + FrameRateType frameRate; + + /** True if the transport is currently playing. */ + bool isPlaying; + + /** True if the transport is currently recording. + + (When isRecording is true, then isPlaying will also be true). + */ + bool isRecording; + + /** The current cycle start position in pulses-per-quarter-note. + Note that not all hosts or plugin formats may provide this value. + @see isLooping + */ + double ppqLoopStart; + + /** The current cycle end position in pulses-per-quarter-note. + Note that not all hosts or plugin formats may provide this value. + @see isLooping + */ + double ppqLoopEnd; + + /** True if the transport is currently looping. */ + bool isLooping; + + //============================================================================== + bool operator== (const CurrentPositionInfo& other) const noexcept; + bool operator!= (const CurrentPositionInfo& other) const noexcept; + + void resetToDefault(); + }; + + //============================================================================== + /** Fills-in the given structure with details about the transport's + position at the start of the current processing block. + + This method must ONLY be called from within your AudioProcessor::processBlock() + method. Calling it at any other time will probably cause a nasty crash. + */ + virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0; +}; + + +#endif // JUCE_AUDIOPLAYHEAD_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h new file mode 100644 index 0000000000..b7c7b7dc37 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h @@ -0,0 +1,86 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPLUGININSTANCE_H_INCLUDED +#define JUCE_AUDIOPLUGININSTANCE_H_INCLUDED + + +//============================================================================== +/** + Base class for an active instance of a plugin. + + This derives from the AudioProcessor class, and adds some extra functionality + that helps when wrapping dynamically loaded plugins. + + This class is not needed when writing plugins, and you should never need to derive + your own sub-classes from it. The plugin hosting classes use it internally and will + return AudioPluginInstance objects which wrap external plugins. + + @see AudioProcessor, AudioPluginFormat +*/ +class JUCE_API AudioPluginInstance : public AudioProcessor +{ +public: + //============================================================================== + /** Destructor. + + Make sure that you delete any UI components that belong to this plugin before + deleting the plugin. + */ + virtual ~AudioPluginInstance() {} + + //============================================================================== + /** Fills-in the appropriate parts of this plugin description object. */ + virtual void fillInPluginDescription (PluginDescription& description) const = 0; + + /** Returns a PluginDescription for this plugin. + This is just a convenience method to avoid calling fillInPluginDescription. + */ + PluginDescription getPluginDescription() const + { + PluginDescription desc; + fillInPluginDescription (desc); + return desc; + } + + /** Returns a pointer to some kind of platform-specific data about the plugin. + E.g. For a VST, this value can be cast to an AEffect*. For an AudioUnit, it can be + cast to an AudioUnit handle. + */ + virtual void* getPlatformSpecificData() { return nullptr; } + + /** For some formats (currently AudioUnit), this forces a reload of the list of + available parameters. + */ + virtual void refreshParameterList() {} + +protected: + //============================================================================== + AudioPluginInstance() {} + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginInstance) +}; + + +#endif // JUCE_AUDIOPLUGININSTANCE_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp new file mode 100644 index 0000000000..e46dba37e8 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -0,0 +1,474 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +static ThreadLocalValue wrapperTypeBeingCreated; + +void JUCE_CALLTYPE AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::WrapperType type) +{ + wrapperTypeBeingCreated = type; +} + +AudioProcessor::AudioProcessor() + : wrapperType (wrapperTypeBeingCreated.get()), + playHead (nullptr), + sampleRate (0), + blockSize (0), + numInputChannels (0), + numOutputChannels (0), + latencySamples (0), + suspended (false), + nonRealtime (false) +{ +} + +AudioProcessor::~AudioProcessor() +{ + // ooh, nasty - the editor should have been deleted before the filter + // that it refers to is deleted.. + jassert (activeEditor == nullptr); + + #if JUCE_DEBUG + // This will fail if you've called beginParameterChangeGesture() for one + // or more parameters without having made a corresponding call to endParameterChangeGesture... + jassert (changingParams.countNumberOfSetBits() == 0); + #endif +} + +void AudioProcessor::setPlayHead (AudioPlayHead* const newPlayHead) +{ + playHead = newPlayHead; +} + +void AudioProcessor::addListener (AudioProcessorListener* const newListener) +{ + const ScopedLock sl (listenerLock); + listeners.addIfNotAlreadyThere (newListener); +} + +void AudioProcessor::removeListener (AudioProcessorListener* const listenerToRemove) +{ + const ScopedLock sl (listenerLock); + listeners.removeFirstMatchingValue (listenerToRemove); +} + +void AudioProcessor::setPlayConfigDetails (const int newNumIns, + const int newNumOuts, + const double newSampleRate, + const int newBlockSize) noexcept +{ + sampleRate = newSampleRate; + blockSize = newBlockSize; + + if (numInputChannels != newNumIns || numOutputChannels != newNumOuts) + { + numInputChannels = newNumIns; + numOutputChannels = newNumOuts; + + numChannelsChanged(); + } +} + +void AudioProcessor::numChannelsChanged() {} + +void AudioProcessor::setSpeakerArrangement (const String& inputs, const String& outputs) +{ + inputSpeakerArrangement = inputs; + outputSpeakerArrangement = outputs; +} + +void AudioProcessor::setNonRealtime (const bool newNonRealtime) noexcept +{ + nonRealtime = newNonRealtime; +} + +void AudioProcessor::setLatencySamples (const int newLatency) +{ + if (latencySamples != newLatency) + { + latencySamples = newLatency; + updateHostDisplay(); + } +} + +void AudioProcessor::setParameterNotifyingHost (const int parameterIndex, + const float newValue) +{ + setParameter (parameterIndex, newValue); + sendParamChangeMessageToListeners (parameterIndex, newValue); +} + +AudioProcessorListener* AudioProcessor::getListenerLocked (const int index) const noexcept +{ + const ScopedLock sl (listenerLock); + return listeners [index]; +} + +void AudioProcessor::sendParamChangeMessageToListeners (const int parameterIndex, const float newValue) +{ + if (isPositiveAndBelow (parameterIndex, getNumParameters())) + { + for (int i = listeners.size(); --i >= 0;) + if (AudioProcessorListener* l = getListenerLocked (i)) + l->audioProcessorParameterChanged (this, parameterIndex, newValue); + } + else + { + jassertfalse; // called with an out-of-range parameter index! + } +} + +void AudioProcessor::beginParameterChangeGesture (int parameterIndex) +{ + if (isPositiveAndBelow (parameterIndex, getNumParameters())) + { + #if JUCE_DEBUG + // This means you've called beginParameterChangeGesture twice in succession without a matching + // call to endParameterChangeGesture. That might be fine in most hosts, but better to avoid doing it. + jassert (! changingParams [parameterIndex]); + changingParams.setBit (parameterIndex); + #endif + + for (int i = listeners.size(); --i >= 0;) + if (AudioProcessorListener* l = getListenerLocked (i)) + l->audioProcessorParameterChangeGestureBegin (this, parameterIndex); + } + else + { + jassertfalse; // called with an out-of-range parameter index! + } +} + +void AudioProcessor::endParameterChangeGesture (int parameterIndex) +{ + if (isPositiveAndBelow (parameterIndex, getNumParameters())) + { + #if JUCE_DEBUG + // This means you've called endParameterChangeGesture without having previously called + // endParameterChangeGesture. That might be fine in most hosts, but better to keep the + // calls matched correctly. + jassert (changingParams [parameterIndex]); + changingParams.clearBit (parameterIndex); + #endif + + for (int i = listeners.size(); --i >= 0;) + if (AudioProcessorListener* l = getListenerLocked (i)) + l->audioProcessorParameterChangeGestureEnd (this, parameterIndex); + } + else + { + jassertfalse; // called with an out-of-range parameter index! + } +} + +void AudioProcessor::updateHostDisplay() +{ + for (int i = listeners.size(); --i >= 0;) + if (AudioProcessorListener* l = getListenerLocked (i)) + l->audioProcessorChanged (this); +} + +const OwnedArray& AudioProcessor::getParameters() const noexcept +{ + return managedParameters; +} + +int AudioProcessor::getNumParameters() +{ + return managedParameters.size(); +} + +float AudioProcessor::getParameter (int index) +{ + if (AudioProcessorParameter* p = getParamChecked (index)) + return p->getValue(); + + return 0; +} + +void AudioProcessor::setParameter (int index, float newValue) +{ + if (AudioProcessorParameter* p = getParamChecked (index)) + p->setValue (newValue); +} + +float AudioProcessor::getParameterDefaultValue (int index) +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->getDefaultValue(); + + return 0; +} + +const String AudioProcessor::getParameterName (int index) +{ + if (AudioProcessorParameter* p = getParamChecked (index)) + return p->getName (512); + + return String(); +} + +String AudioProcessor::getParameterName (int index, int maximumStringLength) +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->getName (maximumStringLength); + + return getParameterName (index).substring (0, maximumStringLength); +} + +const String AudioProcessor::getParameterText (int index) +{ + return getParameterText (index, 1024); +} + +String AudioProcessor::getParameterText (int index, int maximumStringLength) +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->getText (p->getValue(), maximumStringLength); + + return getParameterText (index).substring (0, maximumStringLength); +} + +int AudioProcessor::getParameterNumSteps (int index) +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->getNumSteps(); + + return AudioProcessor::getDefaultNumParameterSteps(); +} + +int AudioProcessor::getDefaultNumParameterSteps() noexcept +{ + return 0x7fffffff; +} + +String AudioProcessor::getParameterLabel (int index) const +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->getLabel(); + + return String(); +} + +bool AudioProcessor::isParameterAutomatable (int index) const +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->isAutomatable(); + + return true; +} + +bool AudioProcessor::isParameterOrientationInverted (int index) const +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->isOrientationInverted(); + + return false; +} + +bool AudioProcessor::isMetaParameter (int index) const +{ + if (AudioProcessorParameter* p = managedParameters[index]) + return p->isMetaParameter(); + + return false; +} + +AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const noexcept +{ + AudioProcessorParameter* p = managedParameters[index]; + + // If you hit this, then you're either trying to access parameters that are out-of-range, + // or you're not using addParameter and the managed parameter list, but have failed + // to override some essential virtual methods and implement them appropriately. + jassert (p != nullptr); + return p; +} + +void AudioProcessor::addParameter (AudioProcessorParameter* p) +{ + p->processor = this; + p->parameterIndex = managedParameters.size(); + managedParameters.add (p); +} + +void AudioProcessor::suspendProcessing (const bool shouldBeSuspended) +{ + const ScopedLock sl (callbackLock); + suspended = shouldBeSuspended; +} + +void AudioProcessor::reset() {} +void AudioProcessor::processBlockBypassed (AudioSampleBuffer&, MidiBuffer&) {} + +//============================================================================== +void AudioProcessor::editorBeingDeleted (AudioProcessorEditor* const editor) noexcept +{ + const ScopedLock sl (callbackLock); + + if (activeEditor == editor) + activeEditor = nullptr; +} + +AudioProcessorEditor* AudioProcessor::createEditorIfNeeded() +{ + if (activeEditor != nullptr) + return activeEditor; + + AudioProcessorEditor* const ed = createEditor(); + + if (ed != nullptr) + { + // you must give your editor comp a size before returning it.. + jassert (ed->getWidth() > 0 && ed->getHeight() > 0); + + const ScopedLock sl (callbackLock); + activeEditor = ed; + } + + // You must make your hasEditor() method return a consistent result! + jassert (hasEditor() == (ed != nullptr)); + + return ed; +} + +//============================================================================== +void AudioProcessor::getCurrentProgramStateInformation (juce::MemoryBlock& destData) +{ + getStateInformation (destData); +} + +void AudioProcessor::setCurrentProgramStateInformation (const void* data, int sizeInBytes) +{ + setStateInformation (data, sizeInBytes); +} + +//============================================================================== +// magic number to identify memory blocks that we've stored as XML +const uint32 magicXmlNumber = 0x21324356; + +void AudioProcessor::copyXmlToBinary (const XmlElement& xml, juce::MemoryBlock& destData) +{ + { + MemoryOutputStream out (destData, false); + out.writeInt (magicXmlNumber); + out.writeInt (0); + xml.writeToStream (out, String(), true, false); + out.writeByte (0); + } + + // go back and write the string length.. + static_cast (destData.getData())[1] + = ByteOrder::swapIfBigEndian ((uint32) destData.getSize() - 9); +} + +XmlElement* AudioProcessor::getXmlFromBinary (const void* data, const int sizeInBytes) +{ + if (sizeInBytes > 8 + && ByteOrder::littleEndianInt (data) == magicXmlNumber) + { + const int stringLength = (int) ByteOrder::littleEndianInt (addBytesToPointer (data, 4)); + + if (stringLength > 0) + return XmlDocument::parse (String::fromUTF8 (static_cast (data) + 8, + jmin ((sizeInBytes - 8), stringLength))); + } + + return nullptr; +} + +//============================================================================== +void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {} +void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {} + +//============================================================================== +AudioProcessorParameter::AudioProcessorParameter() noexcept + : processor (nullptr), parameterIndex (-1) +{} + +AudioProcessorParameter::~AudioProcessorParameter() {} + +void AudioProcessorParameter::setValueNotifyingHost (float newValue) +{ + // This method can't be used until the parameter has been attached to a processor! + jassert (processor != nullptr && parameterIndex >= 0); + + return processor->setParameterNotifyingHost (parameterIndex, newValue); +} + +void AudioProcessorParameter::beginChangeGesture() +{ + // This method can't be used until the parameter has been attached to a processor! + jassert (processor != nullptr && parameterIndex >= 0); + + processor->beginParameterChangeGesture (parameterIndex); +} + +void AudioProcessorParameter::endChangeGesture() +{ + // This method can't be used until the parameter has been attached to a processor! + jassert (processor != nullptr && parameterIndex >= 0); + + processor->endParameterChangeGesture (parameterIndex); +} + +bool AudioProcessorParameter::isOrientationInverted() const { return false; } +bool AudioProcessorParameter::isAutomatable() const { return true; } +bool AudioProcessorParameter::isMetaParameter() const { return false; } +int AudioProcessorParameter::getNumSteps() const { return AudioProcessor::getDefaultNumParameterSteps(); } + +String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const +{ + return String (value, 2); +} + +//============================================================================== +bool AudioPlayHead::CurrentPositionInfo::operator== (const CurrentPositionInfo& other) const noexcept +{ + return timeInSamples == other.timeInSamples + && ppqPosition == other.ppqPosition + && editOriginTime == other.editOriginTime + && ppqPositionOfLastBarStart == other.ppqPositionOfLastBarStart + && frameRate == other.frameRate + && isPlaying == other.isPlaying + && isRecording == other.isRecording + && bpm == other.bpm + && timeSigNumerator == other.timeSigNumerator + && timeSigDenominator == other.timeSigDenominator + && ppqLoopStart == other.ppqLoopStart + && ppqLoopEnd == other.ppqLoopEnd + && isLooping == other.isLooping; +} + +bool AudioPlayHead::CurrentPositionInfo::operator!= (const CurrentPositionInfo& other) const noexcept +{ + return ! operator== (other); +} + +void AudioPlayHead::CurrentPositionInfo::resetToDefault() +{ + zerostruct (*this); + timeSigNumerator = 4; + timeSigDenominator = 4; + bpm = 120; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h new file mode 100644 index 0000000000..aaae9ef172 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -0,0 +1,689 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPROCESSOR_H_INCLUDED +#define JUCE_AUDIOPROCESSOR_H_INCLUDED + + +//============================================================================== +/** + Base class for audio processing filters or plugins. + + This is intended to act as a base class of audio filter that is general enough to + be wrapped as a VST, AU, RTAS, etc, or used internally. + + It is also used by the plugin hosting code as the wrapper around an instance + of a loaded plugin. + + Derive your filter class from this base class, and if you're building a plugin, + you should implement a global function called createPluginFilter() which creates + and returns a new instance of your subclass. +*/ +class JUCE_API AudioProcessor +{ +protected: + //============================================================================== + /** Constructor. */ + AudioProcessor(); + +public: + /** Destructor. */ + virtual ~AudioProcessor(); + + //============================================================================== + /** Returns the name of this processor. */ + virtual const String getName() const = 0; + + //============================================================================== + /** Called before playback starts, to let the filter prepare itself. + + The sample rate is the target sample rate, and will remain constant until + playback stops. + + The estimatedSamplesPerBlock value is a HINT about the typical number of + samples that will be processed for each callback, but isn't any kind + of guarantee. The actual block sizes that the host uses may be different + each time the callback happens, and may be more or less than this value. + */ + virtual void prepareToPlay (double sampleRate, + int estimatedSamplesPerBlock) = 0; + + /** Called after playback has stopped, to let the filter free up any resources it + no longer needs. + */ + virtual void releaseResources() = 0; + + /** Renders the next block. + + When this method is called, the buffer contains a number of channels which is + at least as great as the maximum number of input and output channels that + this filter is using. It will be filled with the filter's input data and + should be replaced with the filter's output. + + So for example if your filter has 2 input channels and 4 output channels, then + the buffer will contain 4 channels, the first two being filled with the + input data. Your filter should read these, do its processing, and replace + the contents of all 4 channels with its output. + + Or if your filter has 5 inputs and 2 outputs, the buffer will have 5 channels, + all filled with data, and your filter should overwrite the first 2 of these + with its output. But be VERY careful not to write anything to the last 3 + channels, as these might be mapped to memory that the host assumes is read-only! + + Note that if you have more outputs than inputs, then only those channels that + correspond to an input channel are guaranteed to contain sensible data - e.g. + in the case of 2 inputs and 4 outputs, the first two channels contain the input, + but the last two channels may contain garbage, so you should be careful not to + let this pass through without being overwritten or cleared. + + Also note that the buffer may have more channels than are strictly necessary, + but you should only read/write from the ones that your filter is supposed to + be using. + + The number of samples in these buffers is NOT guaranteed to be the same for every + callback, and may be more or less than the estimated value given to prepareToPlay(). + Your code must be able to cope with variable-sized blocks, or you're going to get + clicks and crashes! + + If the filter is receiving a midi input, then the midiMessages array will be filled + with the midi messages for this block. Each message's timestamp will indicate the + message's time, as a number of samples from the start of the block. + + Any messages left in the midi buffer when this method has finished are assumed to + be the filter's midi output. This means that your filter should be careful to + clear any incoming messages from the array if it doesn't want them to be passed-on. + + Be very careful about what you do in this callback - it's going to be called by + the audio thread, so any kind of interaction with the UI is absolutely + out of the question. If you change a parameter in here and need to tell your UI to + update itself, the best way is probably to inherit from a ChangeBroadcaster, let + the UI components register as listeners, and then call sendChangeMessage() inside the + processBlock() method to send out an asynchronous message. You could also use + the AsyncUpdater class in a similar way. + */ + virtual void processBlock (AudioSampleBuffer& buffer, + MidiBuffer& midiMessages) = 0; + + /** Renders the next block when the processor is being bypassed. + The default implementation of this method will pass-through any incoming audio, but + you may override this method e.g. to add latency compensation to the data to match + the processor's latency characteristics. This will avoid situations where bypassing + will shift the signal forward in time, possibly creating pre-echo effects and odd timings. + Another use for this method would be to cross-fade or morph between the wet (not bypassed) + and dry (bypassed) signals. + */ + virtual void processBlockBypassed (AudioSampleBuffer& buffer, + MidiBuffer& midiMessages); + + //============================================================================== + /** Returns the current AudioPlayHead object that should be used to find + out the state and position of the playhead. + + You can call this from your processBlock() method, and use the AudioPlayHead + object to get the details about the time of the start of the block currently + being processed. + + If the host hasn't supplied a playhead object, this will return nullptr. + */ + AudioPlayHead* getPlayHead() const noexcept { return playHead; } + + + //============================================================================== + /** Returns the current sample rate. + + This can be called from your processBlock() method - it's not guaranteed + to be valid at any other time, and may return 0 if it's unknown. + */ + double getSampleRate() const noexcept { return sampleRate; } + + /** Returns the current typical block size that is being used. + + This can be called from your processBlock() method - it's not guaranteed + to be valid at any other time. + + Remember it's not the ONLY block size that may be used when calling + processBlock, it's just the normal one. The actual block sizes used may be + larger or smaller than this, and will vary between successive calls. + */ + int getBlockSize() const noexcept { return blockSize; } + + //============================================================================== + /** Returns the number of input channels that the host will be sending the filter. + + If writing a plugin, your configuration macros should specify the number of + channels that your filter would prefer to have, and this method lets + you know how many the host is actually using. + + Note that this method is only valid during or after the prepareToPlay() + method call. Until that point, the number of channels will be unknown. + */ + int getNumInputChannels() const noexcept { return numInputChannels; } + + /** Returns the number of output channels that the host will be sending the filter. + + If writing a plugin, your configuration macros should specify the number of + channels that your filter would prefer to have, and this method lets + you know how many the host is actually using. + + Note that this method is only valid during or after the prepareToPlay() + method call. Until that point, the number of channels will be unknown. + */ + int getNumOutputChannels() const noexcept { return numOutputChannels; } + + /** Returns a string containing a whitespace-separated list of speaker types + corresponding to each input channel. + For example in a 5.1 arrangement, the string may be "L R C Lfe Ls Rs" + If the speaker arrangement is unknown, the returned string will be empty. + */ + const String& getInputSpeakerArrangement() const noexcept { return inputSpeakerArrangement; } + + /** Returns a string containing a whitespace-separated list of speaker types + corresponding to each output channel. + For example in a 5.1 arrangement, the string may be "L R C Lfe Ls Rs" + If the speaker arrangement is unknown, the returned string will be empty. + */ + const String& getOutputSpeakerArrangement() const noexcept { return outputSpeakerArrangement; } + + //============================================================================== + /** Returns the name of one of the processor's input channels. + + The processor might not supply very useful names for channels, and this might be + something like "1", "2", "left", "right", etc. + */ + virtual const String getInputChannelName (int channelIndex) const = 0; + + /** Returns the name of one of the processor's output channels. + + The processor might not supply very useful names for channels, and this might be + something like "1", "2", "left", "right", etc. + */ + virtual const String getOutputChannelName (int channelIndex) const = 0; + + /** Returns true if the specified channel is part of a stereo pair with its neighbour. */ + virtual bool isInputChannelStereoPair (int index) const = 0; + + /** Returns true if the specified channel is part of a stereo pair with its neighbour. */ + virtual bool isOutputChannelStereoPair (int index) const = 0; + + /** This returns the number of samples delay that the filter imposes on the audio + passing through it. + + The host will call this to find the latency - the filter itself should set this value + by calling setLatencySamples() as soon as it can during its initialisation. + */ + int getLatencySamples() const noexcept { return latencySamples; } + + /** The filter should call this to set the number of samples delay that it introduces. + + The filter should call this as soon as it can during initialisation, and can call it + later if the value changes. + */ + void setLatencySamples (int newLatency); + + /** Returns true if a silent input always produces a silent output. */ + virtual bool silenceInProducesSilenceOut() const = 0; + + /** Returns the length of the filter's tail, in seconds. */ + virtual double getTailLengthSeconds() const = 0; + + /** Returns true if the processor wants midi messages. */ + virtual bool acceptsMidi() const = 0; + + /** Returns true if the processor produces midi messages. */ + virtual bool producesMidi() const = 0; + + //============================================================================== + /** This returns a critical section that will automatically be locked while the host + is calling the processBlock() method. + + Use it from your UI or other threads to lock access to variables that are used + by the process callback, but obviously be careful not to keep it locked for + too long, because that could cause stuttering playback. If you need to do something + that'll take a long time and need the processing to stop while it happens, use the + suspendProcessing() method instead. + + @see suspendProcessing + */ + const CriticalSection& getCallbackLock() const noexcept { return callbackLock; } + + /** Enables and disables the processing callback. + + If you need to do something time-consuming on a thread and would like to make sure + the audio processing callback doesn't happen until you've finished, use this + to disable the callback and re-enable it again afterwards. + + E.g. + @code + void loadNewPatch() + { + suspendProcessing (true); + + ..do something that takes ages.. + + suspendProcessing (false); + } + @endcode + + If the host tries to make an audio callback while processing is suspended, the + filter will return an empty buffer, but won't block the audio thread like it would + do if you use the getCallbackLock() critical section to synchronise access. + + Any code that calls processBlock() should call isSuspended() before doing so, and + if the processor is suspended, it should avoid the call and emit silence or + whatever is appropriate. + + @see getCallbackLock + */ + void suspendProcessing (bool shouldBeSuspended); + + /** Returns true if processing is currently suspended. + @see suspendProcessing + */ + bool isSuspended() const noexcept { return suspended; } + + /** A plugin can override this to be told when it should reset any playing voices. + + The default implementation does nothing, but a host may call this to tell the + plugin that it should stop any tails or sounds that have been left running. + */ + virtual void reset(); + + //============================================================================== + /** Returns true if the processor is being run in an offline mode for rendering. + + If the processor is being run live on realtime signals, this returns false. + If the mode is unknown, this will assume it's realtime and return false. + + This value may be unreliable until the prepareToPlay() method has been called, + and could change each time prepareToPlay() is called. + + @see setNonRealtime() + */ + bool isNonRealtime() const noexcept { return nonRealtime; } + + /** Called by the host to tell this processor whether it's being used in a non-realtime + capacity for offline rendering or bouncing. + */ + virtual void setNonRealtime (bool isNonRealtime) noexcept; + + //============================================================================== + /** Creates the filter's UI. + + This can return nullptr if you want a UI-less filter, in which case the host may create + a generic UI that lets the user twiddle the parameters directly. + + If you do want to pass back a component, the component should be created and set to + the correct size before returning it. If you implement this method, you must + also implement the hasEditor() method and make it return true. + + Remember not to do anything silly like allowing your filter to keep a pointer to + the component that gets created - it could be deleted later without any warning, which + would make your pointer into a dangler. Use the getActiveEditor() method instead. + + The correct way to handle the connection between an editor component and its + filter is to use something like a ChangeBroadcaster so that the editor can + register itself as a listener, and be told when a change occurs. This lets them + safely unregister themselves when they are deleted. + + Here are a few things to bear in mind when writing an editor: + + - Initially there won't be an editor, until the user opens one, or they might + not open one at all. Your filter mustn't rely on it being there. + - An editor object may be deleted and a replacement one created again at any time. + - It's safe to assume that an editor will be deleted before its filter. + + @see hasEditor + */ + virtual AudioProcessorEditor* createEditor() = 0; + + /** Your filter must override this and return true if it can create an editor component. + @see createEditor + */ + virtual bool hasEditor() const = 0; + + //============================================================================== + /** Returns the active editor, if there is one. + Bear in mind this can return nullptr, even if an editor has previously been opened. + */ + AudioProcessorEditor* getActiveEditor() const noexcept { return activeEditor; } + + /** Returns the active editor, or if there isn't one, it will create one. + This may call createEditor() internally to create the component. + */ + AudioProcessorEditor* createEditorIfNeeded(); + + //============================================================================== + /** This must return the correct value immediately after the object has been + created, and mustn't change the number of parameters later. + */ + virtual int getNumParameters(); + + /** Returns the name of a particular parameter. */ + virtual const String getParameterName (int parameterIndex); + + /** Called by the host to find out the value of one of the filter's parameters. + + The host will expect the value returned to be between 0 and 1.0. + + This could be called quite frequently, so try to make your code efficient. + It's also likely to be called by non-UI threads, so the code in here should + be thread-aware. + */ + virtual float getParameter (int parameterIndex); + + /** Returns the value of a parameter as a text string. */ + virtual const String getParameterText (int parameterIndex); + + /** Returns the name of a parameter as a text string with a preferred maximum length. + If you want to provide customised short versions of your parameter names that + will look better in constrained spaces (e.g. the displays on hardware controller + devices or mixing desks) then you should implement this method. + If you don't override it, the default implementation will call getParameterText(int), + and truncate the result. + */ + virtual String getParameterName (int parameterIndex, int maximumStringLength); + + /** Returns the value of a parameter as a text string with a preferred maximum length. + If you want to provide customised short versions of your parameter values that + will look better in constrained spaces (e.g. the displays on hardware controller + devices or mixing desks) then you should implement this method. + If you don't override it, the default implementation will call getParameterText(int), + and truncate the result. + */ + virtual String getParameterText (int parameterIndex, int maximumStringLength); + + /** Returns the number of discrete steps that this parameter can represent. + The default return value if you don't implement this method is + AudioProcessor::getDefaultNumParameterSteps(). + If your parameter is boolean, then you may want to make this return 2. + The value that is returned may or may not be used, depending on the host. + */ + virtual int getParameterNumSteps (int parameterIndex); + + /** Returns the default number of steps for a parameter. + @see getParameterNumSteps + */ + static int getDefaultNumParameterSteps() noexcept; + + /** Returns the default value for the parameter. + By default, this just returns 0. + The value that is returned may or may not be used, depending on the host. + */ + virtual float getParameterDefaultValue (int parameterIndex); + + /** Some plugin types may be able to return a label string for a + parameter's units. + */ + virtual String getParameterLabel (int index) const; + + /** This can be overridden to tell the host that particular parameters operate in the + reverse direction. (Not all plugin formats or hosts will actually use this information). + */ + virtual bool isParameterOrientationInverted (int index) const; + + /** The host will call this method to change the value of one of the filter's parameters. + + The host may call this at any time, including during the audio processing + callback, so the filter has to process this very fast and avoid blocking. + + If you want to set the value of a parameter internally, e.g. from your + editor component, then don't call this directly - instead, use the + setParameterNotifyingHost() method, which will also send a message to + the host telling it about the change. If the message isn't sent, the host + won't be able to automate your parameters properly. + + The value passed will be between 0 and 1.0. + */ + virtual void setParameter (int parameterIndex, float newValue); + + /** Your filter can call this when it needs to change one of its parameters. + + This could happen when the editor or some other internal operation changes + a parameter. This method will call the setParameter() method to change the + value, and will then send a message to the host telling it about the change. + + Note that to make sure the host correctly handles automation, you should call + the beginParameterChangeGesture() and endParameterChangeGesture() methods to + tell the host when the user has started and stopped changing the parameter. + */ + void setParameterNotifyingHost (int parameterIndex, float newValue); + + /** Returns true if the host can automate this parameter. + By default, this returns true for all parameters. + */ + virtual bool isParameterAutomatable (int parameterIndex) const; + + /** Should return true if this parameter is a "meta" parameter. + A meta-parameter is a parameter that changes other params. It is used + by some hosts (e.g. AudioUnit hosts). + By default this returns false. + */ + virtual bool isMetaParameter (int parameterIndex) const; + + /** Sends a signal to the host to tell it that the user is about to start changing this + parameter. + + This allows the host to know when a parameter is actively being held by the user, and + it may use this information to help it record automation. + + If you call this, it must be matched by a later call to endParameterChangeGesture(). + */ + void beginParameterChangeGesture (int parameterIndex); + + /** Tells the host that the user has finished changing this parameter. + + This allows the host to know when a parameter is actively being held by the user, and + it may use this information to help it record automation. + + A call to this method must follow a call to beginParameterChangeGesture(). + */ + void endParameterChangeGesture (int parameterIndex); + + /** The filter can call this when something (apart from a parameter value) has changed. + + It sends a hint to the host that something like the program, number of parameters, + etc, has changed, and that it should update itself. + */ + void updateHostDisplay(); + + //============================================================================== + /** Adds a parameter to the list. + The parameter object will be managed and deleted automatically by the list + when no longer needed. + */ + void addParameter (AudioProcessorParameter*); + + /** Returns the current list of parameters. */ + const OwnedArray& getParameters() const noexcept; + + //============================================================================== + /** Returns the number of preset programs the filter supports. + + The value returned must be valid as soon as this object is created, and + must not change over its lifetime. + + This value shouldn't be less than 1. + */ + virtual int getNumPrograms() = 0; + + /** Returns the number of the currently active program. */ + virtual int getCurrentProgram() = 0; + + /** Called by the host to change the current program. */ + virtual void setCurrentProgram (int index) = 0; + + /** Must return the name of a given program. */ + virtual const String getProgramName (int index) = 0; + + /** Called by the host to rename a program. */ + virtual void changeProgramName (int index, const String& newName) = 0; + + //============================================================================== + /** The host will call this method when it wants to save the filter's internal state. + + This must copy any info about the filter's state into the block of memory provided, + so that the host can store this and later restore it using setStateInformation(). + + Note that there's also a getCurrentProgramStateInformation() method, which only + stores the current program, not the state of the entire filter. + + See also the helper function copyXmlToBinary() for storing settings as XML. + + @see getCurrentProgramStateInformation + */ + virtual void getStateInformation (juce::MemoryBlock& destData) = 0; + + /** The host will call this method if it wants to save the state of just the filter's + current program. + + Unlike getStateInformation, this should only return the current program's state. + + Not all hosts support this, and if you don't implement it, the base class + method just calls getStateInformation() instead. If you do implement it, be + sure to also implement getCurrentProgramStateInformation. + + @see getStateInformation, setCurrentProgramStateInformation + */ + virtual void getCurrentProgramStateInformation (juce::MemoryBlock& destData); + + /** This must restore the filter's state from a block of data previously created + using getStateInformation(). + + Note that there's also a setCurrentProgramStateInformation() method, which tries + to restore just the current program, not the state of the entire filter. + + See also the helper function getXmlFromBinary() for loading settings as XML. + + @see setCurrentProgramStateInformation + */ + virtual void setStateInformation (const void* data, int sizeInBytes) = 0; + + /** The host will call this method if it wants to restore the state of just the filter's + current program. + + Not all hosts support this, and if you don't implement it, the base class + method just calls setStateInformation() instead. If you do implement it, be + sure to also implement getCurrentProgramStateInformation. + + @see setStateInformation, getCurrentProgramStateInformation + */ + virtual void setCurrentProgramStateInformation (const void* data, int sizeInBytes); + + /** This method is called when the number of input or output channels is changed. */ + virtual void numChannelsChanged(); + + //============================================================================== + /** Adds a listener that will be called when an aspect of this processor changes. */ + virtual void addListener (AudioProcessorListener* newListener); + + /** Removes a previously added listener. */ + virtual void removeListener (AudioProcessorListener* listenerToRemove); + + //============================================================================== + /** Tells the processor to use this playhead object. + The processor will not take ownership of the object, so the caller must delete it when + it is no longer being used. + */ + virtual void setPlayHead (AudioPlayHead* newPlayHead); + + //============================================================================== + /** This is called by the processor to specify its details before being played. */ + void setPlayConfigDetails (int numIns, int numOuts, double sampleRate, int blockSize) noexcept; + + //============================================================================== + /** Not for public use - this is called before deleting an editor component. */ + void editorBeingDeleted (AudioProcessorEditor*) noexcept; + + /** Not for public use - this is called to initialise the processor before playing. */ + void setSpeakerArrangement (const String& inputs, const String& outputs); + + /** Flags to indicate the type of plugin context in which a processor is being used. */ + enum WrapperType + { + wrapperType_Undefined = 0, + wrapperType_VST, + wrapperType_VST3, + wrapperType_AudioUnit, + wrapperType_RTAS, + wrapperType_AAX, + wrapperType_Standalone + }; + + /** When loaded by a plugin wrapper, this flag will be set to indicate the type + of plugin within which the processor is running. + */ + WrapperType wrapperType; + + //============================================================================== + /** Helper function that just converts an xml element into a binary blob. + + Use this in your filter's getStateInformation() method if you want to + store its state as xml. + + Then use getXmlFromBinary() to reverse this operation and retrieve the XML + from a binary blob. + */ + static void copyXmlToBinary (const XmlElement& xml, + juce::MemoryBlock& destData); + + /** Retrieves an XML element that was stored as binary with the copyXmlToBinary() method. + + This might return nullptr if the data's unsuitable or corrupted. Otherwise it will return + an XmlElement object that the caller must delete when no longer needed. + */ + static XmlElement* getXmlFromBinary (const void* data, int sizeInBytes); + + /** @internal */ + static void JUCE_CALLTYPE setTypeOfNextNewPlugin (WrapperType); + +protected: + /** @internal */ + AudioPlayHead* playHead; + + /** @internal */ + void sendParamChangeMessageToListeners (int parameterIndex, float newValue); + +private: + Array listeners; + Component::SafePointer activeEditor; + double sampleRate; + int blockSize, numInputChannels, numOutputChannels, latencySamples; + bool suspended, nonRealtime; + CriticalSection callbackLock, listenerLock; + String inputSpeakerArrangement, outputSpeakerArrangement; + + OwnedArray managedParameters; + AudioProcessorParameter* getParamChecked (int) const noexcept; + + #if JUCE_DEBUG + BigInteger changingParams; + #endif + + AudioProcessorListener* getListenerLocked (int) const noexcept; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessor) +}; + + +#endif // JUCE_AUDIOPROCESSOR_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp new file mode 100644 index 0000000000..a625411117 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp @@ -0,0 +1,43 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioProcessorEditor::AudioProcessorEditor (AudioProcessor& p) noexcept : processor (p) +{ +} + +AudioProcessorEditor::AudioProcessorEditor (AudioProcessor* p) noexcept : processor (*p) +{ + // the filter must be valid.. + jassert (p != nullptr); +} + +AudioProcessorEditor::~AudioProcessorEditor() +{ + // if this fails, then the wrapper hasn't called editorBeingDeleted() on the + // filter for some reason.. + jassert (processor.getActiveEditor() != this); +} + +void AudioProcessorEditor::setControlHighlight (ParameterControlHighlightInfo) {} +int AudioProcessorEditor::getControlParameterIndex (Component&) { return -1; } diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h new file mode 100644 index 0000000000..1755497c33 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h @@ -0,0 +1,92 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED +#define JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED + + +//============================================================================== +/** + Base class for the component that acts as the GUI for an AudioProcessor. + + Derive your editor component from this class, and create an instance of it + by overriding the AudioProcessor::createEditor() method. + + @see AudioProcessor, GenericAudioProcessorEditor +*/ +class JUCE_API AudioProcessorEditor : public Component +{ +protected: + //============================================================================== + /** Creates an editor for the specified processor. */ + AudioProcessorEditor (AudioProcessor&) noexcept; + + /** Creates an editor for the specified processor. */ + AudioProcessorEditor (AudioProcessor*) noexcept; + +public: + /** Destructor. */ + ~AudioProcessorEditor(); + + + //============================================================================== + /** The AudioProcessor that this editor represents. */ + AudioProcessor& processor; + + /** Returns a pointer to the processor that this editor represents. + This method is here to support legacy code, but it's easier to just use the + AudioProcessorEditor::processor member variable directly to get this object. + */ + AudioProcessor* getAudioProcessor() const noexcept { return &processor; } + + //============================================================================== + /** Used by the setParameterHighlighting() method. */ + struct ParameterControlHighlightInfo + { + int parameterIndex; + bool isHighlighted; + Colour suggestedColour; + }; + + /** Some types of plugin can call this to suggest that the control for a particular + parameter should be highlighted. + Currently only AAX plugins will call this, and implementing it is optional. + */ + virtual void setControlHighlight (ParameterControlHighlightInfo); + + /** Called by certain plug-in wrappers to find out whether a component is used + to control a parameter. + + If the given component represents a particular plugin parameter, then this + method should return the index of that parameter. If not, it should return -1. + Currently only AAX plugins will call this, and implementing it is optional. + */ + virtual int getControlParameterIndex (Component&); + +private: + JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditor) +}; + + +#endif // JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp new file mode 100644 index 0000000000..9ca46d2f7f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -0,0 +1,1531 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +const int AudioProcessorGraph::midiChannelIndex = 0x1000; + +//============================================================================== +namespace GraphRenderingOps +{ + +//============================================================================== +class AudioGraphRenderingOp +{ +public: + AudioGraphRenderingOp() {} + virtual ~AudioGraphRenderingOp() {} + + virtual void perform (AudioSampleBuffer& sharedBufferChans, + const OwnedArray & sharedMidiBuffers, + const int numSamples) = 0; + + JUCE_LEAK_DETECTOR (AudioGraphRenderingOp) +}; + +//============================================================================== +class ClearChannelOp : public AudioGraphRenderingOp +{ +public: + ClearChannelOp (const int channelNum_) + : channelNum (channelNum_) + {} + + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + { + sharedBufferChans.clear (channelNum, 0, numSamples); + } + +private: + const int channelNum; + + JUCE_DECLARE_NON_COPYABLE (ClearChannelOp) +}; + +//============================================================================== +class CopyChannelOp : public AudioGraphRenderingOp +{ +public: + CopyChannelOp (const int srcChannelNum_, const int dstChannelNum_) + : srcChannelNum (srcChannelNum_), + dstChannelNum (dstChannelNum_) + {} + + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + { + sharedBufferChans.copyFrom (dstChannelNum, 0, sharedBufferChans, srcChannelNum, 0, numSamples); + } + +private: + const int srcChannelNum, dstChannelNum; + + JUCE_DECLARE_NON_COPYABLE (CopyChannelOp) +}; + +//============================================================================== +class AddChannelOp : public AudioGraphRenderingOp +{ +public: + AddChannelOp (const int srcChannelNum_, const int dstChannelNum_) + : srcChannelNum (srcChannelNum_), + dstChannelNum (dstChannelNum_) + {} + + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + { + sharedBufferChans.addFrom (dstChannelNum, 0, sharedBufferChans, srcChannelNum, 0, numSamples); + } + +private: + const int srcChannelNum, dstChannelNum; + + JUCE_DECLARE_NON_COPYABLE (AddChannelOp) +}; + +//============================================================================== +class ClearMidiBufferOp : public AudioGraphRenderingOp +{ +public: + ClearMidiBufferOp (const int bufferNum_) + : bufferNum (bufferNum_) + {} + + void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int) + { + sharedMidiBuffers.getUnchecked (bufferNum)->clear(); + } + +private: + const int bufferNum; + + JUCE_DECLARE_NON_COPYABLE (ClearMidiBufferOp) +}; + +//============================================================================== +class CopyMidiBufferOp : public AudioGraphRenderingOp +{ +public: + CopyMidiBufferOp (const int srcBufferNum_, const int dstBufferNum_) + : srcBufferNum (srcBufferNum_), + dstBufferNum (dstBufferNum_) + {} + + void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int) + { + *sharedMidiBuffers.getUnchecked (dstBufferNum) = *sharedMidiBuffers.getUnchecked (srcBufferNum); + } + +private: + const int srcBufferNum, dstBufferNum; + + JUCE_DECLARE_NON_COPYABLE (CopyMidiBufferOp) +}; + +//============================================================================== +class AddMidiBufferOp : public AudioGraphRenderingOp +{ +public: + AddMidiBufferOp (const int srcBufferNum_, const int dstBufferNum_) + : srcBufferNum (srcBufferNum_), + dstBufferNum (dstBufferNum_) + {} + + void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int numSamples) + { + sharedMidiBuffers.getUnchecked (dstBufferNum) + ->addEvents (*sharedMidiBuffers.getUnchecked (srcBufferNum), 0, numSamples, 0); + } + +private: + const int srcBufferNum, dstBufferNum; + + JUCE_DECLARE_NON_COPYABLE (AddMidiBufferOp) +}; + +//============================================================================== +class DelayChannelOp : public AudioGraphRenderingOp +{ +public: + DelayChannelOp (const int channel_, const int numSamplesDelay_) + : channel (channel_), + bufferSize (numSamplesDelay_ + 1), + readIndex (0), writeIndex (numSamplesDelay_) + { + buffer.calloc ((size_t) bufferSize); + } + + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + { + float* data = sharedBufferChans.getWritePointer (channel, 0); + + for (int i = numSamples; --i >= 0;) + { + buffer [writeIndex] = *data; + *data++ = buffer [readIndex]; + + if (++readIndex >= bufferSize) readIndex = 0; + if (++writeIndex >= bufferSize) writeIndex = 0; + } + } + +private: + HeapBlock buffer; + const int channel, bufferSize; + int readIndex, writeIndex; + + JUCE_DECLARE_NON_COPYABLE (DelayChannelOp) +}; + + +//============================================================================== +class ProcessBufferOp : public AudioGraphRenderingOp +{ +public: + ProcessBufferOp (const AudioProcessorGraph::Node::Ptr& node_, + const Array & audioChannelsToUse_, + const int totalChans_, + const int midiBufferToUse_) + : node (node_), + processor (node_->getProcessor()), + audioChannelsToUse (audioChannelsToUse_), + totalChans (jmax (1, totalChans_)), + midiBufferToUse (midiBufferToUse_) + { + channels.calloc ((size_t) totalChans); + + while (audioChannelsToUse.size() < totalChans) + audioChannelsToUse.add (0); + } + + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray & sharedMidiBuffers, const int numSamples) + { + for (int i = totalChans; --i >= 0;) + channels[i] = sharedBufferChans.getWritePointer (audioChannelsToUse.getUnchecked (i), 0); + + AudioSampleBuffer buffer (channels, totalChans, numSamples); + + processor->processBlock (buffer, *sharedMidiBuffers.getUnchecked (midiBufferToUse)); + } + + const AudioProcessorGraph::Node::Ptr node; + AudioProcessor* const processor; + +private: + Array audioChannelsToUse; + HeapBlock channels; + int totalChans; + int midiBufferToUse; + + JUCE_DECLARE_NON_COPYABLE (ProcessBufferOp) +}; + +//============================================================================== +/** Used to calculate the correct sequence of rendering ops needed, based on + the best re-use of shared buffers at each stage. +*/ +class RenderingOpSequenceCalculator +{ +public: + //============================================================================== + RenderingOpSequenceCalculator (AudioProcessorGraph& graph_, + const Array& orderedNodes_, + Array& renderingOps) + : graph (graph_), + orderedNodes (orderedNodes_), + totalLatency (0) + { + nodeIds.add ((uint32) zeroNodeID); // first buffer is read-only zeros + channels.add (0); + + midiNodeIds.add ((uint32) zeroNodeID); + + for (int i = 0; i < orderedNodes.size(); ++i) + { + createRenderingOpsForNode ((AudioProcessorGraph::Node*) orderedNodes.getUnchecked(i), + renderingOps, i); + + markAnyUnusedBuffersAsFree (i); + } + + graph.setLatencySamples (totalLatency); + } + + int getNumBuffersNeeded() const { return nodeIds.size(); } + int getNumMidiBuffersNeeded() const { return midiNodeIds.size(); } + +private: + //============================================================================== + AudioProcessorGraph& graph; + const Array& orderedNodes; + Array channels; + Array nodeIds, midiNodeIds; + + enum { freeNodeID = 0xffffffff, zeroNodeID = 0xfffffffe }; + + static bool isNodeBusy (uint32 nodeID) noexcept { return nodeID != freeNodeID && nodeID != zeroNodeID; } + + Array nodeDelayIDs; + Array nodeDelays; + int totalLatency; + + int getNodeDelay (const uint32 nodeID) const { return nodeDelays [nodeDelayIDs.indexOf (nodeID)]; } + + void setNodeDelay (const uint32 nodeID, const int latency) + { + const int index = nodeDelayIDs.indexOf (nodeID); + + if (index >= 0) + { + nodeDelays.set (index, latency); + } + else + { + nodeDelayIDs.add (nodeID); + nodeDelays.add (latency); + } + } + + int getInputLatencyForNode (const uint32 nodeID) const + { + int maxLatency = 0; + + for (int i = graph.getNumConnections(); --i >= 0;) + { + const AudioProcessorGraph::Connection* const c = graph.getConnection (i); + + if (c->destNodeId == nodeID) + maxLatency = jmax (maxLatency, getNodeDelay (c->sourceNodeId)); + } + + return maxLatency; + } + + //============================================================================== + void createRenderingOpsForNode (AudioProcessorGraph::Node* const node, + Array& renderingOps, + const int ourRenderingIndex) + { + const int numIns = node->getProcessor()->getNumInputChannels(); + const int numOuts = node->getProcessor()->getNumOutputChannels(); + const int totalChans = jmax (numIns, numOuts); + + Array audioChannelsToUse; + int midiBufferToUse = -1; + + int maxLatency = getInputLatencyForNode (node->nodeId); + + for (int inputChan = 0; inputChan < numIns; ++inputChan) + { + // get a list of all the inputs to this node + Array sourceNodes; + Array sourceOutputChans; + + for (int i = graph.getNumConnections(); --i >= 0;) + { + const AudioProcessorGraph::Connection* const c = graph.getConnection (i); + + if (c->destNodeId == node->nodeId && c->destChannelIndex == inputChan) + { + sourceNodes.add (c->sourceNodeId); + sourceOutputChans.add (c->sourceChannelIndex); + } + } + + int bufIndex = -1; + + if (sourceNodes.size() == 0) + { + // unconnected input channel + + if (inputChan >= numOuts) + { + bufIndex = getReadOnlyEmptyBuffer(); + jassert (bufIndex >= 0); + } + else + { + bufIndex = getFreeBuffer (false); + renderingOps.add (new ClearChannelOp (bufIndex)); + } + } + else if (sourceNodes.size() == 1) + { + // channel with a straightforward single input.. + const uint32 srcNode = sourceNodes.getUnchecked(0); + const int srcChan = sourceOutputChans.getUnchecked(0); + + bufIndex = getBufferContaining (srcNode, srcChan); + + if (bufIndex < 0) + { + // if not found, this is probably a feedback loop + bufIndex = getReadOnlyEmptyBuffer(); + jassert (bufIndex >= 0); + } + + if (inputChan < numOuts + && isBufferNeededLater (ourRenderingIndex, + inputChan, + srcNode, srcChan)) + { + // can't mess up this channel because it's needed later by another node, so we + // need to use a copy of it.. + const int newFreeBuffer = getFreeBuffer (false); + + renderingOps.add (new CopyChannelOp (bufIndex, newFreeBuffer)); + + bufIndex = newFreeBuffer; + } + + const int nodeDelay = getNodeDelay (srcNode); + + if (nodeDelay < maxLatency) + renderingOps.add (new DelayChannelOp (bufIndex, maxLatency - nodeDelay)); + } + else + { + // channel with a mix of several inputs.. + + // try to find a re-usable channel from our inputs.. + int reusableInputIndex = -1; + + for (int i = 0; i < sourceNodes.size(); ++i) + { + const int sourceBufIndex = getBufferContaining (sourceNodes.getUnchecked(i), + sourceOutputChans.getUnchecked(i)); + + if (sourceBufIndex >= 0 + && ! isBufferNeededLater (ourRenderingIndex, + inputChan, + sourceNodes.getUnchecked(i), + sourceOutputChans.getUnchecked(i))) + { + // we've found one of our input chans that can be re-used.. + reusableInputIndex = i; + bufIndex = sourceBufIndex; + + const int nodeDelay = getNodeDelay (sourceNodes.getUnchecked (i)); + if (nodeDelay < maxLatency) + renderingOps.add (new DelayChannelOp (sourceBufIndex, maxLatency - nodeDelay)); + + break; + } + } + + if (reusableInputIndex < 0) + { + // can't re-use any of our input chans, so get a new one and copy everything into it.. + bufIndex = getFreeBuffer (false); + jassert (bufIndex != 0); + + const int srcIndex = getBufferContaining (sourceNodes.getUnchecked (0), + sourceOutputChans.getUnchecked (0)); + if (srcIndex < 0) + { + // if not found, this is probably a feedback loop + renderingOps.add (new ClearChannelOp (bufIndex)); + } + else + { + renderingOps.add (new CopyChannelOp (srcIndex, bufIndex)); + } + + reusableInputIndex = 0; + const int nodeDelay = getNodeDelay (sourceNodes.getFirst()); + + if (nodeDelay < maxLatency) + renderingOps.add (new DelayChannelOp (bufIndex, maxLatency - nodeDelay)); + } + + for (int j = 0; j < sourceNodes.size(); ++j) + { + if (j != reusableInputIndex) + { + int srcIndex = getBufferContaining (sourceNodes.getUnchecked(j), + sourceOutputChans.getUnchecked(j)); + if (srcIndex >= 0) + { + const int nodeDelay = getNodeDelay (sourceNodes.getUnchecked (j)); + + if (nodeDelay < maxLatency) + { + if (! isBufferNeededLater (ourRenderingIndex, inputChan, + sourceNodes.getUnchecked(j), + sourceOutputChans.getUnchecked(j))) + { + renderingOps.add (new DelayChannelOp (srcIndex, maxLatency - nodeDelay)); + } + else // buffer is reused elsewhere, can't be delayed + { + const int bufferToDelay = getFreeBuffer (false); + renderingOps.add (new CopyChannelOp (srcIndex, bufferToDelay)); + renderingOps.add (new DelayChannelOp (bufferToDelay, maxLatency - nodeDelay)); + srcIndex = bufferToDelay; + } + } + + renderingOps.add (new AddChannelOp (srcIndex, bufIndex)); + } + } + } + } + + jassert (bufIndex >= 0); + audioChannelsToUse.add (bufIndex); + + if (inputChan < numOuts) + markBufferAsContaining (bufIndex, node->nodeId, inputChan); + } + + for (int outputChan = numIns; outputChan < numOuts; ++outputChan) + { + const int bufIndex = getFreeBuffer (false); + jassert (bufIndex != 0); + audioChannelsToUse.add (bufIndex); + + markBufferAsContaining (bufIndex, node->nodeId, outputChan); + } + + // Now the same thing for midi.. + Array midiSourceNodes; + + for (int i = graph.getNumConnections(); --i >= 0;) + { + const AudioProcessorGraph::Connection* const c = graph.getConnection (i); + + if (c->destNodeId == node->nodeId && c->destChannelIndex == AudioProcessorGraph::midiChannelIndex) + midiSourceNodes.add (c->sourceNodeId); + } + + if (midiSourceNodes.size() == 0) + { + // No midi inputs.. + midiBufferToUse = getFreeBuffer (true); // need to pick a buffer even if the processor doesn't use midi + + if (node->getProcessor()->acceptsMidi() || node->getProcessor()->producesMidi()) + renderingOps.add (new ClearMidiBufferOp (midiBufferToUse)); + } + else if (midiSourceNodes.size() == 1) + { + // One midi input.. + midiBufferToUse = getBufferContaining (midiSourceNodes.getUnchecked(0), + AudioProcessorGraph::midiChannelIndex); + + if (midiBufferToUse >= 0) + { + if (isBufferNeededLater (ourRenderingIndex, + AudioProcessorGraph::midiChannelIndex, + midiSourceNodes.getUnchecked(0), + AudioProcessorGraph::midiChannelIndex)) + { + // can't mess up this channel because it's needed later by another node, so we + // need to use a copy of it.. + const int newFreeBuffer = getFreeBuffer (true); + renderingOps.add (new CopyMidiBufferOp (midiBufferToUse, newFreeBuffer)); + midiBufferToUse = newFreeBuffer; + } + } + else + { + // probably a feedback loop, so just use an empty one.. + midiBufferToUse = getFreeBuffer (true); // need to pick a buffer even if the processor doesn't use midi + } + } + else + { + // More than one midi input being mixed.. + int reusableInputIndex = -1; + + for (int i = 0; i < midiSourceNodes.size(); ++i) + { + const int sourceBufIndex = getBufferContaining (midiSourceNodes.getUnchecked(i), + AudioProcessorGraph::midiChannelIndex); + + if (sourceBufIndex >= 0 + && ! isBufferNeededLater (ourRenderingIndex, + AudioProcessorGraph::midiChannelIndex, + midiSourceNodes.getUnchecked(i), + AudioProcessorGraph::midiChannelIndex)) + { + // we've found one of our input buffers that can be re-used.. + reusableInputIndex = i; + midiBufferToUse = sourceBufIndex; + break; + } + } + + if (reusableInputIndex < 0) + { + // can't re-use any of our input buffers, so get a new one and copy everything into it.. + midiBufferToUse = getFreeBuffer (true); + jassert (midiBufferToUse >= 0); + + const int srcIndex = getBufferContaining (midiSourceNodes.getUnchecked(0), + AudioProcessorGraph::midiChannelIndex); + if (srcIndex >= 0) + renderingOps.add (new CopyMidiBufferOp (srcIndex, midiBufferToUse)); + else + renderingOps.add (new ClearMidiBufferOp (midiBufferToUse)); + + reusableInputIndex = 0; + } + + for (int j = 0; j < midiSourceNodes.size(); ++j) + { + if (j != reusableInputIndex) + { + const int srcIndex = getBufferContaining (midiSourceNodes.getUnchecked(j), + AudioProcessorGraph::midiChannelIndex); + if (srcIndex >= 0) + renderingOps.add (new AddMidiBufferOp (srcIndex, midiBufferToUse)); + } + } + } + + if (node->getProcessor()->producesMidi()) + markBufferAsContaining (midiBufferToUse, node->nodeId, + AudioProcessorGraph::midiChannelIndex); + + setNodeDelay (node->nodeId, maxLatency + node->getProcessor()->getLatencySamples()); + + if (numOuts == 0) + totalLatency = maxLatency; + + renderingOps.add (new ProcessBufferOp (node, audioChannelsToUse, + totalChans, midiBufferToUse)); + } + + //============================================================================== + int getFreeBuffer (const bool forMidi) + { + if (forMidi) + { + for (int i = 1; i < midiNodeIds.size(); ++i) + if (midiNodeIds.getUnchecked(i) == freeNodeID) + return i; + + midiNodeIds.add ((uint32) freeNodeID); + return midiNodeIds.size() - 1; + } + else + { + for (int i = 1; i < nodeIds.size(); ++i) + if (nodeIds.getUnchecked(i) == freeNodeID) + return i; + + nodeIds.add ((uint32) freeNodeID); + channels.add (0); + return nodeIds.size() - 1; + } + } + + int getReadOnlyEmptyBuffer() const noexcept + { + return 0; + } + + int getBufferContaining (const uint32 nodeId, const int outputChannel) const noexcept + { + if (outputChannel == AudioProcessorGraph::midiChannelIndex) + { + for (int i = midiNodeIds.size(); --i >= 0;) + if (midiNodeIds.getUnchecked(i) == nodeId) + return i; + } + else + { + for (int i = nodeIds.size(); --i >= 0;) + if (nodeIds.getUnchecked(i) == nodeId + && channels.getUnchecked(i) == outputChannel) + return i; + } + + return -1; + } + + void markAnyUnusedBuffersAsFree (const int stepIndex) + { + for (int i = 0; i < nodeIds.size(); ++i) + { + if (isNodeBusy (nodeIds.getUnchecked(i)) + && ! isBufferNeededLater (stepIndex, -1, + nodeIds.getUnchecked(i), + channels.getUnchecked(i))) + { + nodeIds.set (i, (uint32) freeNodeID); + } + } + + for (int i = 0; i < midiNodeIds.size(); ++i) + { + if (isNodeBusy (midiNodeIds.getUnchecked(i)) + && ! isBufferNeededLater (stepIndex, -1, + midiNodeIds.getUnchecked(i), + AudioProcessorGraph::midiChannelIndex)) + { + midiNodeIds.set (i, (uint32) freeNodeID); + } + } + } + + bool isBufferNeededLater (int stepIndexToSearchFrom, + int inputChannelOfIndexToIgnore, + const uint32 nodeId, + const int outputChanIndex) const + { + while (stepIndexToSearchFrom < orderedNodes.size()) + { + const AudioProcessorGraph::Node* const node = (const AudioProcessorGraph::Node*) orderedNodes.getUnchecked (stepIndexToSearchFrom); + + if (outputChanIndex == AudioProcessorGraph::midiChannelIndex) + { + if (inputChannelOfIndexToIgnore != AudioProcessorGraph::midiChannelIndex + && graph.getConnectionBetween (nodeId, AudioProcessorGraph::midiChannelIndex, + node->nodeId, AudioProcessorGraph::midiChannelIndex) != nullptr) + return true; + } + else + { + for (int i = 0; i < node->getProcessor()->getNumInputChannels(); ++i) + if (i != inputChannelOfIndexToIgnore + && graph.getConnectionBetween (nodeId, outputChanIndex, + node->nodeId, i) != nullptr) + return true; + } + + inputChannelOfIndexToIgnore = -1; + ++stepIndexToSearchFrom; + } + + return false; + } + + void markBufferAsContaining (int bufferNum, uint32 nodeId, int outputIndex) + { + if (outputIndex == AudioProcessorGraph::midiChannelIndex) + { + jassert (bufferNum > 0 && bufferNum < midiNodeIds.size()); + + midiNodeIds.set (bufferNum, nodeId); + } + else + { + jassert (bufferNum >= 0 && bufferNum < nodeIds.size()); + + nodeIds.set (bufferNum, nodeId); + channels.set (bufferNum, outputIndex); + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RenderingOpSequenceCalculator) +}; + +//============================================================================== +// Holds a fast lookup table for checking which nodes are inputs to others. +class ConnectionLookupTable +{ +public: + explicit ConnectionLookupTable (const OwnedArray& connections) + { + for (int i = 0; i < connections.size(); ++i) + { + const AudioProcessorGraph::Connection* const c = connections.getUnchecked(i); + + int index; + Entry* entry = findEntry (c->destNodeId, index); + + if (entry == nullptr) + { + entry = new Entry (c->destNodeId); + entries.insert (index, entry); + } + + entry->srcNodes.add (c->sourceNodeId); + } + } + + bool isAnInputTo (const uint32 possibleInputId, + const uint32 possibleDestinationId) const noexcept + { + return isAnInputToRecursive (possibleInputId, possibleDestinationId, entries.size()); + } + +private: + //============================================================================== + struct Entry + { + explicit Entry (const uint32 destNodeId_) noexcept : destNodeId (destNodeId_) {} + + const uint32 destNodeId; + SortedSet srcNodes; + + JUCE_DECLARE_NON_COPYABLE (Entry) + }; + + OwnedArray entries; + + bool isAnInputToRecursive (const uint32 possibleInputId, + const uint32 possibleDestinationId, + int recursionCheck) const noexcept + { + int index; + + if (const Entry* const entry = findEntry (possibleDestinationId, index)) + { + const SortedSet& srcNodes = entry->srcNodes; + + if (srcNodes.contains (possibleInputId)) + return true; + + if (--recursionCheck >= 0) + { + for (int i = 0; i < srcNodes.size(); ++i) + if (isAnInputToRecursive (possibleInputId, srcNodes.getUnchecked(i), recursionCheck)) + return true; + } + } + + return false; + } + + Entry* findEntry (const uint32 destNodeId, int& insertIndex) const noexcept + { + Entry* result = nullptr; + + int start = 0; + int end = entries.size(); + + for (;;) + { + if (start >= end) + { + break; + } + else if (destNodeId == entries.getUnchecked (start)->destNodeId) + { + result = entries.getUnchecked (start); + break; + } + else + { + const int halfway = (start + end) / 2; + + if (halfway == start) + { + if (destNodeId >= entries.getUnchecked (halfway)->destNodeId) + ++start; + + break; + } + else if (destNodeId >= entries.getUnchecked (halfway)->destNodeId) + start = halfway; + else + end = halfway; + } + } + + insertIndex = start; + return result; + } + + JUCE_DECLARE_NON_COPYABLE (ConnectionLookupTable) +}; + +//============================================================================== +struct ConnectionSorter +{ + static int compareElements (const AudioProcessorGraph::Connection* const first, + const AudioProcessorGraph::Connection* const second) noexcept + { + if (first->sourceNodeId < second->sourceNodeId) return -1; + if (first->sourceNodeId > second->sourceNodeId) return 1; + if (first->destNodeId < second->destNodeId) return -1; + if (first->destNodeId > second->destNodeId) return 1; + if (first->sourceChannelIndex < second->sourceChannelIndex) return -1; + if (first->sourceChannelIndex > second->sourceChannelIndex) return 1; + if (first->destChannelIndex < second->destChannelIndex) return -1; + if (first->destChannelIndex > second->destChannelIndex) return 1; + + return 0; + } +}; + +} + +//============================================================================== +AudioProcessorGraph::Connection::Connection (const uint32 sourceNodeId_, const int sourceChannelIndex_, + const uint32 destNodeId_, const int destChannelIndex_) noexcept + : sourceNodeId (sourceNodeId_), sourceChannelIndex (sourceChannelIndex_), + destNodeId (destNodeId_), destChannelIndex (destChannelIndex_) +{ +} + +//============================================================================== +AudioProcessorGraph::Node::Node (const uint32 nodeId_, AudioProcessor* const processor_) noexcept + : nodeId (nodeId_), + processor (processor_), + isPrepared (false) +{ + jassert (processor != nullptr); +} + +void AudioProcessorGraph::Node::prepare (const double sampleRate, const int blockSize, + AudioProcessorGraph* const graph) +{ + if (! isPrepared) + { + isPrepared = true; + setParentGraph (graph); + + processor->setPlayConfigDetails (processor->getNumInputChannels(), + processor->getNumOutputChannels(), + sampleRate, blockSize); + + processor->prepareToPlay (sampleRate, blockSize); + } +} + +void AudioProcessorGraph::Node::unprepare() +{ + if (isPrepared) + { + isPrepared = false; + processor->releaseResources(); + } +} + +void AudioProcessorGraph::Node::setParentGraph (AudioProcessorGraph* const graph) const +{ + if (AudioProcessorGraph::AudioGraphIOProcessor* const ioProc + = dynamic_cast (processor.get())) + ioProc->setParentGraph (graph); +} + +//============================================================================== +AudioProcessorGraph::AudioProcessorGraph() + : lastNodeId (0), + currentAudioInputBuffer (nullptr), + currentMidiInputBuffer (nullptr) +{ +} + +AudioProcessorGraph::~AudioProcessorGraph() +{ + clearRenderingSequence(); + clear(); +} + +const String AudioProcessorGraph::getName() const +{ + return "Audio Graph"; +} + +//============================================================================== +void AudioProcessorGraph::clear() +{ + nodes.clear(); + connections.clear(); + triggerAsyncUpdate(); +} + +AudioProcessorGraph::Node* AudioProcessorGraph::getNodeForId (const uint32 nodeId) const +{ + for (int i = nodes.size(); --i >= 0;) + if (nodes.getUnchecked(i)->nodeId == nodeId) + return nodes.getUnchecked(i); + + return nullptr; +} + +AudioProcessorGraph::Node* AudioProcessorGraph::addNode (AudioProcessor* const newProcessor, uint32 nodeId) +{ + if (newProcessor == nullptr || newProcessor == this) + { + jassertfalse; + return nullptr; + } + + for (int i = nodes.size(); --i >= 0;) + { + if (nodes.getUnchecked(i)->getProcessor() == newProcessor) + { + jassertfalse; // Cannot add the same object to the graph twice! + return nullptr; + } + } + + if (nodeId == 0) + { + nodeId = ++lastNodeId; + } + else + { + // you can't add a node with an id that already exists in the graph.. + jassert (getNodeForId (nodeId) == nullptr); + removeNode (nodeId); + + if (nodeId > lastNodeId) + lastNodeId = nodeId; + } + + newProcessor->setPlayHead (getPlayHead()); + + Node* const n = new Node (nodeId, newProcessor); + nodes.add (n); + triggerAsyncUpdate(); + + n->setParentGraph (this); + return n; +} + +bool AudioProcessorGraph::removeNode (const uint32 nodeId) +{ + disconnectNode (nodeId); + + for (int i = nodes.size(); --i >= 0;) + { + if (nodes.getUnchecked(i)->nodeId == nodeId) + { + nodes.getUnchecked(i)->setParentGraph (nullptr); + nodes.remove (i); + triggerAsyncUpdate(); + + return true; + } + } + + return false; +} + +//============================================================================== +const AudioProcessorGraph::Connection* AudioProcessorGraph::getConnectionBetween (const uint32 sourceNodeId, + const int sourceChannelIndex, + const uint32 destNodeId, + const int destChannelIndex) const +{ + const Connection c (sourceNodeId, sourceChannelIndex, destNodeId, destChannelIndex); + GraphRenderingOps::ConnectionSorter sorter; + return connections [connections.indexOfSorted (sorter, &c)]; +} + +bool AudioProcessorGraph::isConnected (const uint32 possibleSourceNodeId, + const uint32 possibleDestNodeId) const +{ + for (int i = connections.size(); --i >= 0;) + { + const Connection* const c = connections.getUnchecked(i); + + if (c->sourceNodeId == possibleSourceNodeId + && c->destNodeId == possibleDestNodeId) + { + return true; + } + } + + return false; +} + +bool AudioProcessorGraph::canConnect (const uint32 sourceNodeId, + const int sourceChannelIndex, + const uint32 destNodeId, + const int destChannelIndex) const +{ + if (sourceChannelIndex < 0 + || destChannelIndex < 0 + || sourceNodeId == destNodeId + || (destChannelIndex == midiChannelIndex) != (sourceChannelIndex == midiChannelIndex)) + return false; + + const Node* const source = getNodeForId (sourceNodeId); + + if (source == nullptr + || (sourceChannelIndex != midiChannelIndex && sourceChannelIndex >= source->processor->getNumOutputChannels()) + || (sourceChannelIndex == midiChannelIndex && ! source->processor->producesMidi())) + return false; + + const Node* const dest = getNodeForId (destNodeId); + + if (dest == nullptr + || (destChannelIndex != midiChannelIndex && destChannelIndex >= dest->processor->getNumInputChannels()) + || (destChannelIndex == midiChannelIndex && ! dest->processor->acceptsMidi())) + return false; + + return getConnectionBetween (sourceNodeId, sourceChannelIndex, + destNodeId, destChannelIndex) == nullptr; +} + +bool AudioProcessorGraph::addConnection (const uint32 sourceNodeId, + const int sourceChannelIndex, + const uint32 destNodeId, + const int destChannelIndex) +{ + if (! canConnect (sourceNodeId, sourceChannelIndex, destNodeId, destChannelIndex)) + return false; + + GraphRenderingOps::ConnectionSorter sorter; + connections.addSorted (sorter, new Connection (sourceNodeId, sourceChannelIndex, + destNodeId, destChannelIndex)); + triggerAsyncUpdate(); + return true; +} + +void AudioProcessorGraph::removeConnection (const int index) +{ + connections.remove (index); + triggerAsyncUpdate(); +} + +bool AudioProcessorGraph::removeConnection (const uint32 sourceNodeId, const int sourceChannelIndex, + const uint32 destNodeId, const int destChannelIndex) +{ + bool doneAnything = false; + + for (int i = connections.size(); --i >= 0;) + { + const Connection* const c = connections.getUnchecked(i); + + if (c->sourceNodeId == sourceNodeId + && c->destNodeId == destNodeId + && c->sourceChannelIndex == sourceChannelIndex + && c->destChannelIndex == destChannelIndex) + { + removeConnection (i); + doneAnything = true; + } + } + + return doneAnything; +} + +bool AudioProcessorGraph::disconnectNode (const uint32 nodeId) +{ + bool doneAnything = false; + + for (int i = connections.size(); --i >= 0;) + { + const Connection* const c = connections.getUnchecked(i); + + if (c->sourceNodeId == nodeId || c->destNodeId == nodeId) + { + removeConnection (i); + doneAnything = true; + } + } + + return doneAnything; +} + +bool AudioProcessorGraph::isConnectionLegal (const Connection* const c) const +{ + jassert (c != nullptr); + + const Node* const source = getNodeForId (c->sourceNodeId); + const Node* const dest = getNodeForId (c->destNodeId); + + return source != nullptr + && dest != nullptr + && (c->sourceChannelIndex != midiChannelIndex ? isPositiveAndBelow (c->sourceChannelIndex, source->processor->getNumOutputChannels()) + : source->processor->producesMidi()) + && (c->destChannelIndex != midiChannelIndex ? isPositiveAndBelow (c->destChannelIndex, dest->processor->getNumInputChannels()) + : dest->processor->acceptsMidi()); +} + +bool AudioProcessorGraph::removeIllegalConnections() +{ + bool doneAnything = false; + + for (int i = connections.size(); --i >= 0;) + { + if (! isConnectionLegal (connections.getUnchecked(i))) + { + removeConnection (i); + doneAnything = true; + } + } + + return doneAnything; +} + +//============================================================================== +static void deleteRenderOpArray (Array& ops) +{ + for (int i = ops.size(); --i >= 0;) + delete static_cast (ops.getUnchecked(i)); +} + +void AudioProcessorGraph::clearRenderingSequence() +{ + Array oldOps; + + { + const ScopedLock sl (getCallbackLock()); + renderingOps.swapWith (oldOps); + } + + deleteRenderOpArray (oldOps); +} + +bool AudioProcessorGraph::isAnInputTo (const uint32 possibleInputId, + const uint32 possibleDestinationId, + const int recursionCheck) const +{ + if (recursionCheck > 0) + { + for (int i = connections.size(); --i >= 0;) + { + const AudioProcessorGraph::Connection* const c = connections.getUnchecked (i); + + if (c->destNodeId == possibleDestinationId + && (c->sourceNodeId == possibleInputId + || isAnInputTo (possibleInputId, c->sourceNodeId, recursionCheck - 1))) + return true; + } + } + + return false; +} + +void AudioProcessorGraph::buildRenderingSequence() +{ + Array newRenderingOps; + int numRenderingBuffersNeeded = 2; + int numMidiBuffersNeeded = 1; + + { + MessageManagerLock mml; + + Array orderedNodes; + + { + const GraphRenderingOps::ConnectionLookupTable table (connections); + + for (int i = 0; i < nodes.size(); ++i) + { + Node* const node = nodes.getUnchecked(i); + + node->prepare (getSampleRate(), getBlockSize(), this); + + int j = 0; + for (; j < orderedNodes.size(); ++j) + if (table.isAnInputTo (node->nodeId, ((Node*) orderedNodes.getUnchecked(j))->nodeId)) + break; + + orderedNodes.insert (j, node); + } + } + + GraphRenderingOps::RenderingOpSequenceCalculator calculator (*this, orderedNodes, newRenderingOps); + + numRenderingBuffersNeeded = calculator.getNumBuffersNeeded(); + numMidiBuffersNeeded = calculator.getNumMidiBuffersNeeded(); + } + + { + // swap over to the new rendering sequence.. + const ScopedLock sl (getCallbackLock()); + + renderingBuffers.setSize (numRenderingBuffersNeeded, getBlockSize()); + renderingBuffers.clear(); + + for (int i = midiBuffers.size(); --i >= 0;) + midiBuffers.getUnchecked(i)->clear(); + + while (midiBuffers.size() < numMidiBuffersNeeded) + midiBuffers.add (new MidiBuffer()); + + renderingOps.swapWith (newRenderingOps); + } + + // delete the old ones.. + deleteRenderOpArray (newRenderingOps); +} + +void AudioProcessorGraph::handleAsyncUpdate() +{ + buildRenderingSequence(); +} + +//============================================================================== +void AudioProcessorGraph::prepareToPlay (double /*sampleRate*/, int estimatedSamplesPerBlock) +{ + currentAudioInputBuffer = nullptr; + currentAudioOutputBuffer.setSize (jmax (1, getNumOutputChannels()), estimatedSamplesPerBlock); + currentMidiInputBuffer = nullptr; + currentMidiOutputBuffer.clear(); + + clearRenderingSequence(); + buildRenderingSequence(); +} + +void AudioProcessorGraph::releaseResources() +{ + for (int i = 0; i < nodes.size(); ++i) + nodes.getUnchecked(i)->unprepare(); + + renderingBuffers.setSize (1, 1); + midiBuffers.clear(); + + currentAudioInputBuffer = nullptr; + currentAudioOutputBuffer.setSize (1, 1); + currentMidiInputBuffer = nullptr; + currentMidiOutputBuffer.clear(); +} + +void AudioProcessorGraph::reset() +{ + const ScopedLock sl (getCallbackLock()); + + for (int i = 0; i < nodes.size(); ++i) + nodes.getUnchecked(i)->getProcessor()->reset(); +} + +void AudioProcessorGraph::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) +{ + const int numSamples = buffer.getNumSamples(); + + currentAudioInputBuffer = &buffer; + currentAudioOutputBuffer.setSize (jmax (1, buffer.getNumChannels()), numSamples); + currentAudioOutputBuffer.clear(); + currentMidiInputBuffer = &midiMessages; + currentMidiOutputBuffer.clear(); + + for (int i = 0; i < renderingOps.size(); ++i) + { + GraphRenderingOps::AudioGraphRenderingOp* const op + = (GraphRenderingOps::AudioGraphRenderingOp*) renderingOps.getUnchecked(i); + + op->perform (renderingBuffers, midiBuffers, numSamples); + } + + for (int i = 0; i < buffer.getNumChannels(); ++i) + buffer.copyFrom (i, 0, currentAudioOutputBuffer, i, 0, numSamples); + + midiMessages.clear(); + midiMessages.addEvents (currentMidiOutputBuffer, 0, buffer.getNumSamples(), 0); +} + +const String AudioProcessorGraph::getInputChannelName (int channelIndex) const +{ + return "Input " + String (channelIndex + 1); +} + +const String AudioProcessorGraph::getOutputChannelName (int channelIndex) const +{ + return "Output " + String (channelIndex + 1); +} + +bool AudioProcessorGraph::isInputChannelStereoPair (int /*index*/) const { return true; } +bool AudioProcessorGraph::isOutputChannelStereoPair (int /*index*/) const { return true; } +bool AudioProcessorGraph::silenceInProducesSilenceOut() const { return false; } +double AudioProcessorGraph::getTailLengthSeconds() const { return 0; } +bool AudioProcessorGraph::acceptsMidi() const { return true; } +bool AudioProcessorGraph::producesMidi() const { return true; } +void AudioProcessorGraph::getStateInformation (juce::MemoryBlock& /*destData*/) {} +void AudioProcessorGraph::setStateInformation (const void* /*data*/, int /*sizeInBytes*/) {} + + +//============================================================================== +AudioProcessorGraph::AudioGraphIOProcessor::AudioGraphIOProcessor (const IODeviceType type_) + : type (type_), + graph (nullptr) +{ +} + +AudioProcessorGraph::AudioGraphIOProcessor::~AudioGraphIOProcessor() +{ +} + +const String AudioProcessorGraph::AudioGraphIOProcessor::getName() const +{ + switch (type) + { + case audioOutputNode: return "Audio Output"; + case audioInputNode: return "Audio Input"; + case midiOutputNode: return "Midi Output"; + case midiInputNode: return "Midi Input"; + default: break; + } + + return String(); +} + +void AudioProcessorGraph::AudioGraphIOProcessor::fillInPluginDescription (PluginDescription& d) const +{ + d.name = getName(); + d.uid = d.name.hashCode(); + d.category = "I/O devices"; + d.pluginFormatName = "Internal"; + d.manufacturerName = "Raw Material Software"; + d.version = "1.0"; + d.isInstrument = false; + + d.numInputChannels = getNumInputChannels(); + if (type == audioOutputNode && graph != nullptr) + d.numInputChannels = graph->getNumInputChannels(); + + d.numOutputChannels = getNumOutputChannels(); + if (type == audioInputNode && graph != nullptr) + d.numOutputChannels = graph->getNumOutputChannels(); +} + +void AudioProcessorGraph::AudioGraphIOProcessor::prepareToPlay (double, int) +{ + jassert (graph != nullptr); +} + +void AudioProcessorGraph::AudioGraphIOProcessor::releaseResources() +{ +} + +void AudioProcessorGraph::AudioGraphIOProcessor::processBlock (AudioSampleBuffer& buffer, + MidiBuffer& midiMessages) +{ + jassert (graph != nullptr); + + switch (type) + { + case audioOutputNode: + { + for (int i = jmin (graph->currentAudioOutputBuffer.getNumChannels(), + buffer.getNumChannels()); --i >= 0;) + { + graph->currentAudioOutputBuffer.addFrom (i, 0, buffer, i, 0, buffer.getNumSamples()); + } + + break; + } + + case audioInputNode: + { + for (int i = jmin (graph->currentAudioInputBuffer->getNumChannels(), + buffer.getNumChannels()); --i >= 0;) + { + buffer.copyFrom (i, 0, *graph->currentAudioInputBuffer, i, 0, buffer.getNumSamples()); + } + + break; + } + + case midiOutputNode: + graph->currentMidiOutputBuffer.addEvents (midiMessages, 0, buffer.getNumSamples(), 0); + break; + + case midiInputNode: + midiMessages.addEvents (*graph->currentMidiInputBuffer, 0, buffer.getNumSamples(), 0); + break; + + default: + break; + } +} + +bool AudioProcessorGraph::AudioGraphIOProcessor::silenceInProducesSilenceOut() const +{ + return isOutput(); +} + +double AudioProcessorGraph::AudioGraphIOProcessor::getTailLengthSeconds() const +{ + return 0; +} + +bool AudioProcessorGraph::AudioGraphIOProcessor::acceptsMidi() const +{ + return type == midiOutputNode; +} + +bool AudioProcessorGraph::AudioGraphIOProcessor::producesMidi() const +{ + return type == midiInputNode; +} + +const String AudioProcessorGraph::AudioGraphIOProcessor::getInputChannelName (int channelIndex) const +{ + switch (type) + { + case audioOutputNode: return "Output " + String (channelIndex + 1); + case midiOutputNode: return "Midi Output"; + default: break; + } + + return String(); +} + +const String AudioProcessorGraph::AudioGraphIOProcessor::getOutputChannelName (int channelIndex) const +{ + switch (type) + { + case audioInputNode: return "Input " + String (channelIndex + 1); + case midiInputNode: return "Midi Input"; + default: break; + } + + return String(); +} + +bool AudioProcessorGraph::AudioGraphIOProcessor::isInputChannelStereoPair (int /*index*/) const +{ + return type == audioInputNode || type == audioOutputNode; +} + +bool AudioProcessorGraph::AudioGraphIOProcessor::isOutputChannelStereoPair (int index) const +{ + return isInputChannelStereoPair (index); +} + +bool AudioProcessorGraph::AudioGraphIOProcessor::isInput() const { return type == audioInputNode || type == midiInputNode; } +bool AudioProcessorGraph::AudioGraphIOProcessor::isOutput() const { return type == audioOutputNode || type == midiOutputNode; } + +bool AudioProcessorGraph::AudioGraphIOProcessor::hasEditor() const { return false; } +AudioProcessorEditor* AudioProcessorGraph::AudioGraphIOProcessor::createEditor() { return nullptr; } + +int AudioProcessorGraph::AudioGraphIOProcessor::getNumParameters() { return 0; } +const String AudioProcessorGraph::AudioGraphIOProcessor::getParameterName (int) { return String(); } + +float AudioProcessorGraph::AudioGraphIOProcessor::getParameter (int) { return 0.0f; } +const String AudioProcessorGraph::AudioGraphIOProcessor::getParameterText (int) { return String(); } +void AudioProcessorGraph::AudioGraphIOProcessor::setParameter (int, float) { } + +int AudioProcessorGraph::AudioGraphIOProcessor::getNumPrograms() { return 0; } +int AudioProcessorGraph::AudioGraphIOProcessor::getCurrentProgram() { return 0; } +void AudioProcessorGraph::AudioGraphIOProcessor::setCurrentProgram (int) { } + +const String AudioProcessorGraph::AudioGraphIOProcessor::getProgramName (int) { return String(); } +void AudioProcessorGraph::AudioGraphIOProcessor::changeProgramName (int, const String&) {} + +void AudioProcessorGraph::AudioGraphIOProcessor::getStateInformation (juce::MemoryBlock&) {} +void AudioProcessorGraph::AudioGraphIOProcessor::setStateInformation (const void*, int) {} + +void AudioProcessorGraph::AudioGraphIOProcessor::setParentGraph (AudioProcessorGraph* const newGraph) +{ + graph = newGraph; + + if (graph != nullptr) + { + setPlayConfigDetails (type == audioOutputNode ? graph->getNumOutputChannels() : 0, + type == audioInputNode ? graph->getNumInputChannels() : 0, + getSampleRate(), + getBlockSize()); + + updateHostDisplay(); + } +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h new file mode 100644 index 0000000000..d94468235a --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -0,0 +1,413 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPROCESSORGRAPH_H_INCLUDED +#define JUCE_AUDIOPROCESSORGRAPH_H_INCLUDED + + +//============================================================================== +/** + A type of AudioProcessor which plays back a graph of other AudioProcessors. + + Use one of these objects if you want to wire-up a set of AudioProcessors + and play back the result. + + Processors can be added to the graph as "nodes" using addNode(), and once + added, you can connect any of their input or output channels to other + nodes using addConnection(). + + To play back a graph through an audio device, you might want to use an + AudioProcessorPlayer object. +*/ +class JUCE_API AudioProcessorGraph : public AudioProcessor, + private AsyncUpdater +{ +public: + //============================================================================== + /** Creates an empty graph. */ + AudioProcessorGraph(); + + /** Destructor. + Any processor objects that have been added to the graph will also be deleted. + */ + ~AudioProcessorGraph(); + + //============================================================================== + /** Represents one of the nodes, or processors, in an AudioProcessorGraph. + + To create a node, call AudioProcessorGraph::addNode(). + */ + class JUCE_API Node : public ReferenceCountedObject + { + public: + //============================================================================== + /** The ID number assigned to this node. + This is assigned by the graph that owns it, and can't be changed. + */ + const uint32 nodeId; + + /** The actual processor object that this node represents. */ + AudioProcessor* getProcessor() const noexcept { return processor; } + + /** A set of user-definable properties that are associated with this node. + + This can be used to attach values to the node for whatever purpose seems + useful. For example, you might store an x and y position if your application + is displaying the nodes on-screen. + */ + NamedValueSet properties; + + //============================================================================== + /** A convenient typedef for referring to a pointer to a node object. */ + typedef ReferenceCountedObjectPtr Ptr; + + private: + //============================================================================== + friend class AudioProcessorGraph; + + const ScopedPointer processor; + bool isPrepared; + + Node (uint32 nodeId, AudioProcessor*) noexcept; + + void setParentGraph (AudioProcessorGraph*) const; + void prepare (double sampleRate, int blockSize, AudioProcessorGraph*); + void unprepare(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Node) + }; + + //============================================================================== + /** Represents a connection between two channels of two nodes in an AudioProcessorGraph. + + To create a connection, use AudioProcessorGraph::addConnection(). + */ + struct JUCE_API Connection + { + public: + //============================================================================== + Connection (uint32 sourceNodeId, int sourceChannelIndex, + uint32 destNodeId, int destChannelIndex) noexcept; + + //============================================================================== + /** The ID number of the node which is the input source for this connection. + @see AudioProcessorGraph::getNodeForId + */ + uint32 sourceNodeId; + + /** The index of the output channel of the source node from which this + connection takes its data. + + If this value is the special number AudioProcessorGraph::midiChannelIndex, then + it is referring to the source node's midi output. Otherwise, it is the zero-based + index of an audio output channel in the source node. + */ + int sourceChannelIndex; + + /** The ID number of the node which is the destination for this connection. + @see AudioProcessorGraph::getNodeForId + */ + uint32 destNodeId; + + /** The index of the input channel of the destination node to which this + connection delivers its data. + + If this value is the special number AudioProcessorGraph::midiChannelIndex, then + it is referring to the destination node's midi input. Otherwise, it is the zero-based + index of an audio input channel in the destination node. + */ + int destChannelIndex; + + private: + //============================================================================== + JUCE_LEAK_DETECTOR (Connection) + }; + + //============================================================================== + /** Deletes all nodes and connections from this graph. + Any processor objects in the graph will be deleted. + */ + void clear(); + + /** Returns the number of nodes in the graph. */ + int getNumNodes() const { return nodes.size(); } + + /** Returns a pointer to one of the nodes in the graph. + This will return nullptr if the index is out of range. + @see getNodeForId + */ + Node* getNode (const int index) const { return nodes [index]; } + + /** Searches the graph for a node with the given ID number and returns it. + If no such node was found, this returns nullptr. + @see getNode + */ + Node* getNodeForId (const uint32 nodeId) const; + + /** Adds a node to the graph. + + This creates a new node in the graph, for the specified processor. Once you have + added a processor to the graph, the graph owns it and will delete it later when + it is no longer needed. + + The optional nodeId parameter lets you specify an ID to use for the node, but + if the value is already in use, this new node will overwrite the old one. + + If this succeeds, it returns a pointer to the newly-created node. + */ + Node* addNode (AudioProcessor* newProcessor, uint32 nodeId = 0); + + /** Deletes a node within the graph which has the specified ID. + + This will also delete any connections that are attached to this node. + */ + bool removeNode (uint32 nodeId); + + //============================================================================== + /** Returns the number of connections in the graph. */ + int getNumConnections() const { return connections.size(); } + + /** Returns a pointer to one of the connections in the graph. */ + const Connection* getConnection (int index) const { return connections [index]; } + + /** Searches for a connection between some specified channels. + If no such connection is found, this returns nullptr. + */ + const Connection* getConnectionBetween (uint32 sourceNodeId, + int sourceChannelIndex, + uint32 destNodeId, + int destChannelIndex) const; + + /** Returns true if there is a connection between any of the channels of + two specified nodes. + */ + bool isConnected (uint32 possibleSourceNodeId, + uint32 possibleDestNodeId) const; + + /** Returns true if it would be legal to connect the specified points. */ + bool canConnect (uint32 sourceNodeId, int sourceChannelIndex, + uint32 destNodeId, int destChannelIndex) const; + + /** Attempts to connect two specified channels of two nodes. + + If this isn't allowed (e.g. because you're trying to connect a midi channel + to an audio one or other such nonsense), then it'll return false. + */ + bool addConnection (uint32 sourceNodeId, int sourceChannelIndex, + uint32 destNodeId, int destChannelIndex); + + /** Deletes the connection with the specified index. */ + void removeConnection (int index); + + /** Deletes any connection between two specified points. + Returns true if a connection was actually deleted. + */ + bool removeConnection (uint32 sourceNodeId, int sourceChannelIndex, + uint32 destNodeId, int destChannelIndex); + + /** Removes all connections from the specified node. */ + bool disconnectNode (uint32 nodeId); + + /** Returns true if the given connection's channel numbers map on to valid + channels at each end. + Even if a connection is valid when created, its status could change if + a node changes its channel config. + */ + bool isConnectionLegal (const Connection* connection) const; + + /** Performs a sanity checks of all the connections. + + This might be useful if some of the processors are doing things like changing + their channel counts, which could render some connections obsolete. + */ + bool removeIllegalConnections(); + + //============================================================================== + /** A special number that represents the midi channel of a node. + + This is used as a channel index value if you want to refer to the midi input + or output instead of an audio channel. + */ + static const int midiChannelIndex; + + + //============================================================================== + /** A special type of AudioProcessor that can live inside an AudioProcessorGraph + in order to use the audio that comes into and out of the graph itself. + + If you create an AudioGraphIOProcessor in "input" mode, it will act as a + node in the graph which delivers the audio that is coming into the parent + graph. This allows you to stream the data to other nodes and process the + incoming audio. + + Likewise, one of these in "output" mode can be sent data which it will add to + the sum of data being sent to the graph's output. + + @see AudioProcessorGraph + */ + class JUCE_API AudioGraphIOProcessor : public AudioPluginInstance + { + public: + /** Specifies the mode in which this processor will operate. + */ + enum IODeviceType + { + audioInputNode, /**< In this mode, the processor has output channels + representing all the audio input channels that are + coming into its parent audio graph. */ + audioOutputNode, /**< In this mode, the processor has input channels + representing all the audio output channels that are + going out of its parent audio graph. */ + midiInputNode, /**< In this mode, the processor has a midi output which + delivers the same midi data that is arriving at its + parent graph. */ + midiOutputNode /**< In this mode, the processor has a midi input and + any data sent to it will be passed out of the parent + graph. */ + }; + + //============================================================================== + /** Returns the mode of this processor. */ + IODeviceType getType() const { return type; } + + /** Returns the parent graph to which this processor belongs, or nullptr if it + hasn't yet been added to one. */ + AudioProcessorGraph* getParentGraph() const { return graph; } + + /** True if this is an audio or midi input. */ + bool isInput() const; + /** True if this is an audio or midi output. */ + bool isOutput() const; + + //============================================================================== + AudioGraphIOProcessor (const IODeviceType type); + ~AudioGraphIOProcessor(); + + const String getName() const; + void fillInPluginDescription (PluginDescription&) const; + + void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); + void releaseResources(); + void processBlock (AudioSampleBuffer&, MidiBuffer&); + + const String getInputChannelName (int channelIndex) const; + const String getOutputChannelName (int channelIndex) const; + bool isInputChannelStereoPair (int index) const; + bool isOutputChannelStereoPair (int index) const; + bool silenceInProducesSilenceOut() const; + double getTailLengthSeconds() const; + bool acceptsMidi() const; + bool producesMidi() const; + + bool hasEditor() const; + AudioProcessorEditor* createEditor(); + + int getNumParameters(); + const String getParameterName (int); + float getParameter (int); + const String getParameterText (int); + void setParameter (int, float); + + int getNumPrograms(); + int getCurrentProgram(); + void setCurrentProgram (int); + const String getProgramName (int); + void changeProgramName (int, const String&); + + void getStateInformation (juce::MemoryBlock& destData); + void setStateInformation (const void* data, int sizeInBytes); + + /** @internal */ + void setParentGraph (AudioProcessorGraph*); + + private: + const IODeviceType type; + AudioProcessorGraph* graph; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioGraphIOProcessor) + }; + + //============================================================================== + // AudioProcessor methods: + + const String getName() const; + + void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); + void releaseResources(); + void processBlock (AudioSampleBuffer&, MidiBuffer&); + void reset(); + + const String getInputChannelName (int channelIndex) const; + const String getOutputChannelName (int channelIndex) const; + bool isInputChannelStereoPair (int index) const; + bool isOutputChannelStereoPair (int index) const; + bool silenceInProducesSilenceOut() const; + double getTailLengthSeconds() const; + + bool acceptsMidi() const; + bool producesMidi() const; + + bool hasEditor() const { return false; } + AudioProcessorEditor* createEditor() { return nullptr; } + + int getNumParameters() { return 0; } + const String getParameterName (int) { return String(); } + float getParameter (int) { return 0; } + const String getParameterText (int) { return String(); } + void setParameter (int, float) { } + + int getNumPrograms() { return 0; } + int getCurrentProgram() { return 0; } + void setCurrentProgram (int) { } + const String getProgramName (int) { return String(); } + void changeProgramName (int, const String&) { } + + void getStateInformation (juce::MemoryBlock&); + void setStateInformation (const void* data, int sizeInBytes); + +private: + //============================================================================== + ReferenceCountedArray nodes; + OwnedArray connections; + uint32 lastNodeId; + AudioSampleBuffer renderingBuffers; + OwnedArray midiBuffers; + Array renderingOps; + + friend class AudioGraphIOProcessor; + AudioSampleBuffer* currentAudioInputBuffer; + AudioSampleBuffer currentAudioOutputBuffer; + MidiBuffer* currentMidiInputBuffer; + MidiBuffer currentMidiOutputBuffer; + + void handleAsyncUpdate() override; + void clearRenderingSequence(); + void buildRenderingSequence(); + bool isAnInputTo (uint32 possibleInputId, uint32 possibleDestinationId, int recursionCheck) const; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorGraph) +}; + + +#endif // JUCE_AUDIOPROCESSORGRAPH_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h new file mode 100644 index 0000000000..d8ea93c994 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h @@ -0,0 +1,106 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPROCESSORLISTENER_H_INCLUDED +#define JUCE_AUDIOPROCESSORLISTENER_H_INCLUDED + + +//============================================================================== +/** + Base class for listeners that want to know about changes to an AudioProcessor. + + Use AudioProcessor::addListener() to register your listener with an AudioProcessor. + + @see AudioProcessor +*/ +class JUCE_API AudioProcessorListener +{ +public: + //============================================================================== + /** Destructor. */ + virtual ~AudioProcessorListener() {} + + //============================================================================== + /** Receives a callback when a parameter is changed. + + IMPORTANT NOTE: this will be called synchronously when a parameter changes, and + many audio processors will change their parameter during their audio callback. + This means that not only has your handler code got to be completely thread-safe, + but it's also got to be VERY fast, and avoid blocking. If you need to handle + this event on your message thread, use this callback to trigger an AsyncUpdater + or ChangeBroadcaster which you can respond to on the message thread. + */ + virtual void audioProcessorParameterChanged (AudioProcessor* processor, + int parameterIndex, + float newValue) = 0; + + /** Called to indicate that something else in the plugin has changed, like its + program, number of parameters, etc. + + IMPORTANT NOTE: this will be called synchronously, and many audio processors will + call it during their audio callback. This means that not only has your handler code + got to be completely thread-safe, but it's also got to be VERY fast, and avoid + blocking. If you need to handle this event on your message thread, use this callback + to trigger an AsyncUpdater or ChangeBroadcaster which you can respond to later on the + message thread. + */ + virtual void audioProcessorChanged (AudioProcessor* processor) = 0; + + /** Indicates that a parameter change gesture has started. + + E.g. if the user is dragging a slider, this would be called when they first + press the mouse button, and audioProcessorParameterChangeGestureEnd would be + called when they release it. + + IMPORTANT NOTE: this will be called synchronously, and many audio processors will + call it during their audio callback. This means that not only has your handler code + got to be completely thread-safe, but it's also got to be VERY fast, and avoid + blocking. If you need to handle this event on your message thread, use this callback + to trigger an AsyncUpdater or ChangeBroadcaster which you can respond to later on the + message thread. + + @see audioProcessorParameterChangeGestureEnd + */ + virtual void audioProcessorParameterChangeGestureBegin (AudioProcessor* processor, + int parameterIndex); + + /** Indicates that a parameter change gesture has finished. + + E.g. if the user is dragging a slider, this would be called when they release + the mouse button. + + IMPORTANT NOTE: this will be called synchronously, and many audio processors will + call it during their audio callback. This means that not only has your handler code + got to be completely thread-safe, but it's also got to be VERY fast, and avoid + blocking. If you need to handle this event on your message thread, use this callback + to trigger an AsyncUpdater or ChangeBroadcaster which you can respond to later on the + message thread. + + @see audioProcessorParameterChangeGestureBegin + */ + virtual void audioProcessorParameterChangeGestureEnd (AudioProcessor* processor, + int parameterIndex); +}; + +#endif // JUCE_AUDIOPROCESSORLISTENER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h new file mode 100644 index 0000000000..8b4d2cf32c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h @@ -0,0 +1,158 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOPROCESSORPARAMETER_H_INCLUDED +#define JUCE_AUDIOPROCESSORPARAMETER_H_INCLUDED + + +//============================================================================== +/** An abstract base class for parameter objects that can be added to an + AudioProcessor. + + @see AudioProcessor::addParameter +*/ +class JUCE_API AudioProcessorParameter +{ +public: + AudioProcessorParameter() noexcept; + + /** Destructor. */ + virtual ~AudioProcessorParameter(); + + /** Called by the host to find out the value of this parameter. + + Hosts will expect the value returned to be between 0 and 1.0. + + This could be called quite frequently, so try to make your code efficient. + It's also likely to be called by non-UI threads, so the code in here should + be thread-aware. + */ + virtual float getValue() const = 0; + + /** The host will call this method to change the value of one of the filter's parameters. + + The host may call this at any time, including during the audio processing + callback, so the filter has to process this very fast and avoid blocking. + + If you want to set the value of a parameter internally, e.g. from your + editor component, then don't call this directly - instead, use the + setValueNotifyingHost() method, which will also send a message to + the host telling it about the change. If the message isn't sent, the host + won't be able to automate your parameters properly. + + The value passed will be between 0 and 1.0. + */ + virtual void setValue (float newValue) = 0; + + /** Your filter can call this when it needs to change one of its parameters. + + This could happen when the editor or some other internal operation changes + a parameter. This method will call the setParameter() method to change the + value, and will then send a message to the host telling it about the change. + + Note that to make sure the host correctly handles automation, you should call + the beginChangeGesture() and endChangeGesture() methods to tell the host when + the user has started and stopped changing the parameter. + */ + void setValueNotifyingHost (float newValue); + + /** Sends a signal to the host to tell it that the user is about to start changing this + parameter. + This allows the host to know when a parameter is actively being held by the user, and + it may use this information to help it record automation. + If you call this, it must be matched by a later call to endChangeGesture(). + */ + void beginChangeGesture(); + + /** Tells the host that the user has finished changing this parameter. + This allows the host to know when a parameter is actively being held by the user, + and it may use this information to help it record automation. + A call to this method must follow a call to beginChangeGesture(). + */ + void endChangeGesture(); + + /** This should return the default value for this parameter. */ + virtual float getDefaultValue() const = 0; + + /** Returns the name to display for this parameter, which should be made + to fit within the given string length. + */ + virtual String getName (int maximumStringLength) const = 0; + + /** Some parameters may be able to return a label string for + their units. For example "Hz" or "%". + */ + virtual String getLabel() const = 0; + + /** Returns the number of discrete interval steps that this parameter's range + should be quantised into. + + If you want a continuous range of values, don't override this method, and allow + the default implementation to return AudioProcessor::getDefaultNumParameterSteps(). + If your parameter is boolean, then you may want to make this return 2. + The value that is returned may or may not be used, depending on the host. + */ + virtual int getNumSteps() const; + + /** Returns a textual version of the supplied parameter value. + The default implementation just returns the floating point value + as a string, but this could do anything you need for a custom type + of value. + */ + virtual String getText (float value, int /*maximumStringLength*/) const; + + /** Should parse a string and return the appropriate value for it. */ + virtual float getValueForText (const String& text) const = 0; + + /** This can be overridden to tell the host that this parameter operates in the + reverse direction. + (Not all plugin formats or hosts will actually use this information). + */ + virtual bool isOrientationInverted() const; + + /** Returns true if the host can automate this parameter. + By default, this returns true. + */ + virtual bool isAutomatable() const; + + /** Should return true if this parameter is a "meta" parameter. + A meta-parameter is a parameter that changes other params. It is used + by some hosts (e.g. AudioUnit hosts). + By default this returns false. + */ + virtual bool isMetaParameter() const; + + /** Returns the index of this parameter in its parent processor's parameter list. */ + int getParameterIndex() const noexcept { return parameterIndex; } + +private: + friend class AudioProcessor; + AudioProcessor* processor; + int parameterIndex; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameter) +}; + + +#endif // JUCE_AUDIOPROCESSORPARAMETER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp new file mode 100644 index 0000000000..c94411d7b1 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp @@ -0,0 +1,172 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +class ProcessorParameterPropertyComp : public PropertyComponent, + private AudioProcessorListener, + private Timer +{ +public: + ProcessorParameterPropertyComp (const String& name, AudioProcessor& p, int paramIndex) + : PropertyComponent (name), + owner (p), + index (paramIndex), + paramHasChanged (false), + slider (p, paramIndex) + { + startTimer (100); + addAndMakeVisible (slider); + owner.addListener (this); + } + + ~ProcessorParameterPropertyComp() + { + owner.removeListener (this); + } + + void refresh() override + { + paramHasChanged = false; + + if (slider.getThumbBeingDragged() < 0) + slider.setValue (owner.getParameter (index), dontSendNotification); + + slider.updateText(); + } + + void audioProcessorChanged (AudioProcessor*) override {} + + void audioProcessorParameterChanged (AudioProcessor*, int parameterIndex, float) override + { + if (parameterIndex == index) + paramHasChanged = true; + } + + void timerCallback() override + { + if (paramHasChanged) + { + refresh(); + startTimer (1000 / 50); + } + else + { + startTimer (jmin (1000 / 4, getTimerInterval() + 10)); + } + } + +private: + //============================================================================== + class ParamSlider : public Slider + { + public: + ParamSlider (AudioProcessor& p, int paramIndex) : owner (p), index (paramIndex) + { + const int steps = owner.getParameterNumSteps (index); + + if (steps > 1 && steps < 0x7fffffff) + setRange (0.0, 1.0, 1.0 / (steps - 1.0)); + else + setRange (0.0, 1.0); + + setSliderStyle (Slider::LinearBar); + setTextBoxIsEditable (false); + setScrollWheelEnabled (true); + } + + void valueChanged() override + { + const float newVal = (float) getValue(); + + if (owner.getParameter (index) != newVal) + { + owner.setParameterNotifyingHost (index, newVal); + updateText(); + } + } + + String getTextFromValue (double /*value*/) override + { + return owner.getParameterText (index) + " " + owner.getParameterLabel (index).trimEnd(); + } + + private: + //============================================================================== + AudioProcessor& owner; + const int index; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamSlider) + }; + + AudioProcessor& owner; + const int index; + bool volatile paramHasChanged; + ParamSlider slider; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProcessorParameterPropertyComp) +}; + + +//============================================================================== +GenericAudioProcessorEditor::GenericAudioProcessorEditor (AudioProcessor* const p) + : AudioProcessorEditor (p) +{ + jassert (p != nullptr); + setOpaque (true); + + addAndMakeVisible (panel); + + Array params; + + const int numParams = p->getNumParameters(); + int totalHeight = 0; + + for (int i = 0; i < numParams; ++i) + { + String name (p->getParameterName (i)); + if (name.trim().isEmpty()) + name = "Unnamed"; + + ProcessorParameterPropertyComp* const pc = new ProcessorParameterPropertyComp (name, *p, i); + params.add (pc); + totalHeight += pc->getPreferredHeight(); + } + + panel.addProperties (params); + + setSize (400, jlimit (25, 400, totalHeight)); +} + +GenericAudioProcessorEditor::~GenericAudioProcessorEditor() +{ +} + +void GenericAudioProcessorEditor::paint (Graphics& g) +{ + g.fillAll (Colours::white); +} + +void GenericAudioProcessorEditor::resized() +{ + panel.setBounds (getLocalBounds()); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h new file mode 100644 index 0000000000..1189f8802c --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h @@ -0,0 +1,58 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_GENERICAUDIOPROCESSOREDITOR_H_INCLUDED +#define JUCE_GENERICAUDIOPROCESSOREDITOR_H_INCLUDED + + +//============================================================================== +/** + A type of UI component that displays the parameters of an AudioProcessor as + a simple list of sliders. + + This can be used for showing an editor for a processor that doesn't supply + its own custom editor. + + @see AudioProcessor +*/ +class JUCE_API GenericAudioProcessorEditor : public AudioProcessorEditor +{ +public: + //============================================================================== + GenericAudioProcessorEditor (AudioProcessor* owner); + ~GenericAudioProcessorEditor(); + + //============================================================================== + void paint (Graphics&) override; + void resized() override; + +private: + //============================================================================== + PropertyPanel panel; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericAudioProcessorEditor) +}; + + +#endif // JUCE_GENERICAUDIOPROCESSOREDITOR_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp new file mode 100644 index 0000000000..5eafc07ced --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp @@ -0,0 +1,140 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +PluginDescription::PluginDescription() + : uid (0), + isInstrument (false), + numInputChannels (0), + numOutputChannels (0), + hasSharedContainer (false) +{ +} + +PluginDescription::~PluginDescription() +{ +} + +PluginDescription::PluginDescription (const PluginDescription& other) + : name (other.name), + descriptiveName (other.descriptiveName), + pluginFormatName (other.pluginFormatName), + category (other.category), + manufacturerName (other.manufacturerName), + version (other.version), + fileOrIdentifier (other.fileOrIdentifier), + lastFileModTime (other.lastFileModTime), + uid (other.uid), + isInstrument (other.isInstrument), + numInputChannels (other.numInputChannels), + numOutputChannels (other.numOutputChannels), + hasSharedContainer (other.hasSharedContainer) +{ +} + +PluginDescription& PluginDescription::operator= (const PluginDescription& other) +{ + name = other.name; + descriptiveName = other.descriptiveName; + pluginFormatName = other.pluginFormatName; + category = other.category; + manufacturerName = other.manufacturerName; + version = other.version; + fileOrIdentifier = other.fileOrIdentifier; + uid = other.uid; + isInstrument = other.isInstrument; + lastFileModTime = other.lastFileModTime; + numInputChannels = other.numInputChannels; + numOutputChannels = other.numOutputChannels; + hasSharedContainer = other.hasSharedContainer; + + return *this; +} + +bool PluginDescription::isDuplicateOf (const PluginDescription& other) const noexcept +{ + return fileOrIdentifier == other.fileOrIdentifier + && uid == other.uid; +} + +static String getPluginDescSuffix (const PluginDescription& d) +{ + return "-" + String::toHexString (d.fileOrIdentifier.hashCode()) + + "-" + String::toHexString (d.uid); +} + +bool PluginDescription::matchesIdentifierString (const String& identifierString) const +{ + return identifierString.endsWithIgnoreCase (getPluginDescSuffix (*this)); +} + +String PluginDescription::createIdentifierString() const +{ + return pluginFormatName + "-" + name + getPluginDescSuffix (*this); +} + +XmlElement* PluginDescription::createXml() const +{ + XmlElement* const e = new XmlElement ("PLUGIN"); + e->setAttribute ("name", name); + if (descriptiveName != name) + e->setAttribute ("descriptiveName", descriptiveName); + + e->setAttribute ("format", pluginFormatName); + e->setAttribute ("category", category); + e->setAttribute ("manufacturer", manufacturerName); + e->setAttribute ("version", version); + e->setAttribute ("file", fileOrIdentifier); + e->setAttribute ("uid", String::toHexString (uid)); + e->setAttribute ("isInstrument", isInstrument); + e->setAttribute ("fileTime", String::toHexString (lastFileModTime.toMilliseconds())); + e->setAttribute ("numInputs", numInputChannels); + e->setAttribute ("numOutputs", numOutputChannels); + e->setAttribute ("isShell", hasSharedContainer); + + return e; +} + +bool PluginDescription::loadFromXml (const XmlElement& xml) +{ + if (xml.hasTagName ("PLUGIN")) + { + name = xml.getStringAttribute ("name"); + descriptiveName = xml.getStringAttribute ("descriptiveName", name); + pluginFormatName = xml.getStringAttribute ("format"); + category = xml.getStringAttribute ("category"); + manufacturerName = xml.getStringAttribute ("manufacturer"); + version = xml.getStringAttribute ("version"); + fileOrIdentifier = xml.getStringAttribute ("file"); + uid = xml.getStringAttribute ("uid").getHexValue32(); + isInstrument = xml.getBoolAttribute ("isInstrument", false); + lastFileModTime = Time (xml.getStringAttribute ("fileTime").getHexValue64()); + numInputChannels = xml.getIntAttribute ("numInputs"); + numOutputChannels = xml.getIntAttribute ("numOutputs"); + hasSharedContainer = xml.getBoolAttribute ("isShell", false); + + return true; + } + + return false; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h new file mode 100644 index 0000000000..24b17e5bff --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h @@ -0,0 +1,151 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_PLUGINDESCRIPTION_H_INCLUDED +#define JUCE_PLUGINDESCRIPTION_H_INCLUDED + + +//============================================================================== +/** + A small class to represent some facts about a particular type of plug-in. + + This class is for storing and managing the details about a plug-in without + actually having to load an instance of it. + + A KnownPluginList contains a list of PluginDescription objects. + + @see KnownPluginList +*/ +class JUCE_API PluginDescription +{ +public: + //============================================================================== + PluginDescription(); + PluginDescription (const PluginDescription& other); + PluginDescription& operator= (const PluginDescription& other); + ~PluginDescription(); + + //============================================================================== + /** The name of the plug-in. */ + String name; + + /** A more descriptive name for the plug-in. + This may be the same as the 'name' field, but some plug-ins may provide an + alternative name. + */ + String descriptiveName; + + /** The plug-in format, e.g. "VST", "AudioUnit", etc. */ + String pluginFormatName; + + /** A category, such as "Dynamics", "Reverbs", etc. */ + String category; + + /** The manufacturer. */ + String manufacturerName; + + /** The version. This string doesn't have any particular format. */ + String version; + + /** Either the file containing the plug-in module, or some other unique way + of identifying it. + + E.g. for an AU, this would be an ID string that the component manager + could use to retrieve the plug-in. For a VST, it's the file path. + */ + String fileOrIdentifier; + + /** The last time the plug-in file was changed. + This is handy when scanning for new or changed plug-ins. + */ + Time lastFileModTime; + + /** A unique ID for the plug-in. + + Note that this might not be unique between formats, e.g. a VST and some + other format might actually have the same id. + + @see createIdentifierString + */ + int uid; + + /** True if the plug-in identifies itself as a synthesiser. */ + bool isInstrument; + + /** The number of inputs. */ + int numInputChannels; + + /** The number of outputs. */ + int numOutputChannels; + + /** True if the plug-in is part of a multi-type container, e.g. a VST Shell. */ + bool hasSharedContainer; + + /** Returns true if the two descriptions refer to the same plug-in. + + This isn't quite as simple as them just having the same file (because of + shell plug-ins). + */ + bool isDuplicateOf (const PluginDescription& other) const noexcept; + + /** Return true if this description is equivalent to another one which created the + given identifier string. + + Note that this isn't quite as simple as them just calling createIdentifierString() + and comparing the strings, because the identifers can differ (thanks to shell plug-ins). + */ + bool matchesIdentifierString (const String& identifierString) const; + + //============================================================================== + /** Returns a string that can be saved and used to uniquely identify the + plugin again. + + This contains less info than the XML encoding, and is independent of the + plug-in's file location, so can be used to store a plug-in ID for use + across different machines. + */ + String createIdentifierString() const; + + //============================================================================== + /** Creates an XML object containing these details. + + @see loadFromXml + */ + XmlElement* createXml() const; + + /** Reloads the info in this structure from an XML record that was previously + saved with createXML(). + + Returns true if the XML was a valid plug-in description. + */ + bool loadFromXml (const XmlElement& xml); + + +private: + //============================================================================== + JUCE_LEAK_DETECTOR (PluginDescription) +}; + + +#endif // JUCE_PLUGINDESCRIPTION_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp new file mode 100644 index 0000000000..081ba11a8b --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp @@ -0,0 +1,549 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +KnownPluginList::KnownPluginList() {} +KnownPluginList::~KnownPluginList() {} + +void KnownPluginList::clear() +{ + if (types.size() > 0) + { + types.clear(); + sendChangeMessage(); + } +} + +PluginDescription* KnownPluginList::getTypeForFile (const String& fileOrIdentifier) const +{ + for (int i = 0; i < types.size(); ++i) + if (types.getUnchecked(i)->fileOrIdentifier == fileOrIdentifier) + return types.getUnchecked(i); + + return nullptr; +} + +PluginDescription* KnownPluginList::getTypeForIdentifierString (const String& identifierString) const +{ + for (int i = 0; i < types.size(); ++i) + if (types.getUnchecked(i)->matchesIdentifierString (identifierString)) + return types.getUnchecked(i); + + return nullptr; +} + +bool KnownPluginList::addType (const PluginDescription& type) +{ + for (int i = types.size(); --i >= 0;) + { + if (types.getUnchecked(i)->isDuplicateOf (type)) + { + // strange - found a duplicate plugin with different info.. + jassert (types.getUnchecked(i)->name == type.name); + jassert (types.getUnchecked(i)->isInstrument == type.isInstrument); + + *types.getUnchecked(i) = type; + return false; + } + } + + types.insert (0, new PluginDescription (type)); + sendChangeMessage(); + return true; +} + +void KnownPluginList::removeType (const int index) +{ + types.remove (index); + sendChangeMessage(); +} + +bool KnownPluginList::isListingUpToDate (const String& fileOrIdentifier, + AudioPluginFormat& formatToUse) const +{ + if (getTypeForFile (fileOrIdentifier) == nullptr) + return false; + + for (int i = types.size(); --i >= 0;) + { + const PluginDescription* const d = types.getUnchecked(i); + + if (d->fileOrIdentifier == fileOrIdentifier + && formatToUse.pluginNeedsRescanning (*d)) + return false; + } + + return true; +} + +void KnownPluginList::setCustomScanner (CustomScanner* newScanner) +{ + scanner = newScanner; +} + +bool KnownPluginList::scanAndAddFile (const String& fileOrIdentifier, + const bool dontRescanIfAlreadyInList, + OwnedArray & typesFound, + AudioPluginFormat& format) +{ + const ScopedLock sl (scanLock); + + if (dontRescanIfAlreadyInList + && getTypeForFile (fileOrIdentifier) != nullptr) + { + bool needsRescanning = false; + + for (int i = types.size(); --i >= 0;) + { + const PluginDescription* const d = types.getUnchecked(i); + + if (d->fileOrIdentifier == fileOrIdentifier && d->pluginFormatName == format.getName()) + { + if (format.pluginNeedsRescanning (*d)) + needsRescanning = true; + else + typesFound.add (new PluginDescription (*d)); + } + } + + if (! needsRescanning) + return false; + } + + if (blacklist.contains (fileOrIdentifier)) + return false; + + OwnedArray found; + + { + const ScopedUnlock sl2 (scanLock); + + if (scanner != nullptr) + { + if (! scanner->findPluginTypesFor (format, found, fileOrIdentifier)) + addToBlacklist (fileOrIdentifier); + } + else + { + format.findAllTypesForFile (found, fileOrIdentifier); + } + } + + for (int i = 0; i < found.size(); ++i) + { + PluginDescription* const desc = found.getUnchecked(i); + jassert (desc != nullptr); + + addType (*desc); + typesFound.add (new PluginDescription (*desc)); + } + + return found.size() > 0; +} + +void KnownPluginList::scanAndAddDragAndDroppedFiles (AudioPluginFormatManager& formatManager, + const StringArray& files, + OwnedArray & typesFound) +{ + for (int i = 0; i < files.size(); ++i) + { + const String filenameOrID (files[i]); + bool found = false; + + for (int j = 0; j < formatManager.getNumFormats(); ++j) + { + AudioPluginFormat* const format = formatManager.getFormat (j); + + if (format->fileMightContainThisPluginType (filenameOrID) + && scanAndAddFile (filenameOrID, true, typesFound, *format)) + { + found = true; + break; + } + } + + if (! found) + { + const File f (filenameOrID); + + if (f.isDirectory()) + { + StringArray s; + + { + Array subFiles; + f.findChildFiles (subFiles, File::findFilesAndDirectories, false); + + for (int j = 0; j < subFiles.size(); ++j) + s.add (subFiles.getReference(j).getFullPathName()); + } + + scanAndAddDragAndDroppedFiles (formatManager, s, typesFound); + } + } + } + + scanFinished(); +} + +void KnownPluginList::scanFinished() +{ + if (scanner != nullptr) + scanner->scanFinished(); +} + +const StringArray& KnownPluginList::getBlacklistedFiles() const +{ + return blacklist; +} + +void KnownPluginList::addToBlacklist (const String& pluginID) +{ + if (! blacklist.contains (pluginID)) + { + blacklist.add (pluginID); + sendChangeMessage(); + } +} + +void KnownPluginList::removeFromBlacklist (const String& pluginID) +{ + const int index = blacklist.indexOf (pluginID); + + if (index >= 0) + { + blacklist.remove (index); + sendChangeMessage(); + } +} + +void KnownPluginList::clearBlacklistedFiles() +{ + if (blacklist.size() > 0) + { + blacklist.clear(); + sendChangeMessage(); + } +} + +//============================================================================== +struct PluginSorter +{ + PluginSorter (KnownPluginList::SortMethod sortMethod, bool forwards) noexcept + : method (sortMethod), direction (forwards ? 1 : -1) {} + + int compareElements (const PluginDescription* const first, + const PluginDescription* const second) const + { + int diff = 0; + + switch (method) + { + case KnownPluginList::sortByCategory: diff = first->category.compareNatural (second->category); break; + case KnownPluginList::sortByManufacturer: diff = first->manufacturerName.compareNatural (second->manufacturerName); break; + case KnownPluginList::sortByFormat: diff = first->pluginFormatName.compare (second->pluginFormatName); break; + case KnownPluginList::sortByFileSystemLocation: diff = lastPathPart (first->fileOrIdentifier).compare (lastPathPart (second->fileOrIdentifier)); break; + default: break; + } + + if (diff == 0) + diff = first->name.compareNatural (second->name); + + return diff * direction; + } + +private: + static String lastPathPart (const String& path) + { + return path.replaceCharacter ('\\', '/').upToLastOccurrenceOf ("/", false, false); + } + + const KnownPluginList::SortMethod method; + const int direction; + + JUCE_DECLARE_NON_COPYABLE (PluginSorter) +}; + +void KnownPluginList::sort (const SortMethod method, bool forwards) +{ + if (method != defaultOrder) + { + Array oldOrder, newOrder; + oldOrder.addArray (types); + + PluginSorter sorter (method, forwards); + types.sort (sorter, true); + + newOrder.addArray (types); + + if (oldOrder != newOrder) + sendChangeMessage(); + } +} + +//============================================================================== +XmlElement* KnownPluginList::createXml() const +{ + XmlElement* const e = new XmlElement ("KNOWNPLUGINS"); + + for (int i = types.size(); --i >= 0;) + e->prependChildElement (types.getUnchecked(i)->createXml()); + + for (int i = 0; i < blacklist.size(); ++i) + e->createNewChildElement ("BLACKLISTED")->setAttribute ("id", blacklist[i]); + + return e; +} + +void KnownPluginList::recreateFromXml (const XmlElement& xml) +{ + clear(); + clearBlacklistedFiles(); + + if (xml.hasTagName ("KNOWNPLUGINS")) + { + forEachXmlChildElement (xml, e) + { + PluginDescription info; + + if (e->hasTagName ("BLACKLISTED")) + blacklist.add (e->getStringAttribute ("id")); + else if (info.loadFromXml (*e)) + addType (info); + } + } +} + +//============================================================================== +struct PluginTreeUtils +{ + enum { menuIdBase = 0x324503f4 }; + + static void buildTreeByFolder (KnownPluginList::PluginTree& tree, const Array & allPlugins) + { + for (int i = 0; i < allPlugins.size(); ++i) + { + PluginDescription* const pd = allPlugins.getUnchecked (i); + + String path (pd->fileOrIdentifier.replaceCharacter ('\\', '/') + .upToLastOccurrenceOf ("/", false, false)); + + if (path.substring (1, 2) == ":") + path = path.substring (2); + + addPlugin (tree, pd, path); + } + + optimiseFolders (tree, false); + } + + static void optimiseFolders (KnownPluginList::PluginTree& tree, bool concatenateName) + { + for (int i = tree.subFolders.size(); --i >= 0;) + { + KnownPluginList::PluginTree& sub = *tree.subFolders.getUnchecked(i); + optimiseFolders (sub, concatenateName || (tree.subFolders.size() > 1)); + + if (sub.plugins.size() == 0) + { + for (int j = 0; j < sub.subFolders.size(); ++j) + { + KnownPluginList::PluginTree* const s = sub.subFolders.getUnchecked(j); + + if (concatenateName) + s->folder = sub.folder + "/" + s->folder; + + tree.subFolders.add (s); + } + + sub.subFolders.clear (false); + tree.subFolders.remove (i); + } + } + } + + static void buildTreeByCategory (KnownPluginList::PluginTree& tree, + const Array & sorted, + const KnownPluginList::SortMethod sortMethod) + { + String lastType; + ScopedPointer current (new KnownPluginList::PluginTree()); + + for (int i = 0; i < sorted.size(); ++i) + { + const PluginDescription* const pd = sorted.getUnchecked(i); + String thisType (sortMethod == KnownPluginList::sortByCategory ? pd->category + : pd->manufacturerName); + + if (! thisType.containsNonWhitespaceChars()) + thisType = "Other"; + + if (thisType != lastType) + { + if (current->plugins.size() + current->subFolders.size() > 0) + { + current->folder = lastType; + tree.subFolders.add (current.release()); + current = new KnownPluginList::PluginTree(); + } + + lastType = thisType; + } + + current->plugins.add (pd); + } + + if (current->plugins.size() + current->subFolders.size() > 0) + { + current->folder = lastType; + tree.subFolders.add (current.release()); + } + } + + static void addPlugin (KnownPluginList::PluginTree& tree, PluginDescription* const pd, String path) + { + if (path.isEmpty()) + { + tree.plugins.add (pd); + } + else + { + #if JUCE_MAC + if (path.containsChar (':')) + path = path.fromFirstOccurrenceOf (":", false, false); // avoid the special AU formatting nonsense on Mac.. + #endif + + const String firstSubFolder (path.upToFirstOccurrenceOf ("/", false, false)); + const String remainingPath (path.fromFirstOccurrenceOf ("/", false, false)); + + for (int i = tree.subFolders.size(); --i >= 0;) + { + KnownPluginList::PluginTree& subFolder = *tree.subFolders.getUnchecked(i); + + if (subFolder.folder.equalsIgnoreCase (firstSubFolder)) + { + addPlugin (subFolder, pd, remainingPath); + return; + } + } + + KnownPluginList::PluginTree* const newFolder = new KnownPluginList::PluginTree(); + newFolder->folder = firstSubFolder; + tree.subFolders.add (newFolder); + addPlugin (*newFolder, pd, remainingPath); + } + } + + static bool containsDuplicateNames (const Array& plugins, const String& name) + { + int matches = 0; + + for (int i = 0; i < plugins.size(); ++i) + if (plugins.getUnchecked(i)->name == name) + if (++matches > 1) + return true; + + return false; + } + + static void addToMenu (const KnownPluginList::PluginTree& tree, PopupMenu& m, const OwnedArray & allPlugins) + { + for (int i = 0; i < tree.subFolders.size(); ++i) + { + const KnownPluginList::PluginTree& sub = *tree.subFolders.getUnchecked(i); + + PopupMenu subMenu; + addToMenu (sub, subMenu, allPlugins); + m.addSubMenu (sub.folder, subMenu); + } + + for (int i = 0; i < tree.plugins.size(); ++i) + { + const PluginDescription* const plugin = tree.plugins.getUnchecked(i); + + String name (plugin->name); + + if (containsDuplicateNames (tree.plugins, name)) + name << " (" << plugin->pluginFormatName << ')'; + + m.addItem (allPlugins.indexOf (plugin) + menuIdBase, name, true, false); + } + } +}; + +KnownPluginList::PluginTree* KnownPluginList::createTree (const SortMethod sortMethod) const +{ + Array sorted; + + { + PluginSorter sorter (sortMethod, true); + + for (int i = 0; i < types.size(); ++i) + sorted.addSorted (sorter, types.getUnchecked(i)); + } + + PluginTree* tree = new PluginTree(); + + if (sortMethod == sortByCategory || sortMethod == sortByManufacturer || sortMethod == sortByFormat) + { + PluginTreeUtils::buildTreeByCategory (*tree, sorted, sortMethod); + } + else if (sortMethod == sortByFileSystemLocation) + { + PluginTreeUtils::buildTreeByFolder (*tree, sorted); + } + else + { + for (int i = 0; i < sorted.size(); ++i) + tree->plugins.add (sorted.getUnchecked(i)); + } + + return tree; +} + +//============================================================================== +void KnownPluginList::addToMenu (PopupMenu& menu, const SortMethod sortMethod) const +{ + ScopedPointer tree (createTree (sortMethod)); + PluginTreeUtils::addToMenu (*tree, menu, types); +} + +int KnownPluginList::getIndexChosenByMenu (const int menuResultCode) const +{ + const int i = menuResultCode - PluginTreeUtils::menuIdBase; + return isPositiveAndBelow (i, types.size()) ? i : -1; +} + +//============================================================================== +KnownPluginList::CustomScanner::CustomScanner() {} +KnownPluginList::CustomScanner::~CustomScanner() {} + +void KnownPluginList::CustomScanner::scanFinished() {} + +bool KnownPluginList::CustomScanner::shouldExit() const noexcept +{ + if (ThreadPoolJob* job = ThreadPoolJob::getCurrentThreadPoolJob()) + return job->shouldExit(); + + return false; +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h new file mode 100644 index 0000000000..3c8df25fdd --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h @@ -0,0 +1,223 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_KNOWNPLUGINLIST_H_INCLUDED +#define JUCE_KNOWNPLUGINLIST_H_INCLUDED + + +//============================================================================== +/** + Manages a list of plugin types. + + This can be easily edited, saved and loaded, and used to create instances of + the plugin types in it. + + @see PluginListComponent +*/ +class JUCE_API KnownPluginList : public ChangeBroadcaster +{ +public: + //============================================================================== + /** Creates an empty list. */ + KnownPluginList(); + + /** Destructor. */ + ~KnownPluginList(); + + //============================================================================== + /** Clears the list. */ + void clear(); + + /** Returns the number of types currently in the list. + @see getType + */ + int getNumTypes() const noexcept { return types.size(); } + + /** Returns one of the types. + @see getNumTypes + */ + PluginDescription* getType (int index) const noexcept { return types [index]; } + + /** Type iteration. */ + PluginDescription** begin() const noexcept { return types.begin(); } + /** Type iteration. */ + PluginDescription** end() const noexcept { return types.end(); } + + /** Looks for a type in the list which comes from this file. */ + PluginDescription* getTypeForFile (const String& fileOrIdentifier) const; + + /** Looks for a type in the list which matches a plugin type ID. + + The identifierString parameter must have been created by + PluginDescription::createIdentifierString(). + */ + PluginDescription* getTypeForIdentifierString (const String& identifierString) const; + + /** Adds a type manually from its description. */ + bool addType (const PluginDescription& type); + + /** Removes a type. */ + void removeType (int index); + + /** Looks for all types that can be loaded from a given file, and adds them + to the list. + + If dontRescanIfAlreadyInList is true, then the file will only be loaded and + re-tested if it's not already in the list, or if the file's modification + time has changed since the list was created. If dontRescanIfAlreadyInList is + false, the file will always be reloaded and tested. + + Returns true if any new types were added, and all the types found in this + file (even if it was already known and hasn't been re-scanned) get returned + in the array. + */ + bool scanAndAddFile (const String& possiblePluginFileOrIdentifier, + bool dontRescanIfAlreadyInList, + OwnedArray & typesFound, + AudioPluginFormat& formatToUse); + + /** Tells a custom scanner that a scan has finished, and it can release any resources. */ + void scanFinished(); + + /** Returns true if the specified file is already known about and if it + hasn't been modified since our entry was created. + */ + bool isListingUpToDate (const String& possiblePluginFileOrIdentifier, + AudioPluginFormat& formatToUse) const; + + /** Scans and adds a bunch of files that might have been dragged-and-dropped. + If any types are found in the files, their descriptions are returned in the array. + */ + void scanAndAddDragAndDroppedFiles (AudioPluginFormatManager& formatManager, + const StringArray& filenames, + OwnedArray & typesFound); + + //============================================================================== + /** Returns the list of blacklisted files. */ + const StringArray& getBlacklistedFiles() const; + + /** Adds a plugin ID to the black-list. */ + void addToBlacklist (const String& pluginID); + + /** Removes a plugin ID from the black-list. */ + void removeFromBlacklist (const String& pluginID); + + /** Clears all the blacklisted files. */ + void clearBlacklistedFiles(); + + //============================================================================== + /** Sort methods used to change the order of the plugins in the list. + */ + enum SortMethod + { + defaultOrder = 0, + sortAlphabetically, + sortByCategory, + sortByManufacturer, + sortByFormat, + sortByFileSystemLocation + }; + + //============================================================================== + /** Adds all the plugin types to a popup menu so that the user can select one. + + Depending on the sort method, it may add sub-menus for categories, + manufacturers, etc. + + Use getIndexChosenByMenu() to find out the type that was chosen. + */ + void addToMenu (PopupMenu& menu, SortMethod sortMethod) const; + + /** Converts a menu item index that has been chosen into its index in this list. + Returns -1 if it's not an ID that was used. + @see addToMenu + */ + int getIndexChosenByMenu (int menuResultCode) const; + + //============================================================================== + /** Sorts the list. */ + void sort (SortMethod method, bool forwards); + + //============================================================================== + /** Creates some XML that can be used to store the state of this list. */ + XmlElement* createXml() const; + + /** Recreates the state of this list from its stored XML format. */ + void recreateFromXml (const XmlElement& xml); + + //============================================================================== + /** A structure that recursively holds a tree of plugins. + @see KnownPluginList::createTree() + */ + struct PluginTree + { + String folder; /**< The name of this folder in the tree */ + OwnedArray subFolders; + Array plugins; + }; + + /** Creates a PluginTree object containing all the known plugins. */ + PluginTree* createTree (const SortMethod sortMethod) const; + + //============================================================================== + class CustomScanner + { + public: + CustomScanner(); + virtual ~CustomScanner(); + + /** Attempts to load the given file and find a list of plugins in it. + @returns true if the plugin loaded, false if it crashed + */ + virtual bool findPluginTypesFor (AudioPluginFormat& format, + OwnedArray & result, + const String& fileOrIdentifier) = 0; + + /** Called when a scan has finished, to allow clean-up of resources. */ + virtual void scanFinished(); + + /** Returns true if the current scan should be abandoned. + Any blocking methods should check this value repeatedly and return if + if becomes true. + */ + bool shouldExit() const noexcept; + }; + + /** Supplies a custom scanner to be used in future scans. + The KnownPluginList will take ownership of the object passed in. + */ + void setCustomScanner (CustomScanner*); + +private: + //============================================================================== + OwnedArray types; + StringArray blacklist; + ScopedPointer scanner; + CriticalSection scanLock; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KnownPluginList) +}; + + +#endif // JUCE_KNOWNPLUGINLIST_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp new file mode 100644 index 0000000000..a7beea7339 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp @@ -0,0 +1,136 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +static StringArray readDeadMansPedalFile (const File& file) +{ + StringArray lines; + file.readLines (lines); + lines.removeEmptyStrings(); + return lines; +} + +PluginDirectoryScanner::PluginDirectoryScanner (KnownPluginList& listToAddTo, + AudioPluginFormat& formatToLookFor, + FileSearchPath directoriesToSearch, + const bool recursive, + const File& deadMansPedal) + : list (listToAddTo), + format (formatToLookFor), + deadMansPedalFile (deadMansPedal), + progress (0) +{ + directoriesToSearch.removeRedundantPaths(); + + filesOrIdentifiersToScan = format.searchPathsForPlugins (directoriesToSearch, recursive); + + // If any plugins have crashed recently when being loaded, move them to the + // end of the list to give the others a chance to load correctly.. + const StringArray crashedPlugins (readDeadMansPedalFile (deadMansPedalFile)); + + for (int i = 0; i < crashedPlugins.size(); ++i) + { + const String f = crashedPlugins[i]; + + for (int j = filesOrIdentifiersToScan.size(); --j >= 0;) + if (f == filesOrIdentifiersToScan[j]) + filesOrIdentifiersToScan.move (j, -1); + } + + applyBlacklistingsFromDeadMansPedal (listToAddTo, deadMansPedalFile); + nextIndex.set (filesOrIdentifiersToScan.size()); +} + +PluginDirectoryScanner::~PluginDirectoryScanner() +{ + list.scanFinished(); +} + +//============================================================================== +String PluginDirectoryScanner::getNextPluginFileThatWillBeScanned() const +{ + return format.getNameOfPluginFromIdentifier (filesOrIdentifiersToScan [nextIndex.get() - 1]); +} + +void PluginDirectoryScanner::updateProgress() +{ + progress = (1.0f - nextIndex.get() / (float) filesOrIdentifiersToScan.size()); +} + +bool PluginDirectoryScanner::scanNextFile (const bool dontRescanIfAlreadyInList, + String& nameOfPluginBeingScanned) +{ + const int index = --nextIndex; + + if (index >= 0) + { + const String file (filesOrIdentifiersToScan [index]); + + if (file.isNotEmpty() && ! list.isListingUpToDate (file, format)) + { + nameOfPluginBeingScanned = format.getNameOfPluginFromIdentifier (file); + + OwnedArray typesFound; + + // Add this plugin to the end of the dead-man's pedal list in case it crashes... + StringArray crashedPlugins (readDeadMansPedalFile (deadMansPedalFile)); + crashedPlugins.removeString (file); + crashedPlugins.add (file); + setDeadMansPedalFile (crashedPlugins); + + list.scanAndAddFile (file, dontRescanIfAlreadyInList, typesFound, format); + + // Managed to load without crashing, so remove it from the dead-man's-pedal.. + crashedPlugins.removeString (file); + setDeadMansPedalFile (crashedPlugins); + + if (typesFound.size() == 0 && ! list.getBlacklistedFiles().contains (file)) + failedFiles.add (file); + } + } + + updateProgress(); + return index > 0; +} + +bool PluginDirectoryScanner::skipNextFile() +{ + updateProgress(); + return --nextIndex > 0; +} + +void PluginDirectoryScanner::setDeadMansPedalFile (const StringArray& newContents) +{ + if (deadMansPedalFile.getFullPathName().isNotEmpty()) + deadMansPedalFile.replaceWithText (newContents.joinIntoString ("\n"), true, true); +} + +void PluginDirectoryScanner::applyBlacklistingsFromDeadMansPedal (KnownPluginList& list, const File& file) +{ + // If any plugins have crashed recently when being loaded, move them to the + // end of the list to give the others a chance to load correctly.. + const StringArray crashedPlugins (readDeadMansPedalFile (file)); + + for (int i = 0; i < crashedPlugins.size(); ++i) + list.addToBlacklist (crashedPlugins[i]); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h new file mode 100644 index 0000000000..762e742593 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h @@ -0,0 +1,127 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_PLUGINDIRECTORYSCANNER_H_INCLUDED +#define JUCE_PLUGINDIRECTORYSCANNER_H_INCLUDED + + +//============================================================================== +/** + Scans a directory for plugins, and adds them to a KnownPluginList. + + To use one of these, create it and call scanNextFile() repeatedly, until + it returns false. +*/ +class JUCE_API PluginDirectoryScanner +{ +public: + //============================================================================== + /** + Creates a scanner. + + @param listToAddResultsTo this will get the new types added to it. + @param formatToLookFor this is the type of format that you want to look for + @param directoriesToSearch the path to search + @param searchRecursively true to search recursively + @param deadMansPedalFile if this isn't File::nonexistent, then it will + be used as a file to store the names of any plugins + that crash during initialisation. If there are + any plugins listed in it, then these will always + be scanned after all other possible files have + been tried - in this way, even if there's a few + dodgy plugins in your path, then a couple of rescans + will still manage to find all the proper plugins. + It's probably best to choose a file in the user's + application data directory (alongside your app's + settings file) for this. The file format it uses + is just a list of filenames of the modules that + failed. + */ + PluginDirectoryScanner (KnownPluginList& listToAddResultsTo, + AudioPluginFormat& formatToLookFor, + FileSearchPath directoriesToSearch, + bool searchRecursively, + const File& deadMansPedalFile); + + /** Destructor. */ + ~PluginDirectoryScanner(); + + //============================================================================== + /** Tries the next likely-looking file. + + If dontRescanIfAlreadyInList is true, then the file will only be loaded and + re-tested if it's not already in the list, or if the file's modification + time has changed since the list was created. If dontRescanIfAlreadyInList is + false, the file will always be reloaded and tested. + The nameOfPluginBeingScanned will be updated to the name of the plugin being + scanned before the scan starts. + + Returns false when there are no more files to try. + */ + bool scanNextFile (bool dontRescanIfAlreadyInList, + String& nameOfPluginBeingScanned); + + /** Skips over the next file without scanning it. + Returns false when there are no more files to try. + */ + bool skipNextFile(); + + /** Returns the description of the plugin that will be scanned during the next + call to scanNextFile(). + + This is handy if you want to show the user which file is currently getting + scanned. + */ + String getNextPluginFileThatWillBeScanned() const; + + /** Returns the estimated progress, between 0 and 1. */ + float getProgress() const { return progress; } + + /** This returns a list of all the filenames of things that looked like being + a plugin file, but which failed to open for some reason. + */ + const StringArray& getFailedFiles() const noexcept { return failedFiles; } + + /** Reads the given dead-mans-pedal file and applies its contents to the list. */ + static void applyBlacklistingsFromDeadMansPedal (KnownPluginList& listToApplyTo, + const File& deadMansPedalFile); + +private: + //============================================================================== + KnownPluginList& list; + AudioPluginFormat& format; + StringArray filesOrIdentifiersToScan; + File deadMansPedalFile; + StringArray failedFiles; + Atomic nextIndex; + float progress; + + void updateProgress(); + void setDeadMansPedalFile (const StringArray& newContents); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginDirectoryScanner) +}; + + +#endif // JUCE_PLUGINDIRECTORYSCANNER_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp new file mode 100644 index 0000000000..a0c2388cfa --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp @@ -0,0 +1,554 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +class PluginListComponent::TableModel : public TableListBoxModel +{ +public: + TableModel (PluginListComponent& c, KnownPluginList& l) : owner (c), list (l) {} + + int getNumRows() override + { + return list.getNumTypes() + list.getBlacklistedFiles().size(); + } + + void paintRowBackground (Graphics& g, int /*rowNumber*/, int /*width*/, int /*height*/, bool rowIsSelected) override + { + if (rowIsSelected) + g.fillAll (owner.findColour (TextEditor::highlightColourId)); + } + + enum + { + nameCol = 1, + typeCol = 2, + categoryCol = 3, + manufacturerCol = 4, + descCol = 5 + }; + + void paintCell (Graphics& g, int row, int columnId, int width, int height, bool /*rowIsSelected*/) override + { + String text; + bool isBlacklisted = row >= list.getNumTypes(); + + if (isBlacklisted) + { + if (columnId == nameCol) + text = list.getBlacklistedFiles() [row - list.getNumTypes()]; + else if (columnId == descCol) + text = TRANS("Deactivated after failing to initialise correctly"); + } + else if (const PluginDescription* const desc = list.getType (row)) + { + switch (columnId) + { + case nameCol: text = desc->name; break; + case typeCol: text = desc->pluginFormatName; break; + case categoryCol: text = desc->category.isNotEmpty() ? desc->category : "-"; break; + case manufacturerCol: text = desc->manufacturerName; break; + case descCol: text = getPluginDescription (*desc); break; + + default: jassertfalse; break; + } + } + + if (text.isNotEmpty()) + { + g.setColour (isBlacklisted ? Colours::red + : columnId == nameCol ? Colours::black + : Colours::grey); + g.setFont (Font (height * 0.7f, Font::bold)); + g.drawFittedText (text, 4, 0, width - 6, height, Justification::centredLeft, 1, 0.9f); + } + } + + void deleteKeyPressed (int) override + { + owner.removeSelected(); + } + + void sortOrderChanged (int newSortColumnId, bool isForwards) override + { + switch (newSortColumnId) + { + case nameCol: list.sort (KnownPluginList::sortAlphabetically, isForwards); break; + case typeCol: list.sort (KnownPluginList::sortByFormat, isForwards); break; + case categoryCol: list.sort (KnownPluginList::sortByCategory, isForwards); break; + case manufacturerCol: list.sort (KnownPluginList::sortByManufacturer, isForwards); break; + case descCol: break; + + default: jassertfalse; break; + } + } + + static void removePluginItem (KnownPluginList& list, int index) + { + if (index < list.getNumTypes()) + list.removeType (index); + else + list.removeFromBlacklist (list.getBlacklistedFiles() [index - list.getNumTypes()]); + } + + static String getPluginDescription (const PluginDescription& desc) + { + StringArray items; + + if (desc.descriptiveName != desc.name) + items.add (desc.descriptiveName); + + items.add (desc.version); + + items.removeEmptyStrings(); + return items.joinIntoString (" - "); + } + + PluginListComponent& owner; + KnownPluginList& list; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableModel) +}; + +//============================================================================== +PluginListComponent::PluginListComponent (AudioPluginFormatManager& manager, KnownPluginList& listToEdit, + const File& deadMansPedal, PropertiesFile* const props) + : formatManager (manager), + list (listToEdit), + deadMansPedalFile (deadMansPedal), + optionsButton ("Options..."), + propertiesToUse (props), + numThreads (0) +{ + tableModel = new TableModel (*this, listToEdit); + + TableHeaderComponent& header = table.getHeader(); + + header.addColumn (TRANS("Name"), TableModel::nameCol, 200, 100, 700, TableHeaderComponent::defaultFlags | TableHeaderComponent::sortedForwards); + header.addColumn (TRANS("Format"), TableModel::typeCol, 80, 80, 80, TableHeaderComponent::notResizable); + header.addColumn (TRANS("Category"), TableModel::categoryCol, 100, 100, 200); + header.addColumn (TRANS("Manufacturer"), TableModel::manufacturerCol, 200, 100, 300); + header.addColumn (TRANS("Description"), TableModel::descCol, 300, 100, 500, TableHeaderComponent::notSortable); + + table.setHeaderHeight (22); + table.setRowHeight (20); + table.setModel (tableModel); + table.setMultipleSelectionEnabled (true); + addAndMakeVisible (table); + + addAndMakeVisible (optionsButton); + optionsButton.addListener (this); + optionsButton.setTriggeredOnMouseDown (true); + + setSize (400, 600); + list.addChangeListener (this); + updateList(); + table.getHeader().reSortTable(); + + PluginDirectoryScanner::applyBlacklistingsFromDeadMansPedal (list, deadMansPedalFile); + deadMansPedalFile.deleteFile(); +} + +PluginListComponent::~PluginListComponent() +{ + list.removeChangeListener (this); +} + +void PluginListComponent::setOptionsButtonText (const String& newText) +{ + optionsButton.setButtonText (newText); + resized(); +} + +void PluginListComponent::setNumberOfThreadsForScanning (int num) +{ + numThreads = num; +} + +void PluginListComponent::resized() +{ + Rectangle r (getLocalBounds().reduced (2)); + + optionsButton.setBounds (r.removeFromBottom (24)); + optionsButton.changeWidthToFitText (24); + + r.removeFromBottom (3); + table.setBounds (r); +} + +void PluginListComponent::changeListenerCallback (ChangeBroadcaster*) +{ + table.getHeader().reSortTable(); + updateList(); +} + +void PluginListComponent::updateList() +{ + table.updateContent(); + table.repaint(); +} + +void PluginListComponent::removeSelected() +{ + const SparseSet selected (table.getSelectedRows()); + + for (int i = table.getNumRows(); --i >= 0;) + if (selected.contains (i)) + TableModel::removePluginItem (list, i); +} + +bool PluginListComponent::canShowSelectedFolder() const +{ + if (const PluginDescription* const desc = list.getType (table.getSelectedRow())) + return File::createFileWithoutCheckingPath (desc->fileOrIdentifier).exists(); + + return false; +} + +void PluginListComponent::showSelectedFolder() +{ + if (canShowSelectedFolder()) + if (const PluginDescription* const desc = list.getType (table.getSelectedRow())) + File (desc->fileOrIdentifier).getParentDirectory().startAsProcess(); +} + +void PluginListComponent::removeMissingPlugins() +{ + for (int i = list.getNumTypes(); --i >= 0;) + if (! formatManager.doesPluginStillExist (*list.getType (i))) + list.removeType (i); +} + +void PluginListComponent::optionsMenuStaticCallback (int result, PluginListComponent* pluginList) +{ + if (pluginList != nullptr) + pluginList->optionsMenuCallback (result); +} + +void PluginListComponent::optionsMenuCallback (int result) +{ + switch (result) + { + case 0: break; + case 1: list.clear(); break; + case 2: removeSelected(); break; + case 3: showSelectedFolder(); break; + case 4: removeMissingPlugins(); break; + + default: + if (AudioPluginFormat* format = formatManager.getFormat (result - 10)) + scanFor (*format); + + break; + } +} + +void PluginListComponent::buttonClicked (Button* button) +{ + if (button == &optionsButton) + { + PopupMenu menu; + menu.addItem (1, TRANS("Clear list")); + menu.addItem (2, TRANS("Remove selected plug-in from list"), table.getNumSelectedRows() > 0); + menu.addItem (3, TRANS("Show folder containing selected plug-in"), canShowSelectedFolder()); + menu.addItem (4, TRANS("Remove any plug-ins whose files no longer exist")); + menu.addSeparator(); + + for (int i = 0; i < formatManager.getNumFormats(); ++i) + { + AudioPluginFormat* const format = formatManager.getFormat (i); + + if (format->canScanForPlugins()) + menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plug-ins"); + } + + menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&optionsButton), + ModalCallbackFunction::forComponent (optionsMenuStaticCallback, this)); + } +} + +bool PluginListComponent::isInterestedInFileDrag (const StringArray& /*files*/) +{ + return true; +} + +void PluginListComponent::filesDropped (const StringArray& files, int, int) +{ + OwnedArray typesFound; + list.scanAndAddDragAndDroppedFiles (formatManager, files, typesFound); +} + +FileSearchPath PluginListComponent::getLastSearchPath (PropertiesFile& properties, AudioPluginFormat& format) +{ + return FileSearchPath (properties.getValue ("lastPluginScanPath_" + format.getName(), + format.getDefaultLocationsToSearch().toString())); +} + +void PluginListComponent::setLastSearchPath (PropertiesFile& properties, AudioPluginFormat& format, + const FileSearchPath& newPath) +{ + properties.setValue ("lastPluginScanPath_" + format.getName(), newPath.toString()); +} + +//============================================================================== +class PluginListComponent::Scanner : private Timer +{ +public: + Scanner (PluginListComponent& plc, AudioPluginFormat& format, PropertiesFile* properties, int threads) + : owner (plc), formatToScan (format), propertiesToUse (properties), + pathChooserWindow (TRANS("Select folders to scan..."), String::empty, AlertWindow::NoIcon), + progressWindow (TRANS("Scanning for plug-ins..."), + TRANS("Searching for all possible plug-in files..."), AlertWindow::NoIcon), + progress (0.0), numThreads (threads), finished (false) + { + FileSearchPath path (formatToScan.getDefaultLocationsToSearch()); + + if (path.getNumPaths() > 0) // if the path is empty, then paths aren't used for this format. + { + if (propertiesToUse != nullptr) + path = getLastSearchPath (*propertiesToUse, formatToScan); + + pathList.setSize (500, 300); + pathList.setPath (path); + + pathChooserWindow.addCustomComponent (&pathList); + pathChooserWindow.addButton (TRANS("Scan"), 1, KeyPress (KeyPress::returnKey)); + pathChooserWindow.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); + + pathChooserWindow.enterModalState (true, + ModalCallbackFunction::forComponent (startScanCallback, + &pathChooserWindow, this), + false); + } + else + { + startScan(); + } + } + + ~Scanner() + { + if (pool != nullptr) + { + pool->removeAllJobs (true, 60000); + pool = nullptr; + } + } + +private: + PluginListComponent& owner; + AudioPluginFormat& formatToScan; + PropertiesFile* propertiesToUse; + ScopedPointer scanner; + AlertWindow pathChooserWindow, progressWindow; + FileSearchPathListComponent pathList; + String pluginBeingScanned; + double progress; + int numThreads; + bool finished; + ScopedPointer pool; + + static void startScanCallback (int result, AlertWindow* alert, Scanner* scanner) + { + if (alert != nullptr && scanner != nullptr) + { + if (result != 0) + scanner->warnUserAboutStupidPaths(); + else + scanner->finishedScan(); + } + } + + // Try to dissuade people from to scanning their entire C: drive, or other system folders. + void warnUserAboutStupidPaths() + { + for (int i = 0; i < pathList.getPath().getNumPaths(); ++i) + { + const File f (pathList.getPath()[i]); + + if (isStupidPath (f)) + { + AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, + TRANS("Plugin Scanning"), + TRANS("If you choose to scan folders that contain non-plugin files, " + "then scanning may take a long time, and can cause crashes when " + "attempting to load unsuitable files.") + + newLine + + TRANS ("Are you sure you want to scan the folder \"XYZ\"?") + .replace ("XYZ", f.getFullPathName()), + TRANS ("Scan"), + String::empty, + nullptr, + ModalCallbackFunction::create (warnAboutStupidPathsCallback, this)); + return; + } + } + + startScan(); + } + + static bool isStupidPath (const File& f) + { + Array roots; + File::findFileSystemRoots (roots); + + if (roots.contains (f)) + return true; + + File::SpecialLocationType pathsThatWouldBeStupidToScan[] + = { File::globalApplicationsDirectory, + File::userHomeDirectory, + File::userDocumentsDirectory, + File::userDesktopDirectory, + File::tempDirectory, + File::userMusicDirectory, + File::userMoviesDirectory, + File::userPicturesDirectory }; + + for (int i = 0; i < numElementsInArray (pathsThatWouldBeStupidToScan); ++i) + { + const File sillyFolder (File::getSpecialLocation (pathsThatWouldBeStupidToScan[i])); + + if (f == sillyFolder || sillyFolder.isAChildOf (f)) + return true; + } + + return false; + } + + static void warnAboutStupidPathsCallback (int result, Scanner* scanner) + { + if (result != 0) + scanner->startScan(); + else + scanner->finishedScan(); + } + + void startScan() + { + pathChooserWindow.setVisible (false); + + scanner = new PluginDirectoryScanner (owner.list, formatToScan, pathList.getPath(), + true, owner.deadMansPedalFile); + + if (propertiesToUse != nullptr) + { + setLastSearchPath (*propertiesToUse, formatToScan, pathList.getPath()); + propertiesToUse->saveIfNeeded(); + } + + progressWindow.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); + progressWindow.addProgressBarComponent (progress); + progressWindow.enterModalState(); + + if (numThreads > 0) + { + pool = new ThreadPool (numThreads); + + for (int i = numThreads; --i >= 0;) + pool->addJob (new ScanJob (*this), true); + } + + startTimer (20); + } + + void finishedScan() + { + owner.scanFinished (scanner != nullptr ? scanner->getFailedFiles() + : StringArray()); + } + + void timerCallback() override + { + if (pool == nullptr) + { + if (doNextScan()) + startTimer (20); + } + + if (! progressWindow.isCurrentlyModal()) + finished = true; + + if (finished) + finishedScan(); + else + progressWindow.setMessage (TRANS("Testing") + ":\n\n" + pluginBeingScanned); + } + + bool doNextScan() + { + if (scanner->scanNextFile (true, pluginBeingScanned)) + { + progress = scanner->getProgress(); + return true; + } + + finished = true; + return false; + } + + struct ScanJob : public ThreadPoolJob + { + ScanJob (Scanner& s) : ThreadPoolJob ("pluginscan"), scanner (s) {} + + JobStatus runJob() + { + while (scanner.doNextScan() && ! shouldExit()) + {} + + return jobHasFinished; + } + + Scanner& scanner; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScanJob) + }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Scanner) +}; + +void PluginListComponent::scanFor (AudioPluginFormat& format) +{ + currentScanner = new Scanner (*this, format, propertiesToUse, numThreads); +} + +bool PluginListComponent::isScanning() const noexcept +{ + return currentScanner != nullptr; +} + +void PluginListComponent::scanFinished (const StringArray& failedFiles) +{ + StringArray shortNames; + + for (int i = 0; i < failedFiles.size(); ++i) + shortNames.add (File::createFileWithoutCheckingPath (failedFiles[i]).getFileName()); + + currentScanner = nullptr; // mustn't delete this before using the failed files array + + if (shortNames.size() > 0) + AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, + TRANS("Scan complete"), + TRANS("Note that the following files appeared to be plugin files, but failed to load correctly") + + ":\n\n" + + shortNames.joinIntoString (", ")); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h new file mode 100644 index 0000000000..97751a8022 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h @@ -0,0 +1,114 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_PLUGINLISTCOMPONENT_H_INCLUDED +#define JUCE_PLUGINLISTCOMPONENT_H_INCLUDED + + +//============================================================================== +/** + A component displaying a list of plugins, with options to scan for them, + add, remove and sort them. +*/ +class JUCE_API PluginListComponent : public Component, + public FileDragAndDropTarget, + private ChangeListener, + private ButtonListener // (can't use Button::Listener due to idiotic VC2005 bug) +{ +public: + //============================================================================== + /** + Creates the list component. + + For info about the deadMansPedalFile, see the PluginDirectoryScanner constructor. + The properties file, if supplied, is used to store the user's last search paths. + */ + PluginListComponent (AudioPluginFormatManager& formatManager, + KnownPluginList& listToRepresent, + const File& deadMansPedalFile, + PropertiesFile* propertiesToUse); + + /** Destructor. */ + ~PluginListComponent(); + + /** Changes the text in the panel's options button. */ + void setOptionsButtonText (const String& newText); + + /** Sets how many threads to simultaneously scan for plugins. + If this is 0, then all scanning happens on the message thread (this is the default) + */ + void setNumberOfThreadsForScanning (int numThreads); + + /** Returns the last search path stored in a given properties file for the specified format. */ + static FileSearchPath getLastSearchPath (PropertiesFile&, AudioPluginFormat&); + + /** Stores a search path in a properties file for the given format. */ + static void setLastSearchPath (PropertiesFile&, AudioPluginFormat&, const FileSearchPath&); + + /** Triggers an asynchronous scan for the given format. */ + void scanFor (AudioPluginFormat&); + + /** Returns true if there's currently a scan in progress. */ + bool isScanning() const noexcept; + +private: + //============================================================================== + AudioPluginFormatManager& formatManager; + KnownPluginList& list; + File deadMansPedalFile; + TableListBox table; + TextButton optionsButton; + PropertiesFile* propertiesToUse; + int numThreads; + + class TableModel; + friend class TableModel; + friend struct ContainerDeletePolicy; + ScopedPointer tableModel; + + class Scanner; + friend class Scanner; + friend struct ContainerDeletePolicy; + ScopedPointer currentScanner; + + void scanFinished (const StringArray&); + static void optionsMenuStaticCallback (int, PluginListComponent*); + void optionsMenuCallback (int); + void updateList(); + void showSelectedFolder(); + bool canShowSelectedFolder() const; + void removeSelected(); + void removeMissingPlugins(); + + void resized() override; + bool isInterestedInFileDrag (const StringArray&) override; + void filesDropped (const StringArray&, int, int) override; + void buttonClicked (Button*) override; + void changeListenerCallback (ChangeBroadcaster*) override; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginListComponent) +}; + + +#endif // JUCE_PLUGINLISTCOMPONENT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp new file mode 100644 index 0000000000..d70a11874f --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp @@ -0,0 +1,50 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +AudioAppComponent::AudioAppComponent() +{ +} + +AudioAppComponent::~AudioAppComponent() +{ + // If you hit this then your derived class must call shutdown audio in + // destructor! + jassert (audioSourcePlayer.getCurrentSource() == nullptr); +} + +void AudioAppComponent::setAudioChannels (int numInputChannels, int numOutputChannels) +{ + String audioError = deviceManager.initialise (numInputChannels, numOutputChannels, nullptr, true); + jassert (audioError.isEmpty()); + + deviceManager.addAudioCallback (&audioSourcePlayer); + audioSourcePlayer.setSource (this); +} + +void AudioAppComponent::shutdownAudio() +{ + audioSourcePlayer.setSource (nullptr); + deviceManager.removeAudioCallback (&audioSourcePlayer); + deviceManager.closeAudioDevice(); +} diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h new file mode 100644 index 0000000000..cf0b4280d0 --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h @@ -0,0 +1,117 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +#ifndef JUCE_AUDIOAPPCOMPONENT_H_INCLUDED +#define JUCE_AUDIOAPPCOMPONENT_H_INCLUDED + + +//============================================================================== +/** + A base class for writing audio apps that stream from the audio i/o devices. + + A subclass can inherit from this and implement just a few methods such as + renderAudio(). The base class provides a basic AudioDeviceManager object + and runs audio through the +*/ +class AudioAppComponent : public Component, + public AudioSource +{ +public: + AudioAppComponent(); + ~AudioAppComponent(); + + /** A subclass should call this from their constructor, to set up the audio. */ + void setAudioChannels (int numInputChannels, int numOutputChannels); + + /** Tells the source to prepare for playing. + + An AudioSource has two states: prepared and unprepared. + + The prepareToPlay() method is guaranteed to be called at least once on an 'unpreprared' + source to put it into a 'prepared' state before any calls will be made to getNextAudioBlock(). + This callback allows the source to initialise any resources it might need when playing. + + Once playback has finished, the releaseResources() method is called to put the stream + back into an 'unprepared' state. + + Note that this method could be called more than once in succession without + a matching call to releaseResources(), so make sure your code is robust and + can handle that kind of situation. + + @param samplesPerBlockExpected the number of samples that the source + will be expected to supply each time its + getNextAudioBlock() method is called. This + number may vary slightly, because it will be dependent + on audio hardware callbacks, and these aren't + guaranteed to always use a constant block size, so + the source should be able to cope with small variations. + @param sampleRate the sample rate that the output will be used at - this + is needed by sources such as tone generators. + @see releaseResources, getNextAudioBlock + */ + virtual void prepareToPlay (int samplesPerBlockExpected, + double sampleRate) = 0; + + /** Allows the source to release anything it no longer needs after playback has stopped. + + This will be called when the source is no longer going to have its getNextAudioBlock() + method called, so it should release any spare memory, etc. that it might have + allocated during the prepareToPlay() call. + + Note that there's no guarantee that prepareToPlay() will actually have been called before + releaseResources(), and it may be called more than once in succession, so make sure your + code is robust and doesn't make any assumptions about when it will be called. + + @see prepareToPlay, getNextAudioBlock + */ + virtual void releaseResources() = 0; + + /** Called repeatedly to fetch subsequent blocks of audio data. + + After calling the prepareToPlay() method, this callback will be made each + time the audio playback hardware (or whatever other destination the audio + data is going to) needs another block of data. + + It will generally be called on a high-priority system thread, or possibly even + an interrupt, so be careful not to do too much work here, as that will cause + audio glitches! + + @see AudioSourceChannelInfo, prepareToPlay, releaseResources + */ + virtual void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) = 0; + + void shutdownAudio(); + + + AudioDeviceManager deviceManager; + +private: + //============================================================================== + AudioSourcePlayer audioSourcePlayer; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioAppComponent) +}; + + +#endif // JUCE_AUDIOAPPCOMPONENT_H_INCLUDED diff --git a/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp new file mode 100644 index 0000000000..fd437f382e --- /dev/null +++ b/Examples/AudioAppExample/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp @@ -0,0 +1,1161 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +class SimpleDeviceManagerInputLevelMeter : public Component, + public Timer +{ +public: + SimpleDeviceManagerInputLevelMeter (AudioDeviceManager& m) + : manager (m), level (0) + { + startTimer (50); + manager.enableInputLevelMeasurement (true); + } + + ~SimpleDeviceManagerInputLevelMeter() + { + manager.enableInputLevelMeasurement (false); + } + + void timerCallback() override + { + if (isShowing()) + { + const float newLevel = (float) manager.getCurrentInputLevel(); + + if (std::abs (level - newLevel) > 0.005f) + { + level = newLevel; + repaint(); + } + } + else + { + level = 0; + } + } + + void paint (Graphics& g) override + { + getLookAndFeel().drawLevelMeter (g, getWidth(), getHeight(), + (float) exp (log (level) / 3.0)); // (add a bit of a skew to make the level more obvious) + } + +private: + AudioDeviceManager& manager; + float level; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleDeviceManagerInputLevelMeter) +}; + + +//============================================================================== +class AudioDeviceSelectorComponent::MidiInputSelectorComponentListBox : public ListBox, + private ListBoxModel +{ +public: + MidiInputSelectorComponentListBox (AudioDeviceManager& dm, const String& noItems) + : ListBox (String::empty, nullptr), + deviceManager (dm), + noItemsMessage (noItems) + { + items = MidiInput::getDevices(); + + setModel (this); + setOutlineThickness (1); + } + + int getNumRows() override + { + return items.size(); + } + + void paintListBoxItem (int row, Graphics& g, int width, int height, bool rowIsSelected) override + { + if (isPositiveAndBelow (row, items.size())) + { + if (rowIsSelected) + g.fillAll (findColour (TextEditor::highlightColourId) + .withMultipliedAlpha (0.3f)); + + const String item (items [row]); + bool enabled = deviceManager.isMidiInputEnabled (item); + + const int x = getTickX(); + const float tickW = height * 0.75f; + + getLookAndFeel().drawTickBox (g, *this, x - tickW, (height - tickW) / 2, tickW, tickW, + enabled, true, true, false); + + g.setFont (height * 0.6f); + g.setColour (findColour (ListBox::textColourId, true).withMultipliedAlpha (enabled ? 1.0f : 0.6f)); + g.drawText (item, x, 0, width - x - 2, height, Justification::centredLeft, true); + } + } + + void listBoxItemClicked (int row, const MouseEvent& e) override + { + selectRow (row); + + if (e.x < getTickX()) + flipEnablement (row); + } + + void listBoxItemDoubleClicked (int row, const MouseEvent&) override + { + flipEnablement (row); + } + + void returnKeyPressed (int row) override + { + flipEnablement (row); + } + + void paint (Graphics& g) override + { + ListBox::paint (g); + + if (items.size() == 0) + { + g.setColour (Colours::grey); + g.setFont (13.0f); + g.drawText (noItemsMessage, + 0, 0, getWidth(), getHeight() / 2, + Justification::centred, true); + } + } + + int getBestHeight (const int preferredHeight) + { + const int extra = getOutlineThickness() * 2; + + return jmax (getRowHeight() * 2 + extra, + jmin (getRowHeight() * getNumRows() + extra, + preferredHeight)); + } + +private: + //============================================================================== + AudioDeviceManager& deviceManager; + const String noItemsMessage; + StringArray items; + + void flipEnablement (const int row) + { + if (isPositiveAndBelow (row, items.size())) + { + const String item (items [row]); + deviceManager.setMidiInputEnabled (item, ! deviceManager.isMidiInputEnabled (item)); + } + } + + int getTickX() const + { + return getRowHeight() + 5; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInputSelectorComponentListBox) +}; + + +//============================================================================== +struct AudioDeviceSetupDetails +{ + AudioDeviceManager* manager; + int minNumInputChannels, maxNumInputChannels; + int minNumOutputChannels, maxNumOutputChannels; + bool useStereoPairs; +}; + +static String getNoDeviceString() { return "<< " + TRANS("none") + " >>"; } + +//============================================================================== +class AudioDeviceSettingsPanel : public Component, + private ChangeListener, + private ComboBoxListener, // (can't use ComboBox::Listener due to idiotic VC2005 bug) + private ButtonListener +{ +public: + AudioDeviceSettingsPanel (AudioIODeviceType& t, AudioDeviceSetupDetails& setupDetails, + const bool hideAdvancedOptionsWithButton) + : type (t), setup (setupDetails) + { + if (hideAdvancedOptionsWithButton) + { + addAndMakeVisible (showAdvancedSettingsButton = new TextButton (TRANS("Show advanced settings..."))); + showAdvancedSettingsButton->addListener (this); + } + + type.scanForDevices(); + + setup.manager->addChangeListener (this); + } + + ~AudioDeviceSettingsPanel() + { + setup.manager->removeChangeListener (this); + } + + void resized() override + { + if (AudioDeviceSelectorComponent* parent = findParentComponentOfClass()) + { + Rectangle r (proportionOfWidth (0.35f), 0, proportionOfWidth (0.6f), 3000); + + const int maxListBoxHeight = 100; + const int h = parent->getItemHeight(); + const int space = h / 4; + + if (outputDeviceDropDown != nullptr) + { + Rectangle row (r.removeFromTop (h)); + + if (testButton != nullptr) + { + testButton->changeWidthToFitText (h); + testButton->setBounds (row.removeFromRight (testButton->getWidth())); + row.removeFromRight (space); + } + + outputDeviceDropDown->setBounds (row); + r.removeFromTop (space); + } + + if (inputDeviceDropDown != nullptr) + { + Rectangle row (r.removeFromTop (h)); + + inputLevelMeter->setBounds (row.removeFromRight (testButton != nullptr ? testButton->getWidth() : row.getWidth() / 6)); + row.removeFromRight (space); + inputDeviceDropDown->setBounds (row); + r.removeFromTop (space); + } + + if (outputChanList != nullptr) + { + outputChanList->setBounds (r.removeFromTop (outputChanList->getBestHeight (maxListBoxHeight))); + outputChanLabel->setBounds (0, outputChanList->getBounds().getCentreY() - h / 2, r.getX(), h); + r.removeFromTop (space); + } + + if (inputChanList != nullptr) + { + inputChanList->setBounds (r.removeFromTop (inputChanList->getBestHeight (maxListBoxHeight))); + inputChanLabel->setBounds (0, inputChanList->getBounds().getCentreY() - h / 2, r.getX(), h); + r.removeFromTop (space); + } + + r.removeFromTop (space * 2); + + if (showAdvancedSettingsButton != nullptr) + { + showAdvancedSettingsButton->setBounds (r.withHeight (h)); + showAdvancedSettingsButton->changeWidthToFitText(); + } + + const bool advancedSettingsVisible = showAdvancedSettingsButton == nullptr + || ! showAdvancedSettingsButton->isVisible(); + + if (sampleRateDropDown != nullptr) + { + sampleRateDropDown->setVisible (advancedSettingsVisible); + sampleRateDropDown->setBounds (r.removeFromTop (h)); + r.removeFromTop (space); + } + + if (bufferSizeDropDown != nullptr) + { + bufferSizeDropDown->setVisible (advancedSettingsVisible); + bufferSizeDropDown->setBounds (r.removeFromTop (h)); + r.removeFromTop (space); + } + + r.removeFromTop (space); + + if (showUIButton != nullptr || resetDeviceButton != nullptr) + { + Rectangle buttons (r.removeFromTop (h)); + + if (showUIButton != nullptr) + { + showUIButton->setVisible (advancedSettingsVisible); + showUIButton->changeWidthToFitText (h); + showUIButton->setBounds (buttons.removeFromLeft (showUIButton->getWidth())); + buttons.removeFromLeft (space); + } + + if (resetDeviceButton != nullptr) + { + resetDeviceButton->setVisible (advancedSettingsVisible); + resetDeviceButton->changeWidthToFitText (h); + resetDeviceButton->setBounds (buttons.removeFromLeft (resetDeviceButton->getWidth())); + } + + r.removeFromTop (space); + } + + setSize (getWidth(), r.getY()); + } + else + { + jassertfalse; + } + } + + void comboBoxChanged (ComboBox* comboBoxThatHasChanged) override + { + if (comboBoxThatHasChanged == nullptr) + return; + + AudioDeviceManager::AudioDeviceSetup config; + setup.manager->getAudioDeviceSetup (config); + String error; + + if (comboBoxThatHasChanged == outputDeviceDropDown + || comboBoxThatHasChanged == inputDeviceDropDown) + { + if (outputDeviceDropDown != nullptr) + config.outputDeviceName = outputDeviceDropDown->getSelectedId() < 0 ? String::empty + : outputDeviceDropDown->getText(); + + if (inputDeviceDropDown != nullptr) + config.inputDeviceName = inputDeviceDropDown->getSelectedId() < 0 ? String::empty + : inputDeviceDropDown->getText(); + + if (! type.hasSeparateInputsAndOutputs()) + config.inputDeviceName = config.outputDeviceName; + + if (comboBoxThatHasChanged == inputDeviceDropDown) + config.useDefaultInputChannels = true; + else + config.useDefaultOutputChannels = true; + + error = setup.manager->setAudioDeviceSetup (config, true); + + showCorrectDeviceName (inputDeviceDropDown, true); + showCorrectDeviceName (outputDeviceDropDown, false); + + updateControlPanelButton(); + resized(); + } + else if (comboBoxThatHasChanged == sampleRateDropDown) + { + if (sampleRateDropDown->getSelectedId() > 0) + { + config.sampleRate = sampleRateDropDown->getSelectedId(); + error = setup.manager->setAudioDeviceSetup (config, true); + } + } + else if (comboBoxThatHasChanged == bufferSizeDropDown) + { + if (bufferSizeDropDown->getSelectedId() > 0) + { + config.bufferSize = bufferSizeDropDown->getSelectedId(); + error = setup.manager->setAudioDeviceSetup (config, true); + } + } + + if (error.isNotEmpty()) + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + TRANS("Error when trying to open audio device!"), + error); + } + + bool showDeviceControlPanel() + { + if (AudioIODevice* const device = setup.manager->getCurrentAudioDevice()) + { + Component modalWindow (String::empty); + modalWindow.setOpaque (true); + modalWindow.addToDesktop (0); + modalWindow.enterModalState(); + + return device->showControlPanel(); + } + + return false; + } + + void buttonClicked (Button* button) override + { + if (button == showAdvancedSettingsButton) + { + showAdvancedSettingsButton->setVisible (false); + resized(); + } + else if (button == showUIButton) + { + if (showDeviceControlPanel()) + { + setup.manager->closeAudioDevice(); + setup.manager->restartLastAudioDevice(); + getTopLevelComponent()->toFront (true); + } + } + else if (button == testButton && testButton != nullptr) + { + setup.manager->playTestSound(); + } + else if (button == resetDeviceButton) + { + resetDevice(); + } + } + + void updateAllControls() + { + updateOutputsComboBox(); + updateInputsComboBox(); + + updateControlPanelButton(); + updateResetButton(); + + if (AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice()) + { + if (setup.maxNumOutputChannels > 0 + && setup.minNumOutputChannels < setup.manager->getCurrentAudioDevice()->getOutputChannelNames().size()) + { + if (outputChanList == nullptr) + { + addAndMakeVisible (outputChanList + = new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioOutputType, + TRANS ("(no audio output channels found)"))); + outputChanLabel = new Label (String::empty, TRANS("Active output channels:")); + outputChanLabel->setJustificationType (Justification::centredRight); + outputChanLabel->attachToComponent (outputChanList, true); + } + + outputChanList->refresh(); + } + else + { + outputChanLabel = nullptr; + outputChanList = nullptr; + } + + if (setup.maxNumInputChannels > 0 + && setup.minNumInputChannels < setup.manager->getCurrentAudioDevice()->getInputChannelNames().size()) + { + if (inputChanList == nullptr) + { + addAndMakeVisible (inputChanList + = new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioInputType, + TRANS("(no audio input channels found)"))); + inputChanLabel = new Label (String::empty, TRANS("Active input channels:")); + inputChanLabel->setJustificationType (Justification::centredRight); + inputChanLabel->attachToComponent (inputChanList, true); + } + + inputChanList->refresh(); + } + else + { + inputChanLabel = nullptr; + inputChanList = nullptr; + } + + updateSampleRateComboBox (currentDevice); + updateBufferSizeComboBox (currentDevice); + } + else + { + jassert (setup.manager->getCurrentAudioDevice() == nullptr); // not the correct device type! + + sampleRateLabel = nullptr; + bufferSizeLabel = nullptr; + sampleRateDropDown = nullptr; + bufferSizeDropDown = nullptr; + + if (outputDeviceDropDown != nullptr) + outputDeviceDropDown->setSelectedId (-1, dontSendNotification); + + if (inputDeviceDropDown != nullptr) + inputDeviceDropDown->setSelectedId (-1, dontSendNotification); + } + + sendLookAndFeelChange(); + resized(); + setSize (getWidth(), getLowestY() + 4); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + updateAllControls(); + } + + void resetDevice() + { + setup.manager->closeAudioDevice(); + setup.manager->restartLastAudioDevice(); + } + +private: + AudioIODeviceType& type; + const AudioDeviceSetupDetails setup; + + ScopedPointer outputDeviceDropDown, inputDeviceDropDown, sampleRateDropDown, bufferSizeDropDown; + ScopedPointer

x}GEV8}d&XP{k}Av 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%0AM!&w=Yjf1`%8cS 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 z zT8>Yfdq(VM*}f=$wIaor$d~2xDqD3UO|nDQVfoyL=G20e=FtCG+)wn?gp}2U)L{Jl z7h1-m$;n~m{ z0c+z5s$1x9nGMCQ*lx|XB=)wXI|bV6J90a~_d8~tFB`)jwA6FtMrN~>-Pow-Xzos` z&&VAr&Y^sfZ8C>XsE?&T);h@Ck>ruqezbA?Lh~3>9Y=H=e|U!S@p2&>q|I7n$ME0y zKLW+wVFLq`WxxKbY0{6TnTDtlx|YK~)C+XA_+5k6TIT!9Bjz5|3&i&VRtM1;L?@Q( zTh|6;Tt6^a+`;gAksQKa9YJm=JMSSBhFQ1w5DLSsc~dxjQ~7DR5uV8iwwse`3gY_$ z^{xUHCEaTm`?-9T}qoOd(7J3aLSP46+}%VHcP*1_Z<{2VIQ zp~erBiyul+D<95wEZZZj|47g8NHLG1tGP4K-a_vGp?|Ek9xLu~bhYO3)_HcH-19cCb>#S*#IjuU$zmLh*ftxAaU=25VmN)ykseg!W zA#b5i`p#+R&us4C=MM2=*|0XPd8f5av$neVGokV#A1yv-^EsRRhXe9G z!PbETs=pzpH_5l;^p5#C*87QdeWL#vi3civ5zYHL>sQ8G;C~8Q85dNI>oC+~RMy5x^e5NR9{~H~f6AKgk_d%C zVcvI06gJS0?^@W1-;Ma+ls_C$ZZrNiC$|uHOYgS;(l6t(Jx!)C~|MQ`&idLIFixi7;*Mvw;%ic$phFQD8GaF#|0G* z;pb4#^-#}24M)4ej~Wi&BjL_|@<@J;3ZaP`Y9B`)@0p(HdE{fDfbY(3%`PA8}9KkAvxAZK_ckBj@b@mM|~Z>=$tk6C;?Db_P` zd&b;LutZs`R_@KiDSm z9Jr@^Ix+8#2D}prKjCZ+AMy|P6dGzwT53!h^E>BvS3`9n{e{ev`5c)e7v^J8axwf$ zcbv)M8}YfR zeDPh;W^6a7i}&hiYFR>cD}L0nRR86^3fr<((^A-8+#QVXXnrShXTEkxgc5G7x*MK| zZ0(LW+JhdhEPnUPdtc5=Jd;s4t5Jz4{*H{e-leh+IokLb&u%~c{p3bA$tGUS_j8BZ zVdg93;c^@6`5YmRx|a&Rt**uQI@FKm^FMt2M~-CWII-2g;N#-^9n`k!yVs#Xw!Aau zZU?okVw@uPQ_0h;SzSzor_1B%qO(1ZbF58WOowcrOaDC2^L+7fc$JBs!-Zm9L|)AI zC33iw?xp6{$P_R0bHMSHuO_dNr#hMDwe0I;ou1~7htQeC$MuQOy203uqWYM(=j=4zU`EP*zvdxYN2G6bm1if7mm5M4r?6ebh5;%5ety7`?~oKVf_( ze=|vZVSSe8_9TffjGi(7toV4t{PX<1K)%RdOFk{*v&om_^$Pn}@0aVlvXRVE21 z;={U-U2$aIql@o&D9(r1!c%&u&Ueft-8oO@a9lXc!Xo&rMM>OctvkEL=`TSp$$qJ% zJ8JnQtN6^$GRaU}4$tQOyJ8Q1@=5n$F^f z^4nP4jl~~E4x>L@zQb{ro022=-8>meo6Bbl5^vhr$~w2Ehd(Wp_}v!ww=KQx$?f^w zQC=~xx)Zsx=Y>;^Ylf<^R5w(|t(NvlstF;-@V76$ecA749r)GC{`v>7$FsH$Vt

=TXu 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

h@{#rAq`iK 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 -E-%o;HL`jel3?Qif;ZElJ4NB%(SS? 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

-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 z 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